寻求适用于GRAY8格式的低CPU占用GStreamer视频编码器
GStreamer推送GRAY8视频到Kinesis Video的低CPU占用解决方案
问题背景
使用GStreamer+ARAVIS库推送Genicam摄像头(输出GRAY8格式)到Amazon Kinesis Video时,当前采用x264enc软件编码器导致CPU占用率超过90%;尝试vaapih264enc硬件编码器虽降低了CPU占用,但出现视频快进、卡顿问题。运行环境为搭载Intel主板的Ubuntu系统。
当前高CPU占用管道
gst-launch-1.0 -e --gst-plugin-path=/usr/local/lib/ aravissrc camera-name="Allied Vision-xxxxxxxx-xxxxx" exposure=7000 exposure-auto=0 gain=30 gain-auto=0 ! video/x-raw,format=GRAY8,width=1920,height=1080,framerate=80/1 ! videoconvert ! x264enc bframes=0 key-int-max=45 bitrate=5500 ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=high ! kvssink stream-name="camera_xxx" storage-size=512 access-key="aws access key" secret-key="aws secret key" aws-region="aws region"
尝试过的VAAPI管道(存在快进卡顿)
gst-launch-1.0 -e --gst-plugin-path=/usr/local/lib/ aravissrc camera-name="Allied Vision-xxxxxxxx-xxxxx" exposure=7000 exposure-auto=0 gain=30 gain-auto=0 ! video/x-raw,format=GRAY8,width=1920,height=1080,framerate=80/1 ! vaapih264enc rate-control=cbr bitrate=5000 ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=high ! kvssink stream-name="camera_xxx" storage-size=512 access-key="aws access key" secret-key="aws secret key" aws-region="aws region"
可行解决方案
1. 修复vaapih264enc的卡顿问题
卡顿根源是GRAY8格式未适配VAAPI编码器的原生输入要求,且缺少帧同步控制。修改后的管道如下:
gst-launch-1.0 -e --gst-plugin-path=/usr/local/lib/ aravissrc camera-name="Allied Vision-xxxxxxxx-xxxxx" exposure=7000 exposure-auto=0 gain=30 gain-auto=0 ! video/x-raw,format=GRAY8,width=1920,height=1080,framerate=80/1 ! videoconvert ! video/x-raw,format=I420 ! vaapipostproc ! vaapih264enc rate-control=cbr bitrate=5500 key-int-max=45 ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=high ! kvssink stream-name="camera_xxx" storage-size=512 access-key="aws access key" secret-key="aws secret key" aws-region="aws region"
- 新增
videoconvert ! video/x-raw,format=I420:将GRAY8转换为VAAPI原生支持的YUV420格式,避免编码器内部格式转换出错 - 添加
vaapipostproc:完成视频流到VAAPI硬件管道的格式适配与帧同步 - 对齐
bitrate=5500和key-int-max=45参数,保证编码质量与流兼容性
2. 备选方案:使用v4l2h264enc硬件编码器
如果VAAPI方案仍有问题,可尝试Intel硬件编码器的V4L2封装v4l2h264enc,对GRAY8格式兼容性更好,CPU占用极低:
gst-launch-1.0 -e --gst-plugin-path=/usr/local/lib/ aravissrc camera-name="Allied Vision-xxxxxxxx-xxxxx" exposure=7000 exposure-auto=0 gain=30 gain-auto=0 ! video/x-raw,format=GRAY8,width=1920,height=1080,framerate=80/1 ! videoconvert ! v4l2h264enc extra-controls="controls,bitrate=5500000,keyframe_interval=45" ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=high ! kvssink stream-name="camera_xxx" storage-size=512 access-key="aws access key" secret-key="aws secret key" aws-region="aws region"
v4l2h264enc通过V4L2接口调用Intel GPU硬件编码单元,无需额外VAAPI环境配置extra-controls设置比特率(单位bps,5500kbps对应5500000)和关键帧间隔,与原配置对齐
3. 额外优化建议
- 安装Intel硬件加速驱动:Ubuntu下根据核显型号安装
intel-media-va-driver-non-free(新核显)或i965-va-driver(旧核显) - 优先使用摄像头原生YUV输出:若摄像头支持直接输出YUV420格式,调整摄像头配置减少
videoconvert的CPU开销 - 平衡编码参数:若80fps压力过大,可适当降低比特率或调整关键帧间隔,兼顾视频质量与系统负载
内容的提问来源于stack exchange,提问作者Shervin Mirsaeidi
相关产品推荐
相关产品推荐

