Por que converter WMV para MP4 é tão lento?

10

Estou tentando converter um vídeo do WMV para o MP4 com o FFmpeg, mas isso leva algumas horas. Se eu tentar convertê-lo para AVI, levará apenas 10-15 minutos.

versão ffmpeg

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

Conversão para 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)

Conversão para MP4 com 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)

Conversão para AVI com 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)

Existem alguns parâmetros adicionais que eu preciso passar?

    
por Giorgi 10.08.2012 / 09:47

2 respostas

16

Cópia em fluxo

Quando você chamar -c:v:1 copy , o FFmpeg usará o bitstream de vídeo existente e a cópia de fluxo . O fluxo de bits de video é apenas encapsulado no recipiente exterior, e. WMV, AVI ou MP4 - seu bitstream de vídeo real é msmpeg4 e permanecerá assim.

Se você quiser saber mais sobre o que eu estou falando, veja aqui: O que é um codec (por exemplo, DivX?) e como ele difere de um formato de arquivo (por exemplo, MPG)?

Ao copiar o fluxo de bits, o FFmpeg não precisa realmente decodificar e recodificar o vídeo real. Ele só precisa mesclar o fluxo de bits do vídeo em um novo formato de contêiner, que geralmente é uma operação bastante simples e, portanto, não demora muito.

Codificação

Em contrapartida, se você chamar -vcodec libx264 (ou -c:v libx264 , a sintaxe que você deve usar porque vcodec foi preterido), o FFmpeg será forçado a decodificar o fluxo de bits de vídeo de msmpeg4 para um formato bruto , em seguida, canalize-o em x264 , um codificador H.264.

O x264 é rápido, mas ainda assim, a codificação de vídeo leva tempo, especialmente quando é um conteúdo de 720p. E isso pode levar mais de uma hora, especialmente se sua entrada já tiver mais de uma hora. Além disso, sua CPU pode não ser a mais rápida. Esta é a principal razão pela qual os codificadores MPEG-4 Visual mais antigos, como o XviD, ainda estão por aí e são muito populares: eles levam menos tempo para codificar do que os codecs H.264. Eles podem não oferecer o melhor desempenho em termos de qualidade x tamanho de arquivo, mas são rápidos.

Isso tudo dito: você pode acelerar a codificação x264, forçando uma predefinição. As predefinições são configurações de otimização do codificador e variam de: ultra rápido, super rápido, muito rápido, rápido, médio, lento, mais lento, mais baixo. Seu comando poderia ficar assim:

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

Ele deve ser executado mais rápido do que sem a predefinição. A única desvantagem é que ela não alcança uma qualidade tão boa para as mesmas taxas de compactação em comparação com, por exemplo, -preset veryslow .

Além disso, não há muito que você possa fazer além de investir em uma CPU veloz e ter certeza de que está executando uma versão recente do FFmpeg com suporte a x264.

Para mais informações, consulte FFmpeg Wiki: Guia de codificação H.264 .

    
por 10.08.2012 / 11:37
2

Como eu estava jogando (horas intermináveis) com a conversão WMV- > MP4, encontrei uma maneira super rápida de fazê-lo. Mas tem um preço: um preço de armazenamento. Se você converter WMV para lossless, então de lossless para MP4, ele faz a conversão completa em nenhum momento. Mas você precisa de 100 vezes de espaço em HD para armazenar a versão sem perdas, o que é doloroso.

Por isso, é possível escolher entre versões muito lentas ou muito intensivas em HDD de conversão WMV e MP4 e você não tem outra opção.

Convertendo um WMV para o AVI sem perda:     ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Em seguida, converter sem perdas AVI para MP4 (ou WebM, não importa)     ffmpeg.exe -i screen.avi screen.mp4

Super rápido!

    
por 07.05.2013 / 23:33