Проблемы с аппаратным ускорением кодирования ffmpeg и yadif

Проблемы с аппаратным ускорением кодирования ffmpeg и yadif

У меня есть чересстрочное видео в контейнере mts, и я хотел бы преобразовать его в прогрессивное видео в контейнере mkv, возможно, в HEVC.

Я попробовал следующую командную строку:

ffmpeg -y -hwaccel qsv -c:v h264_qsv -i "2008-07-13 00.08.47.mts" -c:v hevc_qsv -global_quality 20 -look_ahead 1 -vf yadif=1 "test.mkv"

И получаю ошибку:

Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0:0' and the filter 'auto_scaler_0'
Error reinitializing filters!
Failed to inject frame into filter network: Function not implemented
Error while processing the decoded data for stream #0:0
Conversion failed!

Когда я удаляю, -vf yadif=1все работает нормально, я предполагаю, что мне нужно сказать ffmpeg, что ему нужно загрузить/выгрузить/конвертировать формат из iGPU обратно в память, чтобы yadif выполнил работу и снова загрузил, но я понятия не имею, как это сделать.

решение1

https://trac.ffmpeg.org/wiki/HWAccelIntro

https://ffmpeg.org/ffmpeg-filters.html#hwdownload-1

ffmpeg -y -hwaccel qsv -c:v h264_qsv -i "2008-07-13 00.08.47.mts" -c:v hevc_qsv -global_quality 20 -look_ahead 1 -vf hwdownload,format=nv12,yadif=1 "test.mkv"

Другие аппаратные ускорения. https://nico-lab.net/combine_hw_decoder_filter_encoder_with_ffmpeg/

решение2

Вы можете использовать фильтр с ускорением на GPU vpp_qsvв цепочке перекодирования, использование которого можно распечатать с помощью:

ffmpeg -h filter=vpp_qsv

В вашем случае, описанном выше, решение будет следующим:

ffmpeg -threads 4 -y -fflags +genpts -init_hw_device qsv=hw \
-hwaccel qsv -hwaccel_output_format qsv \
-filter_hw_device hw -c:v h264_qsv \
-i "2008-07-13 00.08.47.mts" \
-vf "format=nv12|qsv,hwupload=extra_hw_frames=64,vpp_qsv=deinterlace=2:async_depth=4" \
-c:v hevc_qsv  -global_quality 20 "test.mkv"

Объяснение:

Для цепочки видеофильтров см. дополнительный аргумент , extra_hw_frames=64переданный в hwupload, необходимый среде выполнения MFX, котораятребуется фиксированный размер пула кадровбыть предварительно выделено. Используйте число, соответствующее вашим требованиям. Как правило, вам понадобится большее число (64 или около того), если вы используете такие функции, какпрогнозирование (LA-ICQ).

Второй фильтр в цепочке — vpp_qsv, вызываемый для выполнения расширенного деинтерлейсинга с помощью опции deinterlace=2. В этом потоке декодирование, транскодирование и фильтрация (в данном случае деинтерлейсер) выполняются на GPU. Опция async_depth=4значительно повышает производительность, как показано наэто сообщение о фиксации.

Этотвот почему я опустил эту -lookahead 1опцию (пока). Если что-то изменится, я протестирую и отчитаюсь о том же.

В соответствии сэтотДля фиксации, упреждающего просмотра для hevc_qsvоболочки кодировщика также требуется включить расширенный режим управления битрейтом, поэтому предыдущая команда с упреждающим просмотром будет выглядеть так:

ffmpeg -threads 4 -y -fflags +genpts -init_hw_device qsv=hw \
-hwaccel qsv -hwaccel_output_format qsv \
-filter_hw_device hw -c:v h264_qsv \
-i "2008-07-13 00.08.47.mts" \
-vf "format=nv12|qsv,hwupload=extra_hw_frames=64,vpp_qsv=deinterlace=2:async_depth=4" \
-c:v hevc_qsv  -global_quality 20 -look_ahead 1 -extbrc 1 "test.mkv"

Пожалуйста, протестируйте и сообщите результаты.

Предупреждение:

Обратите внимание, что SDK требует не менее 2 потоков для предотвращения взаимоблокировки, см.этотблок кода.

Связанный контент