4

Я привык использовать 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 за указание, что без потерь материал игнорирует битрейт!).

На всякий случай, если вам интересно, как я пришел к 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 ответ1

8

Вы должны сначала обновить по крайней мере до 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .