首页 > 解决方案 > Video For Linux 2 dequeuing 非常慢

问题描述

我要做的是:

这是我运行以更新框架的代码:

if (ioctl(m_file_descriptor, VIDIOC_QBUF, m_buffer_info + m_current_buffer_index) < 0) {
    debug::log::message("Camera::open(): Unable to query the buffers: %s", strerror(errno));
    return nullptr;
}

++m_current_buffer_index;
if (m_current_buffer_index == s_buffer_count) m_current_buffer_index = 0;

if (ioctl(m_file_descriptor, VIDIOC_DQBUF, m_buffer_info + m_current_buffer_index) < 0) {
    debug::log::message("Camera::open(): Unable to dequeue the buffers: %s", strerror(errno));
    return nullptr;
}

return reinterpret_cast<unsigned char *>(m_buffer_start[m_current_buffer_index]);

此代码将应用程序的更新速度降低到每秒 <10 次更新(每次更新大约需要106毫秒),其中出列过程需要104毫秒

我想知道为什么会这样,以及是否有任何方法可以让这个应用程序实时运行,因为这台笔记本电脑上的网络摄像头运行速度为 30fps。

编辑:我发现相机在读取原始数据(在 yuv422 中)时只能以 10hz 运行,因此出队被阻塞。根据v4l2-ctl -d /dev/video2 --list-formats-ext. (30fps 的 720p 实际上给了我 15fps,降低分辨率也无济于事)现在我知道我需要解码 mjpeg 帧才能以高帧率获得实时高清视频,我正在尝试找到一种将 mjpeg 转换为 rgb 的方法(或 yuv)

标签: c++mmapv4l2v4l

解决方案


推荐阅读