我要做的是:
通过以下方式打开相机:
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)快