Die Konvertierung von WMV in MP4-Dateien schlägt mit FFmpeg fehl

16993
Tim

Wenn Sie eine WMV-Datei in eine MP4-Datei konvertieren, heißt es

[mp4 @ 0x989c160] Spur 1: Tag konnte nicht gefunden werden, Codec wird derzeit nicht im Container unterstützt

und

Header für Ausgabedatei # 0 konnte nicht geschrieben werden (falsche Codec-Parameter?): Vorgang nicht zulässig.

Das Konvertieren der WMV-Datei in eine MKV-Datei ist jedoch in Ordnung. Fragen, warum?

Nachfolgend sind die Ausgaben beider Fälle aufgeführt.

Das Konvertieren von der WMV-Datei in eine MP3-Datei funktioniert nicht

$ ffmpeg -i "1.wmv" -c:v libx264 -crf 23 -c:a copy "1.mp4"  ffmpeg version git-2012-06-03-169dae8 Copyright (c) 2000-2012 the FFmpeg developers built on Jun 3 2012 09:14:54 with gcc 4.6.3 configuration: --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3 --enable-x11grab libavutil 51. 56.100 / 51. 56.100 libavcodec 54. 23.100 / 54. 23.100 libavformat 54. 6.101 / 54. 6.101 libavdevice 54. 0.100 / 54. 0.100 libavfilter 2. 77.100 / 2. 77.100 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, asf, from '1.wmv': Metadata: WMFSDKVersion : 9.00.00.3267 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 Duration: 01:40:50.70, start: 0.000000, bitrate: 2100 kb/s Stream #0:0(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, s16, 128 kb/s Stream #0:1(eng): Video: wmv3 (Main) (WMV3 / 0x33564D57), yuv420p, 640x480, 1974 kb/s, 29.97 tbr, 1k tbn, 1k tbc [buffer @ 0x98c28c0] w:640 h:480 pixfmt:yuv420p tb:1/1000 sar:0/1 sws_param:flags=2 [buffersink @ 0x9894320] No opaque field provided [libx264 @ 0x98b0ec0] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64 [libx264 @ 0x98b0ec0] profile High, level 3.0 [libx264 @ 0x98b0ec0] 264 - core 125 r2200 999b753 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 [mp4 @ 0x989c160] track 1: could not find tag, codec not currently supported in container Output #0, mp4, to '1.mp4': Metadata: WMFSDKVersion : 9.00.00.3267 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.6.101 Stream #0:0(eng): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 640x480, q=-1--1, 30k tbn, 29.97 tbc Stream #0:1(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, 128 kb/s Stream mapping: Stream #0:1 -> #0:0 (wmv3 -> libx264) Stream #0:0 -> #0:1 (copy) Could not write header for output file #0 (incorrect codec parameters ?): Operation not permitted 

Das Konvertieren von der WMV-Datei in eine MKV-Datei ist in Ordnung:

$ ffmpeg -i "1.wmv" -c:v libx264 -crf 23 -c:a copy "1.mkv"  ffmpeg version git-2012-06-03-169dae8 Copyright (c) 2000-2012 the FFmpeg developers built on Jun 3 2012 09:14:54 with gcc 4.6.3 configuration: --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3 --enable-x11grab libavutil 51. 56.100 / 51. 56.100 libavcodec 54. 23.100 / 54. 23.100 libavformat 54. 6.101 / 54. 6.101 libavdevice 54. 0.100 / 54. 0.100 libavfilter 2. 77.100 / 2. 77.100 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, asf, from '1.wmv': Metadata: WMFSDKVersion : 9.00.00.3267 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 Duration: 01:40:50.70, start: 0.000000, bitrate: 2100 kb/s Stream #0:0(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, s16, 128 kb/s Stream #0:1(eng): Video: wmv3 (Main) (WMV3 / 0x33564D57), yuv420p, 640x480, 1974 kb/s, 29.97 tbr, 1k tbn, 1k tbc File '1.mkv' already exists. Overwrite ? [y/N] y w:640 h:480 pixfmt:yuv420p tb:1/1000 sar:0/1 sws_param:flags=2 [buffersink @ 0xa0a2760] No opaque field provided [libx264 @ 0xa0b6ec0] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64 [libx264 @ 0xa0b6ec0] profile High, level 3.0 [libx264 @ 0xa0b6ec0] 264 - core 125 r2200 999b753 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, matroska, to '1.mkv': Metadata: WMFSDKVersion : 9.00.00.3267 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.6.101 Stream #0:0(eng): Video: h264, yuv420p, 640x480, q=-1--1, 1k tbn, 29.97 tbc Stream #0:1(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, 128 kb/s Stream mapping: Stream #0:1 -> #0:0 (wmv3 -> libx264) Stream #0:0 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 325 fps=106 q=29.0 size= 411kB time=00:00:09.20 bitrate= 366.0kbits/s  
5

