Use as configurações DivX para codificar para mp4 com ffmpeg

Use as configurações DivX para codificar para mp4 com ffmpeg

Estou acostumado a usar o VirtualDub para codificar um vídeo em um contêiner AVI com codec DivX (e MP3 para áudio). Agora estou planejando usar o ffmpeg para codificar vídeos em um contêiner MP4 com o codec h264. O que descobri é que preciso usar a libx264 e uma dessas predefinições para fazer qualquer coisa funcionar. No entanto, estou surpreso com a taxa de bits de vídeo que o ffmpeg usa para codificação.

O que tenho atualmente é este pequeno arquivo em lote:

@ECHO OFF

SETLOCAL

SET IN=source.avs
SET FFMPEG_PATH=C:\Program Files (x86)\ffmpeg
SET PRESET=-fpre "%FFMPEG_PATH%\presets\libx264-lossless_slow.ffpreset" 
SET AUDIO=-acodec libmp3lame -ab 128000
SET VIDEO=-vcodec libx264 -vb 1978000

"%FFMPEG_PATH%\ffmpeg.exe" -i %IN% %AUDIO% %VIDEO% %PRESET% test.mp4

ENDLOCAL

Com isso eu digo ao ffmpeg para usar 1978k como taxa de bits, mas o ffmpeg usa 15000k+! Tentei outras predefinições, mas elas não usam minha taxa de bits especificada. Aqui estão as predefinições que tenho:

  • libx264-baseline.ffpreset
  • libx264-ipod320.ffpreset
  • libx264-ipod640.ffpreset
  • libx264-lossless_fast.ffpreset
  • libx264-lossless_max.ffpreset
  • libx264-lossless_medium.ffpreset
  • libx264-lossless_slow.ffpreset
  • libx264-lossless_slower.ffpreset
  • libx264-lossless_ultrafast.ffpreset

versão do ffmpeg:

FFmpeg git-N-29181-ga304071
libavutil    50. 40. 1 / 50. 40. 1
libavcodec   52.120. 0 / 52.120. 0
libavformat  52.108. 0 / 52.108. 0
libavdevice  52.  4. 0 / 52.  4. 0
libavfilter   1. 79. 0 /  1. 79. 0
libswscale    0. 13. 0 /  0. 13. 0

Observe que não uso a versão mais recente, pois ela apresenta problemas com espaços nos nomes de arquivos.

Aqui está o que parece ser a lista completa de parâmetros que o DivX 6.9.2 usa:

-bvnn 1978000 -vbv 218691200,100663296,100663296 -dir "C:\Users\sjngm\AppData\Roaming\DivX\DivX Codec" -w -b 1 -use_presets=1 -preset=10 -windowed_fullsearch=2 -thread_delay=1

Quais parâmetros de linha de comando seriam para o ffmpeg?


EDITAR:

Seguindo a sugestão do slhck, tentei uma nova versão de 32 bits. Não tenho ideia se é 0,9 ou mais recente, não consigo encontrar essa informação.

ffmpeg version N-36890-g67f5650
libavutil      51. 34.100 / 51. 34.100
libavcodec     53. 56.105 / 53. 56.105
libavformat    53. 30.100 / 53. 30.100
libavdevice    53.  4.100 / 53.  4.100
libavfilter     2. 59.100 /  2. 59.100
libswscale      2.  1.100 /  2.  1.100
libswresample   0.  6.100 /  0.  6.100
libpostproc    51.  2.100 / 51.  2.100

Reformulei meu arquivo em lote para ficar assim (curiosamente, não consigo encontrar o parâmetro -vprofilena documentação):

@ECHO OFF

SETLOCAL

SET IN=VTS_01_1.avs
SET FFMPEG_PATH=C:\Program Files (x86)\ffmpeg
SET PRESET=-vprofile high -preset veryslow
SET AUDIO=-acodec libmp3lame -ab 128000
SET VIDEO=-vcodec libx264 -vb 1978000

"%FFMPEG_PATH%\ffmpeg.exe" -i %IN% %AUDIO% %PRESET% %VIDEO% test.mp4

ENDLOCAL

Vejo que agora ele usa a taxa de bits corretamente (graças ao LongNeckbeard por apontar que o material sem perdas ignora a taxa de bits!).

