Аппаратное транскодирование видео и аудио Intel i5 Kaby Lake в VP9 и FLAC с использованием ffmpeg
У меня есть около 30 гигабайт видео (в основном MP4, немного MKV и webm), мне нужно транскодировать в 8-битный VP9 со звуком свободного кодека без потерь (FLAC) в контейнере MKV из различных входных кодеков (аудио AAC; H264, VP8, H265/HEVC и, возможно, некоторые другие видеокодеки). В моей самой мощной системе транскодирование видео с низким разрешением занимает вдвое больше длины видео. я использую ffmpeg
на Linux с аргументами ffmpeg -i input -c:v libvpx-vp9 -lossless 1 -c:a FLAC -preset veryslow output.mkv
перекодировать видео без помощи оборудования. Однако недавно мой друг получил процессор Intel i5 Kaby Lake для своего ПК и предложил мне перекодировать видео. Согласно Википедии и ее ссылкам, новые процессоры Kaby Lake поддерживают аппаратное декодирование всех моих входных кодеков и 8-битное кодирование VP9. Итак, у меня есть два вопроса:
Какие
ffmpeg
аргументы, которые мой друг может использовать для перекодирования видео в VP9 и аудио в FLAC в контейнере MKV? Они работают с Windows? Если нет, то это нормально, так как у него двойная загрузка Windows 10-Linux.Это
veryslow
предварительная установка все еще необходима для получения наилучшего сжатия?
Я пытался найти ответ на этот вопрос в другом месте, но смог найти только примеры кодирования кодеков, таких как H264 и JPEG.
2 ответа
ОБНОВЛЕНИЕ 3 АВГУСТА 2017: Согласно более новому ответу пользователя 林正浩, ffmpeg теперь поддерживает кодирование VP9 через VAAPI. У меня все еще нет оборудования, необходимого для тестирования, хотя мой ответ будет иметь ограниченную помощь. Я оставлю свой оригинальный ответ о том, как кодировать VP9 в программном обеспечении ниже.
По какой-то причине FFmpeg не поддерживает кодирование VP9 на аппаратном кодере Intel QuickSync, хотя они поддерживают H.264 и HEVC . Поиск в репозитории исходного кода FFmpeg показывает, что это даже не вопрос его отключения, эта функция просто еще не реализована. Но если он станет доступным в какой-то момент в будущем, его следует использовать таким же образом, как и другие кодеры QuickSync: переключатель, подобный -c:v vp9_qsv
вместо -c:v libvpx-vp9
должен сделать работу.
Использование командной строки FFmpeg одинаково на всех платформах, с одним заметным исключением, которое я знаю как пользователи Windows, которым приходится пользоваться NUL
вместо /dev/null
для вывода во время первого прохода двухпроходного кодирования. Но так как вы делаете 1-проход и без потерь, это не должно повлиять на вас.
Если вы хотите ускорить кодирование, самое очевидное, что вы должны попробовать - установить значение скорости кодирования с помощью -speed
переключатель. Рекомендуемые значения: числа от 0 до 4, где 0 очень-очень медленно (подумайте -preset placebo
в x264, но хуже), но высокое качество и 4, будучи быстрым, а качество ниже. ffmpeg использует -speed 1
по умолчанию, который является хорошим соотношением скорости и качества для кодирования с потерями. Однако я только что провел быстрый тест кодирования без потерь с различными значениями скорости и заметил, что при переходе от -speed 1
в -speed 0
с кодированием без потерь. Время кодирования утроилось, так что стоит ли использовать 0 - решать вам. Файл, созданный -speed 4
был только на 1,1% больше, чем произведенный -speed 1
хотя, и это было закодировано на 43% быстрее. Так что я бы сказал, что если вы делаете без потерь и -speed 0
слишком медленно, вы могли бы также использовать -speed 4
,
Другим важным повышением производительности кодирования является включение многопоточности с помощью -threads
переключатель; libvpx не использует автоматически несколько потоков, поэтому пользователь должен установить это вручную. Вы также должны установить количество столбцов плитки с помощью -tile-columns
переключатель. Эта опция заставляет libvpx разделять видео на несколько плиток и кодировать их параллельно для лучшей многопоточности. Рекомендованные числа для количества столбцов и потоков листов можно найти в разделе "Рекомендации по составлению листов и потоков" руководства Google по кодированию VP9 . As you can see, the number of threads used goes up with the number of tiles, which means that depending on the number of CPU cores available your processor might not be fully saturated while encoding sub-HD-resolution video. If you mainly encode low-resolution videos you might want to consider encoding multiple files at the same time.
However, there is yet another way to speed up VP9 encoding: multi-threading within a single column tile that can by turned on with -row mt 1
, As of April 4 (2017, hello future people), it isn't part of a released version of libvpx but will most likely be in libvpx 1.6.2. If you want to try it out before the next release you need to compile recent git versions of libvpx and ffmpeg from source. Just follow FFmpeg's compilation guide for your distro of choice but instead of downloading and extracting a release tarball do git pull https://chromium.googlesource.com/webm/libvpx
вместо.
As for the veryslow
preset, that's only used in x264 and x265. libvpx uses the -speed
switch and additionally the -quality best
, -quality good
, или же -quality realtime
options to define how much time the encoder is allowed to spend encoding a frame. По умолчанию -quality good
так как -quality best
is so slow it's unusable and -quality realtime
is meant to be used for time-critical applications like video calls and livestreaming.
На сегодняшний день можно создавать FFmpeg с VAAPI, который в поддерживаемых системах позволяет кодировать VP9 на интегрированном графическом процессоре Intel.
Новый кодер, когда ffmpeg скомпилирован с поддержкой VAAPI, называется vp9_vaapi
,
Чтобы увидеть доступные параметры, которые можно использовать при настройке кодера, выполните:
ffmpeg -hide-banner -h encoder=vp9_vaapi
Выход:
Encoder vp9_vaapi [VP9 (VAAPI)]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: vaapi_vld
vp9_vaapi AVOptions:
-loop_filter_level <int> E..V.... Loop filter level (from 0 to 63) (default 16)
-loop_filter_sharpness <int> E..V.... Loop filter sharpness (from 0 to 15) (default 4)
Что произойдет, если вы попытаетесь выполнить это на неподдерживаемом оборудовании, скажем, Skylake?
Смотрите пример выходных данных ниже:
[Parsed_format_0 @ 0x42cb500] compat: called with args=[nv12]
[Parsed_format_0 @ 0x42cb500] Setting 'pix_fmts' to value 'nv12'
[Parsed_scale_vaapi_2 @ 0x42cc300] Setting 'w' to value '1920'
[Parsed_scale_vaapi_2 @ 0x42cc300] Setting 'h' to value '1080'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'video_size' to value '3840x2026'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'pix_fmt' to value '0'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'time_base' to value '1/1000'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'pixel_aspect' to value '1/1'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'sws_param' to value 'flags=2'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'frame_rate' to value '24000/1001'
[graph 0 input from stream 0:0 @ 0x42cce00] w:3840 h:2026 pixfmt:yuv420p tb:1/1000 fr:24000/1001 sar:1/1 sws_param:flags=2
[format @ 0x42cba40] compat: called with args=[vaapi_vld]
[format @ 0x42cba40] Setting 'pix_fmts' to value 'vaapi_vld'
[auto_scaler_0 @ 0x42cd580] Setting 'flags' to value 'bicubic'
[auto_scaler_0 @ 0x42cd580] w:iw h:ih flags:'bicubic' interl:0
[Parsed_format_0 @ 0x42cb500] auto-inserting filter 'auto_scaler_0' between the filter 'graph 0 input from stream 0:0' and the filter 'Parsed_format_0'
[AVFilterGraph @ 0x42ca360] query_formats: 6 queried, 4 merged, 1 already done, 0 delayed
[auto_scaler_0 @ 0x42cd580] w:3840 h:2026 fmt:yuv420p sar:1/1 -> w:3840 h:2026 fmt:nv12 sar:1/1 flags:0x4
[hwupload @ 0x42cbcc0] Surface format is nv12.
[AVHWFramesContext @ 0x42ccbc0] Created surface 0x4000000.
[AVHWFramesContext @ 0x42ccbc0] Direct mapping possible.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000001.
[AVHWFramesContext @ 0x42c3e40] Direct mapping possible.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000002.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000003.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000004.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000005.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000006.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000007.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000008.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000009.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x400000a.
[vp9_vaapi @ 0x409da40] Encoding entrypoint not found (19 / 6).
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
[AVIOContext @ 0x40fdac0] Statistics: 0 seeks, 0 writeouts
[aac @ 0x40fcb00] Qavg: -nan
[AVIOContext @ 0x409f820] Statistics: 32768 bytes read, 0 seeks
Conversion failed!
Интересные биты - это предупреждения точки входа для кодирования VP9, отсутствующего на этой конкретной платформе, что подтверждается выводом vainfo:
libva info: VA-API version 0.40.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/local/lib/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_40
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.40 (libva 1.7.3)
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 1.8.4.pre1 (glk-alpha-71-gc3110dc)
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileH264MultiviewHigh : VAEntrypointVLD
VAProfileH264MultiviewHigh : VAEntrypointEncSlice
VAProfileH264StereoHigh : VAEntrypointVLD
VAProfileH264StereoHigh : VAEntrypointEncSlice
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileVP8Version0_3 : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileVP9Profile0 : VAEntrypointVLD
Точка входа VLD (для декодирования с переменной длиной) для профиля 0 VP9 является самой дальнейшей, к которой Skylake относится с точки зрения аппаратного ускорения VP9.
Они с тестовыми стендами Kabylake, запускают эти тесты кодирования и отчитываются:-)