2 Antworten auf die Frage

5
slhck

codec not currently supported in container

That's your error.

Try specifying another audio codec like with -c:a libfaac. MP4 doesn't take Windows Media Audio in its container. You have to choose a matching audio codec, like AAC. Right now all you do is try to copy the bitstream, and that fails – as indicated by the error message.

The same problem of non-matching codecs goes for other containers, although MKV is way more open to other codecs than MP4 is, therefore you can use almost any codecs within an MKV container. This does not work for MP4.

In general though, for maximum compatibility, try to stick to the most common formats for containers, e.g.

  • AVI: MPEG-4 video, MP3 audio
  • WMV: Windows Media Video and Audio
  • MKV, MOV, MP4: h.264, AAC audio (although MKV really takes anything, here the limitation is on the playback device side)
Vielen Dank! (1) Woher wissen Sie, dass es sich nicht um Video-Codec für Audio-Codec handelt? (2) Wenn "-c: ein Libfaac" angegeben wird, welche Bitrate wird dafür empfohlen? Tim vor 12 Jahren 0
Verwenden Sie als Bitrate, was Sie möchten. Ich bin sicher, "-b: ein 192k" sollte ausreichen. slhck vor 12 Jahren 0
@ Tim: Ja, es ist der Audiocodec, der für den mp4-Container falsch ist: siehe hier http://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavformat/movenc.c; hb = HEAD # l3475 und libavformat beginnt mit dem Abwärtstrend für 0.44 für die Tracks http://git.videolan.org/?p=ffmpeg.git;a=blob; hb = HEAD # 13230 akira vor 12 Jahren 0
@akira: Danke! (1) Woher wissen Sie, dass es kein Videocodec ist? (2) Sie meinen, ich sehe in Ihrem ersten Link `.audio_codec = CODEC_ID_AAC,` Was sagt es für meine Fragen? Tim vor 12 Jahren 0
@Tim: 1) weil beide Links sich auf die WAHRHEIT beziehen. das erste Link-Setup, was ffmpeg für Codecs für den mp4-Container akzeptiert: aac für Audio und entweder libx264 oder ffmpeg-mpeg4 für Video. Der zweite Link zeigt Ihnen den Ort des Codes, der die Fehlermeldung generiert, die Sie sehen, scrollen Sie ein paar Zeilen zurück und Sie sehen, wie ffmpeg mit 0 beginnt. Da Sie libx264 als Video-Codec verwenden und somit die Anforderung erfüllen Die einzige logische Schlussfolgerung für den Video-Codec lautet: Sie verwenden den falschen Audio-Codec (wma2 in Ihrem Fall statt aac). akira vor 12 Jahren 1
Sie können auch sehen, wie ffmpeg / avconv (neuer Name) welche Spuren im Ausgabecontainer enthalten sind: `Stream-Mapping: Stream # 0: 1 -> # 0: 0 (wmv3 -> libx264) Stream # 0: 0 -> # 0: 1 (Kopie) `... # 0: 1 .. das ist Spur 1, die 0-Spur ist die Videospur. akira vor 12 Jahren 0
@akira: Sagst du, dass avconv eine Ablösung von ffmpeg ist? Also ist ffmpeg nicht mehr in der Entwicklung? Tim vor 12 Jahren 0
@ Tim Nein, das stimmt nicht. Libav (das die `avconv`-Binärdatei hat) ist nur eine Gabel. Sie haben mehr oder weniger den gleichen Code. FFmpeg befindet sich noch in der aktiven Entwicklung. slhck vor 12 Jahren 0
@ Tim: Nein, das habe ich nicht gesagt. Es ist nur so, dass 'avconv' eine umgeschriebene 'Version' des 'ffmpeg'-Tools selbst ist, unter dem (aus dem' ffmpeg'-Projekt gegliederten) Dach von 'libav'. Aber völlig irrelevant für Ihr Problem, akzeptieren Sie die Antwort von slhck, weil es die Antwort ist. akira vor 12 Jahren 0
@slhck: Ich würde "mkv" aus deinem "common codecs" -Abschnitt nehmen, mkv isst einfach alles. "webm" würde dort besser passen und "mov" und "mp4" stimmen, imho. aber "mkv" isst einfach alles. akira vor 12 Jahren 0
@akira: Was bedeutet "" mkv "isst einfach alles"? Tim vor 12 Jahren 0
@slhck: Nachdem ich die wmv-Datei in die kmv-Datei konvertiert habe, kann ich sie mit `ffmpeg -i 1.kmv -c: v kopieren -c: ein libfaac -b: ein 192k 1.mp4`? Ist es viel schneller, weil es keine Dekodierung und Kodierung für den Videoteil gibt und nur dort für den Audioteil? Tim vor 12 Jahren 0
@Tim Genau - Wenn Sie den Videostream kopieren, werden Sie nicht kodiert, daher ist der Befehl viel schneller. Und ja, MKV kann * jeden * Codec verwenden, den Sie ihm zuführen, nicht wie MP4, der viele Einschränkungen hat. Siehe: [Vergleich von Containerformaten] (http://en.wikipedia.org/wiki/Comparison_of_container_formats) slhck vor 12 Jahren 0
@Tim: Wenn Sie ein gültiges ".mp4" erhalten möchten, ist es ** nicht ** schneller, Video und Audio in separaten Schritten zu kodieren. tun Sie einfach alles in einem Schritt: `ffmpeg -i input.wmv -c: v libx264 -crf 23 -c: ein libfaac -b: ein 192k out.mp4`. Ende der Geschichte. das Geschwätz darüber, was Sie in einem .mkv speichern können, ist für Ihr Problem irrelevant, wenn Sie mit einem gültigen `.mp4` enden möchten. akira vor 12 Jahren 0
@Tim Wie für die Bitrate mit Libfaac können Sie alternativ `-q: a 100` (oder einen beliebigen anderen Wert) verwenden. Dies ist ähnlich zu "faac -q 100". LordNeckbeard vor 12 Jahren 0
@LordNeckbeard: Bedeutet `-q: a` die Audioqualität? Was bedeutet "-q: a 100"? Vielen Dank! Tim vor 12 Jahren 0
@ Tim: Ja. Siehe die `-q`-Option in` man faac`. LordNeckbeard vor 12 Jahren 0
3
Justin Buser

Versuchen Sie es einfach:

ffmpeg -y -i 1.wmv -b:v 2000k 1.mp4 

ffmpeg sollte automatisch das am besten geeignete Audioformat auswählen und libx264 für das Video verwenden. Der 2000k fordert es im Wesentlichen auf, mit der gleichen Bitrate wie die Originalvideodatei zu kodieren.

Tatsächlich verwendet ffmpeg standardmäßig MPEG4 für Video in einem MP4. Sie müssen also -c: v libx264 angeben evilsoup vor 11 Jahren 0