Caso você esteja se perguntando como criei o 1978000, estou usando esta fórmula que achei válida para arquivos DivX (suponho que a taxa de bits não mudará muito para h264):

width * height * 25 * 0.22 / 1000

Não tenho certeza se 0,22 se correlaciona de alguma forma com o CRF.

No geral, esqueci de dizer que usarei um cenário de duas passagens, por isso não uso o CRF aqui. Vou tentar ler mais sobre isso. Atualmente estou apenas tentando fazer algo rodar que me mostre que estou fazendo algo certo (ffmpeg não é a ferramenta mais fácil de entender;)).

C:\Program Files (x86)\ffmpeg\ffmpeg.exe" -i VTS_01_1.avs -acodec libmp3lame -ab 128000 -vcodec libx264 -vb 1978000 -vprofile high -preset veryslow test.mp4

A saída é agora:

ffmpeg version N-36890-g67f5650 Copyright (c) 2000-2012 the FFmpeg developers
  built on Jan 16 2012 21:57:13 with gcc 4.6.2
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      51. 34.100 / 51. 34.100
  libavcodec     53. 56.105 / 53. 56.105
  libavformat    53. 30.100 / 53. 30.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 59.100 /  2. 59.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    51.  2.100 / 51.  2.100
Input #0, avs, from 'VTS_01_1.avs':
  Duration: 00:58:46.12, start: 0.000000, bitrate: 0 kb/s
    Stream #0:0: Video: rawvideo (YV12 / 0x32315659), yuv420p, 576x448, 77414 kb/s, 25 tbr, 25 tbn, 25 tbc
    Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 2 channels, s16, 1536 kb/s
File 'test.mp4' already exists. Overwrite ? [y/N] y
w:576 h:448 pixfmt:yuv420p tb:1/1000000 sar:0/1 sws_param:
[libx264 @ 05A2C400] using cpu capabilities: MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
[libx264 @ 05A2C400] profile High, level 3.1
[libx264 @ 05A2C400] 264 - core 120 r2120 0c7dab9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=16 deblock=1:0:0 analyse=0x3:0x133 me=umh subme=10 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=24 chroma_me=1 trellis=2 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=8 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=60 rc=abr mbtree=1 bitrate=1978 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'test.mp4':
  Metadata:
    encoder         : Lavf53.30.100
    Stream #0:0: Video: h264 (![0][0][0] / 0x0021), yuv420p, 576x448, q=-1--1, 1978 kb/s, 25 tbn, 25 tbc
    Stream #0:1: Audio: mp3 (i[0][0][0] / 0x0069), 48000 Hz, 2 channels, s16, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo -> libx264)
  Stream #0:1 -> #0:1 (pcm_s16le -> libmp3lame)
