Perché convertire WMV in MP4 è così lento?


12

Sto cercando di convertire un video da WMV a MP4 con FFmpeg, ma ci vogliono un paio d'ore. Se provo a convertirlo in AVI ci vogliono solo circa 10-15 minuti.

versione ffmpeg

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

Conversione in 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)

Conversione in MP4 con 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)

Conversione in AVI con 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)

Ci sono alcuni parametri aggiuntivi che devo passare?


Ovviamente è più veloce se stai solo copiando il bitstream - con copy, non stai ricodificando nulla. Che hardware hai, ad es. CPU? Qual è il tuo sistema operativo e quale versione di FFmpeg è quella?
slhck,

@slhck: il computer non è molto veloce E5400 2.7GHz ma perché è lento per mp4 mentre è veloce per avi?
Giorgi,

Non vedo alcun output AVI nella tua domanda. Potresti aggiornarlo con l'output completo?
slhck,

@slhck: aggiunto avi output
Giorgi

Risposte:


17

Streaming di copie

Quando chiami -c:v:1 copy, FFmpeg prenderà il flusso di video esistente e lo riprodurrà in streaming . Il bitstream video è semplicemente incapsulato nel contenitore esterno, ad es. WMV, AVI o MP4 - il tuo bitstream video reale è msmpeg4e rimarrà così.

Se vuoi sapere di più di cosa sto parlando, vedi qui: Cos'è un Codec (ad es. DivX?) E in cosa differisce da un formato di file (ad es. MPG)?

Quando si copia il bitstream, FFmpeg non ha bisogno di decodificare e ricodificare effettivamente il video reale. Deve solo unire il bitstream del video in un nuovo formato contenitore, che è spesso un'operazione piuttosto semplice e quindi non richiede molto tempo.

Codifica

Al contrario, se chiami -vcodec libx264(o -c:v libx264, la sintassi che dovresti usare perché vcodecè deprecata), FFmpeg sarà costretto a decodificare il bitstream del video da msmpeg4un formato non elaborato, quindi collegarlo a x264un codificatore H.264.

x264 è veloce, ma comunque, la codifica dei video richiede tempo, soprattutto quando si tratta di contenuti a 720p. E potrebbe richiedere più di un'ora, soprattutto se l'input è già più lungo di un'ora. Inoltre, la tua CPU potrebbe non essere la più veloce. Questo è il motivo principale per cui i vecchi codificatori visivi MPEG-4 come XviD sono ancora in circolazione e molto popolari: impiegano meno tempo a codificare rispetto ai codec H.264. Potrebbero non offrire le migliori prestazioni in termini di qualità rispetto alle dimensioni del file, ma sono veloci.

Detto questo: puoi velocizzare la codifica x264 forzando un preset. Le preimpostazioni sono impostazioni di ottimizzazione dell'encoder e vanno da: ultraveloce, superveloce, molto veloce, più veloce, veloce, medio, lento, più lento, veryslow. Il tuo comando potrebbe quindi apparire così:

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

Dovrebbe funzionare più velocemente che senza il preset. L'unico inconveniente è che non raggiunge una buona qualità con gli stessi tassi di compressione rispetto, ad esempio, a -preset veryslow.

A parte questo, non c'è molto che puoi fare se non per investire in una CPU veloce e assicurarti di eseguire una build recente di FFmpeg con supporto x264.

Per maggiori informazioni vedi FFmpeg Wiki: H.264 Encoding Guide .


Grazie per la risposta. Non sono sicuro di essere stato chiaro o no, ma se uso copia è ancora molto lento. Ho provato il tuo comando ed è stato elaborato solo 4 secondi dopo 5 minuti. Il mio video dura circa 75 minuti e la conversione in avi richiede solo 15 minuti, ma mp4 impiega diverse ore.
Giorgi,

quindi qual è il migliore per la codifica, libx264 o h264?
Yohanes AI,

@NPE Non c'è alcuna differenza come ffmpeg usa di default libx264quando si specifica ´h264` come encoder.
Slhck,

1
@PeterCordes L'ho cambiato in fast. Alcune statistiche interessanti (se VMAF può essere considerato attendibile qui): streaminglearningcenter.com/blogs/…
slhck

1
@PeterCordes Ci sono alcune ottimizzazioni RC che VMAF non gestisce bene come AQ: github.com/Netflix/vmaf/issues/21 . Sono d'accordo con la parte UHD di alta qualità 1080p vs schifosa. L'autore del blog è molto aperto a suggerimenti su come migliorare i suoi test; Ho già commentato qualche errore di configurazione per x265 qualche tempo fa.
slhck

3

Mentre stavo giocando (ore infinite) con la conversione WMV-> MP4, ho trovato un modo superveloce per farlo. Ma ha un prezzo: un prezzo di archiviazione. Se converti WMV in lossless, quindi da lossless in MP4, esegue la conversione completa in pochissimo tempo. Ma hai bisogno di 100 volte lo spazio su disco fisso per memorizzare la versione senza perdita di dati, il che è doloroso.

Quindi risulta che puoi scegliere tra versioni molto lente o molto HDD di conversione WMV-> MP4 e non hai altra scelta.

Conversione di un WMV in AVI senza perdita di dati: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Quindi conversione di AVI senza perdita di dati in MP4 (o WebM, non importa) ffmpeg.exe -i screen.avi screen.mp4

Super veloce!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.