Warum ist die Konvertierung von WMV zu MP4 so langsam?

20022
Giorgi

Ich versuche, ein Video von WMV in MP4 mit FFmpeg zu konvertieren, aber es dauert einige Stunden. Wenn ich versuche, es in AVI zu konvertieren, dauert es nur etwa 10-15 Minuten.

ffmpeg-Version

ffmpeg version N-43206-gf857465 built on Aug 4 2012 16:10:39 with gcc 4.7.1 (GCC) 

Umstellung auf MP4

ffmpeg -i input.wmv -vcodec libx264 output.mp4  libavutil 51. 66.100 / 51. 66.100 libavcodec 54. 49.100 / 54. 49.100 libavformat 54. 22.100 / 54. 22.100 libavdevice 54. 2.100 / 54. 2.100 libavfilter 3. 5.102 / 3. 5.102 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 Input #0, asf, from 'input.wmv': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr, 1k tbn, 1k tbc [libx264 @ 03427620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac he64 [libx264 @ 03427620] profile High, level 3.1 [libx264 @ 03427620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i nterlaced=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=15 scenec ut=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, mp4, to 'output.mp4': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1-- 1, 15 tbn, 15 tbc Stream mapping: Stream #0:0 -> #0:0 (msmpeg4 -> libx264) 

Umstellung auf MP4 mit copy

ffmpeg -i input.wmv -c:v:1 copy output.mp4  libavutil 51. 66.100 / 51. 66.100 libavcodec 54. 49.100 / 54. 49.100 libavformat 54. 22.100 / 54. 22.100 libavdevice 54. 2.100 / 54. 2.100 libavfilter 3. 5.102 / 3. 5.102 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 Input #0, asf, from 'input.wmv': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr, 1k tbn, 1k tbc [libx264 @ 03437620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac he64 [libx264 @ 03437620] profile High, level 3.1 [libx264 @ 03437620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i nterlaced=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=15 scenec ut=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, mp4, to 'output.mp4': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1-- 1, 15 tbn, 15 tbc Stream mapping: Stream #0:0 -> #0:0 (msmpeg4 -> libx264) 

Umstellung auf AVI mit copy

ffmpeg -i input.wmv -c:v:1 copy output.avi  Input #0, asf, from 'input.wmv': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.22.100 Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr, 1k tbn, 1k tbc Output #0, avi, to 'output.avi': Metadata: WMFSDKVersion : 12.0.7601.17514 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 ISFT : Lavf54.22.100 Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 20 0 kb/s, 15 tbn, 15 tbc Stream mapping: Stream #0:0 -> #0:0 (msmpeg4 -> mpeg4) 

Gibt es einige zusätzliche Parameter, die ich übergeben muss?

10
Natürlich ist es schneller, wenn Sie nur den Bitstream kopieren - mit "copy" kodieren Sie nichts neu. Welche Hardware hast du zB CPU? Was ist Ihr Betriebssystem und welche Version von FFmpeg ist das? slhck vor 11 Jahren 0
@slhck: Der Computer ist nicht sehr schnell E5400 2.7GHz, aber warum ist er langsam für mp4, während er für avi schnell ist? Giorgi vor 11 Jahren 0
Ich sehe keine AVI-Ausgabe in Ihrer Frage. Könnten Sie es mit der vollen Ausgabe aktualisieren? slhck vor 11 Jahren 0
@slhck: Avi-Ausgabe hinzugefügt Giorgi vor 11 Jahren 0

2 Antworten auf die Frage

16
slhck

Kopieren von Streams

Wenn Sie anrufen -c:v:1 copy, nimmt FFmpeg den vorhandenen Video-Bitstream und kopiert diesen Stream . Der Video-Bitstream ist nur im externen Container eingeschlossen, z. B. WMV, AVI oder MP4 - Ihr eigentlicher Video-Bitstream ist msmpeg4und bleibt so.

Wenn Sie mehr darüber erfahren möchten, worüber ich spreche, lesen Sie hier: Was ist ein Codec (z. B. DivX?) Und wie unterscheidet er sich von einem Dateiformat (z. B. MPG)?

Beim Kopieren des Bitstroms muss FFmpeg das eigentliche Video nicht wirklich decodieren und erneut codieren. Es muss lediglich der Video-Bitstrom in ein neues Containerformat zusammengeführt werden. Dies ist häufig eine recht einfache Operation und dauert daher nicht lange.

Codierung

