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 個執行緒以防止死鎖,請參閱代碼塊。

相關內容