Por que a conversão de WMV para MP4 é tão lenta?


12

Estou tentando converter um vídeo de WMV para MP4 com FFmpeg, mas leva algumas horas. Se eu tentar convertê-lo para AVI, leva apenas 10 a 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?


É claro que é mais rápido se você estiver apenas copiando o fluxo de bits - com copy, você não está recodificando nada. Qual hardware você possui, por exemplo, CPU? Qual é o seu sistema operacional e qual versão do FFmpeg é essa?
slhck

@slhck: O computador não é muito rápido E5400 2.7GHz, mas por que é lento para mp4 enquanto é rápido para avi?
Giorgi

Não vejo nenhuma saída AVI na sua pergunta. Você poderia atualizá-lo com a saída completa?
slhck

@slhck: saída avi adicionada
Giorgi

Respostas:


17

Cópia em sequência

Quando você liga -c:v:1 copy, o FFmpeg pega o fluxo de bits do vídeo existente e o copia . O fluxo de bits de vídeo é apenas encapsulado no contêiner externo, por exemplo, WMV, AVI ou MP4 - seu fluxo de bits de vídeo real é msmpeg4e permanecerá assim.

Se você quiser saber mais sobre o que estou falando, consulte 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 decodificar e recodificar o vídeo real. Ele só precisa mesclar o fluxo de bits de vídeo em um novo formato de contêiner, que geralmente é uma operação bastante simples e, portanto, não leva muito tempo.

Codificação

Em contraste com isso, se você chamar -vcodec libx264(ou -c:v libx264a sintaxe que você deve usar porque vcodecestá obsoleta), o FFmpeg será forçado a decodificar o fluxo de bits do vídeo msmpeg4para um formato bruto e canalizá-lo para x264um codificador H.264.

O x264 é rápido, mas ainda assim, a codificação do vídeo leva tempo - especialmente quando se trata de conteúdo em 720p. E 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 codificadores visuais MPEG-4 mais antigos, como o XviD, ainda estão presentes 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 versus tamanho do arquivo, mas são rápidos.

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, mais rápido, rápido, médio, lento, mais lento, muito lento. Seu comando pode ficar assim:

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

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

Além disso, não há muito o que fazer, exceto investir em uma CPU rápida e garantir que você esteja executando uma compilação recente do FFmpeg com suporte a x264.

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


Obrigado pela resposta. Não tenho certeza se fui claro ou não, mas se eu uso copiar, ainda é muito lento. Eu tentei o seu comando e ele processou apenas 4 segundos após 5 minutos. Meu vídeo tem cerca de 75 minutos e a conversão para avi leva apenas 15 minutos, mas o mp4 leva várias horas.
Giorgi

então qual é o melhor para codificação, libx264 ou h264?
Yohanes AI

@NPE Não há diferença, pois o ffmpeg usa por padrão libx264quando você especifica 'h264` como o codificador.
slhck

1
@ PeterCordes eu mudei para fast. Algumas estatísticas interessantes (se o VMAF puder ser confiável aqui): streaminglearningcenter.com/blogs/…
slhck 14/03/19

1
@PeterCordes Existem algumas otimizações de RC que o VMAF não suporta bem como AQ: github.com/Netflix/vmaf/issues/21 . Eu concordo com a parte UHD de 1080p vs. de baixa qualidade de alta qualidade. O autor do blog é muito aberto a sugestões sobre como melhorar seus testes; Já comentei alguma configuração incorreta do x265 há um tempo atrás.
slhck

3

Como eu estava tocando (horas sem fim) com a conversão WMV-> MP4, encontrei uma maneira super rápida de fazer isso. Mas tem um preço: um preço de armazenamento. Se você converter WMV para sem perdas, depois de sem perdas para MP4, ele fará a conversão completa em pouco tempo. Mas você precisa de 100 vezes o espaço no disco rígido para armazenar a versão sem perdas, o que é doloroso.

Acontece que você pode escolher entre versões muito lentas ou muito intensivas em HDD da conversão WMV-> MP4 e você não tem outra escolha.

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

Super rápido!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.