Im Gegensatz dazu wird FFmpeg beim Aufruf -vcodec libx264(oder -c:v libx264der Syntax, die Sie verwenden sollten, weil vcodeces veraltet ist) gezwungen, den Video-Bitstream msmpeg4in ein Rohformat zu decodieren und dann in x264einen H.264-Encoder zu leiten.

x264 ist zwar schnell, aber das Kodieren von Videos benötigt Zeit - insbesondere, wenn es sich um 720p-Inhalte handelt. Es kann mehr als eine Stunde dauern, insbesondere wenn Ihre Eingabe bereits länger als eine Stunde dauert. Außerdem ist Ihre CPU möglicherweise nicht die schnellste. Dies ist der Hauptgrund, warum ältere MPEG-4 Visual Encoder wie XviD immer noch in der Nähe sind und sehr beliebt sind: Sie benötigen weniger Zeit zum Codieren als H.264-Codecs. Sie bieten möglicherweise nicht die beste Leistung in Bezug auf die Qualität im Vergleich zur Dateigröße, sind aber schnell.

Das alles wird gesagt: Sie können die x264-Kodierung beschleunigen, indem Sie eine Voreinstellung erzwingen. Presets sind Encoder-Optimierungseinstellungen und reichen von: ultraschnell, superschnell, sehr schnell, schneller, schnell, mittel, langsam, langsamer, sehr langsam. Ihr Befehl könnte dann so aussehen:

ffmpeg -i input.wmv -c:v libx264 -preset ultrafast out.mp4 

Es sollte schneller laufen als ohne Preset. Der einzige Nachteil ist, dass es bei gleichen Kompressionsraten im Vergleich zu beispielsweise nicht so gute Qualität erzielt -preset veryslow.

Abgesehen davon können Sie nicht viel tun, außer in eine schnelle CPU zu investieren und sicherzustellen, dass Sie eine aktuelle Version von FFmpeg mit x264-Unterstützung ausführen.

Weitere Informationen finden Sie im FFmpeg Wiki: H.264 Encoding Guide .

Danke für die Antwort. Ich bin nicht sicher, ob ich klar war oder nicht, aber wenn ich die Kopie verwende, ist sie immer noch sehr langsam. Ich habe Ihren Befehl ausprobiert und nach 5 Minuten nur 4 Sekunden verarbeitet. Mein Video ist etwa 75 Minuten lang und das Konvertieren in avi dauert nur 15 Minuten, während mp4 mehrere Stunden dauert. Giorgi vor 11 Jahren 0
also welches ist das beste für die Kodierung, libx264 oder h264? Yohanes AI vor 5 Jahren 0
@NPE Es gibt keinen Unterschied, da ffmpeg standardmäßig `libx264` verwendet, wenn Sie ´h264` als Encoder angeben. slhck vor 5 Jahren 0
@slhck Wenn ich versuche, diesen Parameter zu verwenden, dauert '-y -i fileSource -s 1920x1080 -vcodec libx264 crf 20 fileOutput` mehr als eine Stunde. Um dies zu beschleunigen, welchen Empfehlungsparameter sollte ich basierend auf Ihrer Erfahrung hinzufügen? Ist der Parameter "-preset fast" ausreichend? Yohanes AI vor 5 Jahren 0
@NPE Der einzige Weg, um es schneller zu machen (mit der gleichen Hardware), besteht darin, ein schnelleres Preset zu verwenden, ja, zB `-preset schneller '. slhck vor 5 Jahren 0
@slhck Ist es möglich, Multithread zu verwenden oder, falls möglich, eine Grafikkarte, um es schneller zu machen? Yohanes AI vor 5 Jahren 0
@NPE Multithreading ist bereits aktiviert, die Codierung kann jedoch nicht einfach parallelisiert werden. Es stehen mehrere hardwarebeschleunigte Encoder zur Verfügung, siehe https://trac.ffmpeg.org/wiki/HWAccelIntro. Am einfachsten wäre NVIDIA. slhck vor 5 Jahren 0
2
Marcell Foti

AS I was playing (endless hours) with WMV->MP4 conversion, I found a superfast way to do it. But it has a price: a storage price. If you convert WMV to lossless, then from lossless to MP4, it does the full conversion in no time. But you need 100 times HDD space to store the lossless version, which is painful.

So it turns out you can chose from very slow or very HDD intensive versions of WMV->MP4 conversion and you have no other choice.

Converting a WMV to lossless AVI: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Then converting lossless AVI to MP4 (or WebM, it doesn't matter) ffmpeg.exe -i screen.avi screen.mp4

Superfast!