c++ - Video For Linux 2 dequeuing 非常慢
问题描述
我要做的是:
通过以下方式打开相机:
query the capabilities set the format set the framerate request 4 buffers query all 4 buffers use mmap (I don't know anything about what this does) turn the streaming on queue all 4 buffers
然后在每一帧循环中,
queue the next buffer (increase the buffer counter/reset it to the first if necessary) dequeue the next buffer
这是我运行以更新框架的代码:
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 - 如何为C中的链表头分配空间?
- angular - Karma 在测试结果上渲染 html
- reactjs - 使用 React 和 Redux 连接在一起的父子组件中的值未定义。应用程序崩溃
- swift - 如何以编程方式使没有宽度的自定义按钮居中
- python - python中这个公式的具体正则表达式
- html - CSS / html Position:sticky 对我不起作用
- c - 如何在特定 IP 上打开套接字
- rust - Cloudflare Workers 中的 WebAssembly 实例化内存不足
- r - 线性混合模型的事后检验 - 具有两个水平的因子
- powershell - 从 Blob 存储中删除 SQL 备份