Press [q] to stop, [?] for help
frame=    0 fps=  0 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=    0 fps=  0 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=    0 fps=  0 q=0.0 size=       0kB time=00:00:00.00 bitrate=   0.0kbits/s
frame=    3 fps=  1 q=22.0 size=      39kB time=00:00:00.04 bitrate=8063.8kbits/
frame=    8 fps=  2 q=22.0 size=      82kB time=00:00:00.24 bitrate=2801.3kbits/
frame=   13 fps=  3 q=23.0 size=     120kB time=00:00:00.44 bitrate=2229.5kbits/
frame=   16 fps=  4 q=23.0 size=     147kB time=00:00:00.56 bitrate=2156.7kbits/
frame=   20 fps=  4 q=22.0 size=     175kB time=00:00:00.72 bitrate=1987.4kbits/
:
video:4387kB audio:273kB global headers:0kB muxing overhead 0.260038%
[libx264 @ 05A2C400] frame I:2     Avg QP:19.53  size: 29850
[libx264 @ 05A2C400] frame P:76    Avg QP:22.24  size: 19541
[libx264 @ 05A2C400] frame B:359   Avg QP:25.93  size:  8210
[libx264 @ 05A2C400] consecutive B-frames:  0.5%  0.5%  0.0%  8.2% 17.2% 52.2% 16.0%  5.5%  0.0%
[libx264 @ 05A2C400] mb I  I16..4:  5.4% 75.3% 19.3%
[libx264 @ 05A2C400] mb P  I16..4:  1.3% 16.5%  2.2%  P16..4: 36.3% 28.6% 12.7% 1.8%  0.2%    skip: 0.4%
[libx264 @ 05A2C400] mb B  I16..4:  0.4%  3.8%  0.3%  B16..8: 40.0% 18.4%  4.7% direct:18.5%  skip:13.9%  L0:45.4% L1:38.1% BI:16.5%
[libx264 @ 05A2C400] final ratefactor: 20.35
[libx264 @ 05A2C400] 8x8 transform intra:83.1% inter:68.5%
[libx264 @ 05A2C400] direct mvs  spatial:99.2% temporal:0.8%
[libx264 @ 05A2C400] coded y,uvDC,uvAC intra: 64.9% 83.4% 49.2% inter: 49.0% 50.4% 4.4%
[libx264 @ 05A2C400] i16 v,h,dc,p: 25% 22% 27% 26%
[libx264 @ 05A2C400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10%  7% 23%  9% 10% 10% 10%10% 13%
[libx264 @ 05A2C400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 12% 11% 13%  9% 12% 11% 10% 9% 12%
[libx264 @ 05A2C400] i8c dc,h,v,p: 42% 28% 16% 14%
[libx264 @ 05A2C400] Weighted P-Frames: Y:18.4% UV:7.9%
[libx264 @ 05A2C400] ref P L0: 29.1% 11.3% 15.7%  7.3%  6.9%  4.9%  5.1%  3.4%3.9%  2.7%  2.8%  1.8%  1.7%  1.2%  1.4%  0.9%
[libx264 @ 05A2C400] ref B L0: 68.8% 11.4%  5.5%  2.9%  2.3%  1.9%  1.5%  1.1%1.1%  1.0%  0.9%  0.7%  0.5%  0.3%  0.1%
[libx264 @ 05A2C400] ref B L1: 91.9%  8.1%
[libx264 @ 05A2C400] kb/s:2055.88

No que me diz respeito, não me parece tão ruim.

Responder1

Você deve primeiro atualizar para pelo menos FFmpeg 0.9. vprenão é mais recomendado para ser usado para controle predefinido. É por isso que os ffpresetarquivos foram removidos das versões mais recentes. O controle predefinido para libx264 agora acontece através do próprio x264, não através do FFmpeg.

Dito isto, definir uma taxa de bits média para x264 é opior modo de controle de taxahá. Em vez de uma taxa de bits média, você deve considerar o uso da codificação de duas passagens se estiver almejando um tamanho de arquivo de saída específico ou definindo umFator de taxa constante(CRF) se você se preocupa apenas em alcançar uma qualidade específica. Em caso de dúvida, use CRF.


Geralmente, você deseja a seguinte sintaxe para usar FFmpeg e x264:

ffmpeg -i in.mp4 -vcodec libx264 <options> out.mp4

… com as seguintes opções não obrigatórias. É importante especificá-los antes da saída e depois da vcodectroca. Esses são apenas alguns (veja também omapeamento de opçõespara mais):

  • -vprofile: Defina restrições de perfil h.264, por exemplo baseline, , main,high

  • -preset: defina uma predefinição de codificação, que geralmente permite estratégias de otimização. Você pode escolher entre veryslow, slow, fast, ultrafaste muito mais. Predefinições mais lentas resultam em melhor compactação ao custo de codificação mais lenta. Você geralmente usa a predefinição mais lenta para a qual tem paciência.

  • -tune: Defina um fator de sintonia especial, por exemplo, para filmes:film

  • -b: Defina a taxa de bits. Como já foi dito, isso não é realmente o que você deseja com uma codificação de passagem única, mas se for necessário, isso deve funcionar. Os valores possíveis estão em bits, ou melhor 500K, 1M, etc.

  • -crf: Defina a qualidade. Mutuamente exclusivo com -b. Um bom valor inicial é 24. Um valor mais baixo significa qualidade superior. Use o valor mais alto que ainda lhe pareça bom.


Exemplo de duas passagens, vídeo H.264, áudio AAC em MP4:

ffmpeg -i input -c:v libx264 -preset slow -b:v 500k -pass 1 -an -f mp4 -y NUL
ffmpeg -i input -c:v libx264 -preset slow -b:v 500k -pass 2 -c:a libfaac -b:a 128k output.mp4

Exemplo CRF, vídeo H.264, áudio MP3 em MKV:

ffmpeg -i input -c:v libx264 -preset medium -crf 24 -c:a libmp3lame -q:a 4 output.mkv

informação relacionada