0

我要做的是:

  • 通过以下方式打开相机:

    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)

4

0 回答 0