如何在GStreamer的v4l2src中设置mmap缓冲区数量解决丢帧
问题描述
我使用gst-launch播放FPGA摄像头数据时,执行以下命令出现缓冲区已满警告并丢帧:
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw, format=NV16, width=768, height=288, framerate=50/1 ! waylandsink
警告信息如下:
rkcif_dvp: not active buffer, skip current frame, dvp stream[0]
我发现使用v4l2-ctl时,执行v4l2-ctl -d /dev/video0 --set-fmt-video=width=768,height=288,pixelformat=NV16 --stream-mmap=2 --stream-to=pic.yuv --stream-count=100会丢帧,但设置--stream-mmap=3则无丢帧情况。想了解GStreamer中是否有类似参数可指定mmap缓冲区数量。
以下是我的FPGA摄像头gst-device-monitor-1.0输出信息:
Device found: name : rkcif class : Video/Source caps : video/x-raw, format=(string)NV12, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)NV16, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)YUY2, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)UYVY, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)RGB, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)NV21, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)NV61, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)RGB16, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-bayer, format=(string)bggr, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-bayer, format=(string)gbrg, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-bayer, format=(string)grbg, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-bayer, format=(string)rggb, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)GRAY8, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)I420, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)YV12, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)BGR, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)GRAY16_LE, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; video/x-raw, format=(string)YVYU, width=(int)[ 64, 768, 8 ], height=(int)[ 64, 288, 8 ], framerate=(fraction)[ 1/1, 50/1 ]; properties: device.path = /dev/video0 udev-probed = false device.api = v4l2 v4l2.device.driver = rkcif v4l2.device.card = rkcif v4l2.device.bus_info = platform:rkcif_dvp v4l2.device.version = 267214 (0x000413ce) v4l2.device.capabilities = 2233466881 (0x85200001) v4l2.device.device_caps = 85983233 (0x05200001) gst-launch-1.0 v4l2src ! ...
解决方案
GStreamer的v4l2src元素支持通过buffer-count参数指定mmap缓冲区数量,作用和v4l2-ctl的--stream-mmap=N一致。你可以修改命令如下:
gst-launch-1.0 v4l2src device=/dev/video0 buffer-count=3 ! video/x-raw, format=NV16, width=768, height=288, framerate=50/1 ! waylandsink
如果需要强制指定使用mmap模式(避免默认使用其他IO方式),可以加上io-mode=mmap参数:
gst-launch-1.0 v4l2src device=/dev/video0 buffer-count=3 io-mode=mmap ! video/x-raw, format=NV16, width=768, height=288, framerate=50/1 ! waylandsink
buffer-count的默认值为0,此时由驱动自动选择缓冲区数量。设置为3后,应该能解决你遇到的丢帧问题,和v4l2-ctl的测试效果一致。
你可以通过gst-inspect-1.0 v4l2src查看该参数的详细说明,确认其作用。
内容的提问来源于stack exchange,提问作者Chroluma
相关产品推荐
相关产品推荐

