На сегодняшний день можно создавать 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, запускают эти тесты кодирования и отчитываются :-)