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

$ vaapi显示这个 (好像 va-api 在那里,mesa 驱动程序)

$ ls /dev/dri/*

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

/dev/dri/按路径:

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

您如何看待这个错误或者您将如何发现哪些 ffmpeg 参数可用于 HW H€VC 加速?

更新:我认为“-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

如果您使用英特尔 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)

相关内容