繁体   English   中英

使用 V4l2 捕获的视频丢帧/丢帧

[英]video capturing with V4l2 has dropped/lost frames

我有一个科学应用程序,它捕获一个 video4Linux 视频 stream。 至关重要的是,我们捕捉每一帧并且没有人迷路。 不幸的是,到处都缺少框架,我不知道为什么。

为了检测丢帧,我在读取一帧后直接将 v4l2_buffer 的序列号与我自己的计数器进行比较:

void detectDroppedFrame(v4l2_buffer* buffer) {
        _frameCounter++;

        auto isLastFrame = buffer->sequence == 0 && _frameCounter > 1;
        if (!isLastFrame && _frameCounter != buffer->sequence+1)
        {
                std::cout << "\n####### WARNING! Missing frame detected!" << std::endl;               
                _frameCounter = buffer->sequence+1; // re-sync our counter with correct frame number from driver.
        }
}

My running 1-file example gist can be found at github (based on official V4L2 capture example): https://gist.github.com/SebastianMartens/7d63f8300a0bcf0c7072a674b3ea4817

在笔记本硬件(uvcvideo 驱动程序)上使用 Ubuntu 18.04 虚拟机上的网络摄像头以及在本机运行 ubuntu 18.04 的嵌入式硬件上使用 CSI 摄像头进行测试。 帧没有被处理并且缓冲区似乎被抓取得足够快(使用 VIDIOC_QUERYBUF 检查的缓冲区状态显示所有缓冲区都在驱动程序的传入队列中,并且未设置 V4L2_BUF_FLAG_DONE 标志)。 我使用 MMAP 和 UserPtr 方法丢失了帧。 此外,它似乎与像素格式、图像大小和帧速率无关!

在我看来,如果摄像头/v4l2 驱动程序无法足够快地填充可用缓冲区,而且使用 VIDIOC_S_PRIORITY 命令增加文件描述符优先级也无济于事(仍然可能是线程调度问题?)。

=> V4L2 不转发帧的可能原因是什么(不将它们放入它的传出队列)? => 我检测丢失帧的方法是否正确? 还有其他选择或工具吗?

我在使用 bttv 驱动程序时遇到了类似的问题。 所有以全分辨率捕获的尝试都会导致丢帧(通常约为 10% 的帧,通常是突发的)。 以半分辨率捕获效果很好。

我发现的解决方案虽然远非理想,但却是对 linux 调度程序施加负载。 这是一个示例,使用“tvtime”程序进行捕获:

#! /bin/bash
# apply a load in the background
while true; do /bin/true; done &> /dev/null &
# do the video capture
/usr/bin/tvtime "$@"
# kill the loop running in the background
pkill -P $$

这会创建一个在后台重复运行 /bin/true 的循环。 几乎任何可执行文件都可以(我最初使用 /bin/date)。 循环会产生沉重的负载,但对于多核系统,仍有足够的空间用于其他任务。

这显然不是一个理想的解决方案,但就其价值而言,它使我能够捕获全分辨率视频而不会丢帧。 我几乎不想在驱动程序/内核代码中四处寻找更好的解决方案。

仅供参考,这是我的系统的详细信息:

OS:  Ubuntu 20.04, kernel 5.4.0-42
MB:  Gigabyte AB350M-D3H
CPU: AMD Ryzen 5 2400G
GPU: AMD Raven Ridge

Driver name      : bttv
Card type        : BT878 video (Hauppauge (bt878))
Bus info         : PCI:0000:06:00.0
Driver version   : 5.4.44
Capabilities     : 0x85250015

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM