Ubuntu 22.04下如何用FFplay硬解码播放MJPEG流以降低CPU占用?兼询Vulkan渲染器使用方法
Ubuntu 22.04下如何用FFplay硬解码播放MJPEG流以降低CPU占用?兼询Vulkan渲染器使用方法
TL;DR:在Ubuntu 22.04系统中,如何通过FFplay利用硬件加速播放来自WebCAM/HDMI采集设备的MJPEG流?
问题背景
我有几款廉价的HDMI采集设备,它们可以输出1920x1080分辨率的MJPEG流,其中一款设备的详细能力参数已确认支持对应格式与分辨率输出。
长期以来,我使用以下命令来播放流:
ffplay -fflags nobuffer -f video4linux2 -framerate 30 -video_size 1920x1080 -input_format mjpeg /dev/hdmi-rpi
这个命令启动速度极快(仅需几毫秒),在我的Ryzen 5700G上占用约15%的单核心CPU,GPU占用9%。
但我想进一步利用硬件加速,于是尝试了以下命令:
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -f v4l2 -framerate 30 -video_size 1920x1080 -input_format mjpeg -i /dev/hdmi-rpi -vcodec rawvideo -f matroska - | ffplay -i -
结果反而占用了29%的CPU和49%的GPU(启动速度同样很快)。
我还用MPV做了测试,命令及输出如下:
stulluk ~ $ mpv --demuxer-lavf-format=video4linux2 --demuxer-lavf-o=input_format=mjpeg,video_size=1920x1080,framerate=30 av://v4l2:/dev/hdmi-rpi (+) Video --vid=1 (mjpeg 1920x1080 30.000fps) [ffmpeg/video] mjpeg: overread 8 VO: [gpu] 1920x1080 yuvj422p V: 00:00:15 / 00:00:15 (99%) [ffmpeg/demuxer] video4linux2,v4l2: Some buffers are still owned by the caller on close. [ffmpeg] ioctl(VIDIOC_QBUF): Bad file descriptor [ffmpeg] ioctl(VIDIOC_QBUF): Bad file descriptor [ffmpeg] ioctl(VIDIOC_QBUF): Bad file descriptor Exiting... (Quit) stulluk ~ $
使用该设置时,MPV仅占用13%的CPU和9%的GPU。
核心疑问
所以我想知道:
- 是否有办法让FFplay启用硬件加速来降低CPU占用?
- 另外,是否可以用新的Vulkan渲染器来播放MJPEG?如果可以,该如何编译FFmpeg以及如何使用?
备注:内容来源于stack exchange,提问作者Sertac TULLUK
相关产品推荐
相关产品推荐

