![Используйте настройки DivX для кодирования в mp4 с помощью ffmpeg](https://rvso.com/image/1302234/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B9%D1%82%D0%B5%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8%20DivX%20%D0%B4%D0%BB%D1%8F%20%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%20mp4%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20ffmpeg.png)
Я привык использовать VirtualDub для кодирования видео в контейнер AVI с кодеком DivX (и MP3 для аудио). Теперь я планирую использовать ffmpeg для кодирования видео в контейнер MP4 с кодеком h264. Я понял, что мне нужно использовать libx264 и один из этих пресетов, чтобы что-то заработало. Однако я поражен битрейтом видео, который ffmpeg использует для кодирования.
На данный момент у меня есть вот такой небольшой пакетный файл:
@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
Этим я говорю ffmpeg использовать 1978k в качестве битрейта, но ffmpeg использует 15000k+! Я пробовал другие пресеты, но они не используют указанный мной битрейт. Вот пресеты, которые у меня есть:
- 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
версия 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
Обратите внимание, что я не использую последнюю версию, так как в ней есть проблемы с пробелами в именах файлов.
Вот, по-видимому, полный список параметров, используемых в DivX 6.9.2:
-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
Какие параметры командной строки это будут для ffmpeg?
РЕДАКТИРОВАТЬ:
Следуя совету slhck, я попробовал новую 32-битную версию. Понятия не имею, 0.9 это или новее, я не могу найти эту информацию.
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
Я переработал свой пакетный файл, чтобы он выглядел следующим образом (что интересно, я не могу найти параметр -vprofile
в документации):
@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
Я вижу, что теперь битрейт используется правильно (спасибо LongNeckbeard за указание на то, что lossless-stuff игнорирует битрейт!).
На всякий случай, если вам интересно, как я пришел к числу 1978000, я использую эту формулу, которую считаю подходящей для файлов DivX (предполагаю, что битрейт не сильно изменится для h264):
width * height * 25 * 0.22 / 1000
Я не уверен, что 0,22 как-то коррелирует с CRF.
В целом я забыл сказать, что буду использовать двухпроходный сценарий, поэтому я не использую CRF здесь. Я постараюсь почитать об этом больше. В настоящее время я просто пытаюсь запустить что-то, что покажет мне, что я делаю что-то правильно (ffmpeg — не самый простой инструмент для понимания ;)).
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
Теперь вывод такой:
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
Насколько я понимаю, мне не кажется, что все так уж плохо.
решение1
Сначала вам следует обновиться как минимум до FFmpeg 0.9. vpre
больше не рекомендуется использовать для управления предустановками. Вот почему ffpreset
файлы были удалены из новых версий. Управление предустановками для libx264 теперь происходит через сам x264, а не через FFmpeg.
При этом установка среднего битрейта для x264 являетсярежим управления наихудшей скоростьюесть. Вместо среднего битрейта вам следует рассмотреть возможность использования двухпроходного кодирования, если вы нацелены на определенный размер выходного файла или устанавливаетеПостоянный фактор скорости(CRF) если вы просто заботитесь о достижении определенного качества. Если сомневаетесь, используйте CRF.
Обычно для использования FFmpeg и x264 требуется следующий синтаксис:
ffmpeg -i in.mp4 -vcodec libx264 <options> out.mp4
… со следующими необязательными опциями. Важно указать их перед выходом и после переключателя vcodec
. Это лишь некоторые (см. такжеотображение опцийдля большего):
-vprofile
: Установите ограничения профиля h.264, напримерbaseline
,main
, ,high
-preset
: Установите предустановку кодирования, которая обычно включает стратегии оптимизации. Вы можете выбрать изveryslow
,slow
,fast
,ultrafast
и многих других. Более медленные предустановки приводят к лучшему сжатию за счет более медленного кодирования. Обычно вы используете самую медленную предустановку, на которую у вас есть терпение.-tune
: Установите специальный коэффициент настройки, например, для фильмов:film
-b
: Установите битрейт. Как уже было сказано, это не совсем то, что вам нужно при однопроходном кодировании, но если нужно, это должно сработать. Возможные значения указаны в битах, или, скорее500K
,1M
, , и так далее.-crf
: Установить качество. Взаимоисключающее с-b
. Хорошее начальное значение — 24. Меньшее значение — более высокое качество. Используйте наибольшее значение, которое все еще выглядит хорошо для вас.
Пример двухпроходного кода, видео H.264, звук AAC в 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
Пример CRF, видео H.264, аудио MP3 в MKV:
ffmpeg -i input -c:v libx264 -preset medium -crf 24 -c:a libmp3lame -q:a 4 output.mkv