Warum ist die Konvertierung von WMV in MP4 so langsam?

12

Ich versuche, ein Video mit FFmpeg von WMV nach MP4 zu konvertieren, aber es dauert einige Stunden. Wenn ich versuche, es in AVI umzuwandeln, 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?

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

Antworten:

17

Stream-Kopieren

Wenn Sie anrufen -c:v:1 copy, übernimmt FFmpeg den vorhandenen Video-Bitstream und kopiert ihn per Stream . Der Video-Bitstream ist nur im externen Container gekapselt, z. B. WMV, AVI oder MP4 - Ihr tatsächlicher Video-Bitstream ist msmpeg4und bleibt so.

Wenn Sie mehr darüber erfahren möchten, wovon 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 dekodieren und neu kodieren. Der Video-Bitstream muss lediglich in einem neuen Containerformat zusammengeführt werden. Dies ist häufig eine recht einfache Operation und dauert daher nicht lange.

Codierung

Im Gegensatz dazu wird FFmpeg beim Aufrufen -vcodec libx264(oder -c:v libx264der Syntax, die Sie verwenden sollten, weil sie vcodecveraltet ist) gezwungen, den Videobitstream von msmpeg4in ein Rohformat zu dekodieren und ihn dann in x264einen H.264-Encoder weiterzuleiten.

x264 ist schnell, aber das Codieren von Videos braucht Zeit - insbesondere bei 720p-Inhalten. Und es kann mehr als eine Stunde dauern, insbesondere wenn Ihre Eingabe bereits länger als eine Stunde ist. Außerdem ist Ihre CPU möglicherweise nicht die schnellste. Dies ist der Hauptgrund, warum ältere MPEG-4 Visual-Encoder wie XviD immer noch verfügbar und sehr beliebt sind: Die Codierung dauert weniger lange als bei H.264-Codecs. Sie bieten möglicherweise nicht die beste Leistung in Bezug auf Qualität und Dateigröße, sind jedoch schnell.

Das alles gesagt: Sie können die x264-Codierung beschleunigen, indem Sie eine Voreinstellung erzwingen. Voreinstellungen sind Einstellungen für die Encoderoptimierung 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 fast out.mp4

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

Abgesehen davon können Sie nur in eine schnelle CPU investieren und sicherstellen, dass Sie einen aktuellen Build von FFmpeg mit x264-Unterstützung ausführen.

Weitere Informationen finden Sie im FFmpeg-Wiki: H.264-Codierungshandbuch .

slhck
quelle
Danke für die Antwort. Ich bin mir nicht sicher, ob ich klar war oder nicht, aber wenn ich kopiere, ist es immer noch sehr langsam. Ich habe Ihren Befehl ausprobiert und er hat nach 4 Minuten nur 4 Sekunden verarbeitet. Mein Video ist ungefähr 75 Minuten lang und die Konvertierung in AVI dauert nur 15 Minuten, aber MP4 dauert mehrere Stunden.
Giorgi
Welches ist das beste für die Codierung, libx264 oder h264?
Yohanes AI
@NPE Es gibt keinen Unterschied, da ffmpeg standardmäßig verwendet, libx264wenn Sie ´h264` als Encoder angeben.
Slhck
1
@ PeterCordes Ich habe es geändert fast. Einige interessante Statistiken (wenn VMAF hier vertrauenswürdig ist): Streaminglearningcenter.com/blogs/…
Slhck
1
@PeterCordes Es gibt einige RC-Optimierungen, die VMAF nicht gut handhabt, wie z. B. AQ: github.com/Netflix/vmaf/issues/21 . Ich bin mit dem hochwertigen 1080p vs. beschissenen UHD-Teil einverstanden. Der Autor des Blogs ist sehr offen für Vorschläge, wie er seine Tests verbessern kann. Ich habe bereits vor einiger Zeit eine Fehlkonfiguration für x265 kommentiert.
Slhck
3

Als ich (endlose Stunden) mit WMV-> MP4-Konvertierung spielte, fand ich einen superschnellen Weg, dies zu tun. Aber es hat einen Preis: einen Lagerpreis. Wenn Sie WMV in verlustfrei und dann in verlustfrei in MP4 konvertieren, wird die vollständige Konvertierung in kürzester Zeit durchgeführt. Sie benötigen jedoch 100-mal Festplattenspeicher, um die verlustfreie Version zu speichern, was schmerzhaft ist.

Es stellt sich also heraus, dass Sie zwischen sehr langsamen oder sehr HDD-intensiven Versionen der WMV-> MP4-Konvertierung wählen können und keine andere Wahl haben.

Konvertieren eines WMV in verlustfreies AVI: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Konvertieren von verlustfreiem AVI in MP4 (oder WebM, egal) ffmpeg.exe -i screen.avi screen.mp4

Super schnell!

Marcell Foti
quelle