![ffmpeg硬體加速編碼和yadif的問題](https://rvso.com/image/1615251/ffmpeg%E7%A1%AC%E9%AB%94%E5%8A%A0%E9%80%9F%E7%B7%A8%E7%A2%BC%E5%92%8Cyadif%E7%9A%84%E5%95%8F%E9%A1%8C.png)
我在 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 個執行緒以防止死鎖,請參閱這代碼塊。