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

vpp_qsv您可以在转码链中使用 GPU 加速过滤器,其使用情况可以通过以下方式打印:

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 个线程来防止死锁,请参阅代码块。

相关内容