Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有hwupload的FFMPEG Hwaccel错误_Ffmpeg_Hardware Acceleration_Vaapi - Fatal编程技术网

带有hwupload的FFMPEG Hwaccel错误

带有hwupload的FFMPEG Hwaccel错误,ffmpeg,hardware-acceleration,vaapi,Ffmpeg,Hardware Acceleration,Vaapi,我目前正在尝试在FFMPEG上使用vaapi Hwaccellation 在我的命令中,我有vaapi上的hwaccel,vaapi上的hwaccel\u输出\u fomrat,-hwaccel\u设备上的/dev/dri/render128,以及-vf格式=nv12,hwupload和视频编解码器h264\vaapi 当我现在尝试启动它时,我得到了错误 grep stderr:[hwupload@0x30bb660]将帧上载到需要硬件开发参考。 [Parsed_hwupload_1@0x30b

我目前正在尝试在FFMPEG上使用vaapi Hwaccellation

在我的命令中,我有
vaapi
上的
hwaccel
vaapi
上的
hwaccel\u输出\u fomrat
-hwaccel\u设备
上的
/dev/dri/render128
,以及
-vf
格式=nv12,hwupload和视频编解码器
h264\vaapi

当我现在尝试启动它时,我得到了错误

grep stderr:[hwupload@0x30bb660]将帧上载到需要硬件开发参考。
[Parsed_hwupload_1@0x30bb560]针对“Parsed_hwupload_1”的查询格式失败:参数无效


我可以在某处定义硬件设备参考吗?我以为这就是我用hwaccel_设备所做的,但似乎不是。那么我该怎么做才能让它工作呢?

您需要正确初始化硬件加速器,如下面的文档所示(也许我们应该及时为此创建一个wiki条目):

假设以下代码段:

ffmpeg -re -threads 4 -loglevel debug \
-init_hw_device vaapi=intel:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device intel -filter_hw_device intel \
-i 'udp://$ingest_ip:$ingest_port?fifo_size=9000000' \
-vf 'format=nv12|vaapi,hwupload' \
-c:v h264_vaapi -b:v $video_bitrate$unit -maxrate:v $video_bitrate$unit -qp:v 21 -sei +identifier+timing+recovery_point -profile:v main -level 4 \
-c:a aac -b:a $audio_bitrate$unit -ar 48000 -ac 2 \
-flags -global_header -fflags +genpts -f mpegts 'udp://$feed_ip:$feed_port'
其中:

(a) 。VAAPI可用,我们将把DRM节点
/dev/dri/render128
绑定到编码会话,然后

(b) 。我们采用udp输入,其中,
$ingest\u ip:$port\u ip
对应于已知的udp输入流,分别匹配ip和端口配对,并具有定义的fifo大小(如
“?fifo\u size=n”
参数所示)

(c) 。编码到打包为MPEG传输流的输出udp流(请参阅使用中的muxer,mpegts),必要的参数分别与输出IP和端口配对匹配

(d) 。定义的视频比特率(
$video\u bitrate$unit
,其中$unit可以是K或M,视情况而定)和音频比特率(
$audio\u bitrate$unit
,其中$unit应该是K,用于基于AAC LC的编码),并将适当的编码器设置传递给vaapi编码器。在撰写本文时,FFmpeg中有四种可用的视频编码器供您参考,即:

i. h264_vaapi

ii. hevc_vaapi

iii. vp8_vaapi

iii. vp9_vaapi
由于省略了mjpeg编码器(其“在本上下文中不感兴趣”),这些编码器的文档可通过以下方式访问:

ffmpeg -hide_banner -h encoder=$encoder_name
其中
$encoder\u name
与上面列表中的编码器匹配

对于VAAPI,以下注释适用:

  • 基于VAAPI的编码器只能将输入作为VAAPI曲面,因此通常需要在hwupload实例之前将普通帧转换为VAAPI格式的帧。请注意,曲面的内部格式将从hwupload输入的格式派生,因此可能需要额外的格式过滤器才能使所有内容正常工作,如上面的代码段所示:
  • 一,
    -init\u hw\u device vaapi=intel:/dev/dri/render128
    初始化名为vaapi的硬件设备(稍后可通过
    -hwaccel\u device
    -filter\u hw\u device
    调用,如上所示)绑定到DRM渲染节点
    /dev/dri/render128
    。可以删除
    intel:
    前缀,但在存在多个支持VAAPI的设备的环境中(例如带有intel IGP和AMD GPU的装备),识别供应商名称使用的渲染节点通常很有用

    二,。注意
    -hwaccel\u output\u format vaapi
    定义的格式约束。这需要满足1中的条件

    iii.然后,我们选择命名的硬件加速实现vaapi,并为硬件加速设备(
    -hwaccel\u device
    )和我们将通过hwupload过滤器(
    -filter\u hw\u device
    )上传硬件帧的设备调用它。如您所观察到的,忽略后者将导致编码器初始化失败

    iv.现在,仔细检查视频过滤器语法:

    -vf 'format=nv12|vaapi,hwupload'
    
    此视频过滤器链将任何不受支持的视频帧转换为VAAPI硬件格式,在通过hwupload将帧上载到设备之前应用已知约束。这样做是出于安全原因;您不能假设编码器将接受解码后的格式。此模式下的性能将因源、解码器设备和使用的VAAPI驱动程序而异

    五,。现在,对于视频编码器(由
    -c:v$encoder\u name
    定义),根据需要传递参数。您可以修改我在上面的代码片段中提供的示例,但是如果需要进一步调优,最好参考前面解释的编码器文档

    奖励:处理基于英特尔的QSV编码器:

    我将这一部分包括在内,以供将来参考,供使用英特尔开源MSDK实现FFmpeg QSV和相关编码器的人参考。请参见下面的代码段:

    ffmpeg -re -threads 4 -loglevel debug \
    -init_hw_device qsv=qsv:MFX_IMPL_hw_any -hwaccel qsv -filter_hw_device qsv \
    -i 'udp://$ingest_ip:$ingest_port?fifo_size=9000000' \
    -vf 'hwupload=extra_hw_frames=10,vpp_qsv:deinterlace=2,format=nv12' \
    -c:v h264_qsv -b:v $video_bitrate$unit -rdo 1 -pic_timing_sei 1 -recovery_point_sei 1 -profile high -aud 1 \
    -c:a aac -b:a $audio_bitrate$unit -ar 48000 -ac 2 \
    -flags -global_header -fflags +genpts -f mpegts 'udp://$feed_ip:$feed_port'
    
    你可以看到相似之处

    QSV编码器使用VAAPI样式的映射(如上所述),但对hwupload过滤器施加了额外的约束:必须使用
    hwupload=extra_hw_frames=10
    参数,否则编码器的初始化将失败

    我不能推荐QSV编码器的原因之一是,尽管它们的输出质量被认为更好,但它们的脆弱映射常常伴随着一些最无用的错误,这些错误往往与编码器的故障无关。 在可能的情况下,坚持使用VAAPI。QSV的用途(在适用的情况下)是用于低功耗编码,就像Intel的Apollolake和

    希望本文档对您有用