ffmpeg hevc_vaapi:無法在過濾器「Parsed_null_0」和過濾器「auto_scaler_0」支援的格式之間進行轉換

ffmpeg hevc_vaapi:無法在過濾器「Parsed_null_0」和過濾器「auto_scaler_0」支援的格式之間進行轉換

在 Linux 上,我嘗試使用硬體加速將檔案編碼為 H€VC。成功的嘗試是:

ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec libx265 -crf 28 '/path/file.mp4'

但速度很慢,如 30fps,「ffmpeg -codecs|grep 265」顯示:(編碼器: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv hevc_v4l2m2m hevc_vaapi )

所以我嘗試了hevc_vaapi:

ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec hevc_vaapi -crf 28 '/path/file.mp4'

但它失敗了:

Impossible to convert between the formats supported by the filter 'Parsed_null_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
[AVIOContext @ 0x55d831121340] Statistics: 0 seeks, 0 writeouts
[aac @ 0x55d831142a00] Qavg: 30414.529
[aac @ 0x55d831142a00] 2 frames left in the queue on closing
[AVIOContext @ 0x55d831109ec0] Statistics: 65536 bytes read, 0 seeks
Conversion failed!

$ ffmpeg -hwaccels 顯示“

Hardware acceleration methods:
vdpau
cuda
vaapi
qsv
drm

$ 瓦皮顯示這個 (好像有 va-api,mesa 驅動程式)

$ ls /dev/dri/*

/dev/dri/card0 /dev/dri/renderD128

/dev/dri/by-path:

pci-0000:0a:00.0-卡 pci-0000:0a:00.0-渲染

您對此錯誤有何看法,或者您將如何繼續發現用於 HW H€VC 加速的 ffmpeg 參數?

更新:我認為“-hwaccel vaapi”可能是多餘的參數

答案1

我認為它需要正確的編碼參數,例如-vf 'format=nv12,hwupload',如果您有的話,下面的一行可能會起作用VAAPI驅動程式

echo "Input file:" && read -r i && echo "Quality: 25=identic, 30=a bit worse but small file size, or other numbers:" && read -r q && ffmpeg -vaapi_device /dev/dri/renderD128 -i "$i" -vf 'format=nv12,hwupload' -c:v hevc_vaapi -f mp4 -rc_mode 1 -qp "$q" "$i.hevc.mp4"

答案2

其他答案都沒有幫助我,直到我在安裝後安裝 intel-media-va-driver-non-freehttps://wiki.debian.org/HardwareVideoAcceleration

sudo apt install intel-media-va-driver-non-free

如果您使用 intel gpu,它應該會有所幫助。

如果您需要縮放視頻,請使用“-vf scale_vaapi=640:360”來縮放視頻,而不需要像“format=nv12,hwupload”這樣的字串

答案3

您的第一個命令顯示您使用 GPU 進行解碼,但編碼是使用 CPU (libx265) 執行的。 GPU解碼速度很快,但解碼後的內容從顯示卡顯示下載到電腦記憶體後才能由CPU處理。此下載過程是系統範圍的。開銷非常高,甚至超過了用cpu純軟體同時編解碼的開銷,所以速度很低;你的第二個命令最終決定使用gpu同時解碼和編碼硬體加速,但是你沒有告訴gpu要編碼的內容已經被顯示卡硬體解碼到顯存中,並且你使用了硬體加速的crf參數編碼不支持,硬體與crf類似的參數編碼是qp。 PS:以下是我常用的參數:

ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -i '/path/file.mkv' -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload' -c:v hevc_vaapi  -qp 24  -filter:a volume=1.5 -ar 44100 -acodec aac -ab 64k -y '/path/file_n.mkv'

答案4

我可以建議您添加以下兩個標誌:

  • -hwaccel vaapi
  • -hwaccel_output_format vaapi

所以命令列看起來像這樣:

ffmpeg -v verbose -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i INPUT.VIDEO -vf 'format=nv12,hwupload' -c:v hevc_vaapi OUTPUT.mp4

(在我的電腦上,不需要指定vaapi_device)

相關內容