Linux V4L2帧上的系统偏移

Linux V4L2帧上的系统偏移,linux,v4l2,uvc,Linux,V4l2,Uvc,我正在使用V4L2API从UVC设备抓取帧。我想通过计算帧的时间戳和当前时钟时间之间的偏移量来测量曝光时间。这是我正在使用的代码: /* Control code snipped */ struct v4l2_buffer buf = {0} buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; ioctl(fd, VIDIOC_DQBUF, &buf); switch( buf.flags &am

我正在使用V4L2API从UVC设备抓取帧。我想通过计算帧的时间戳和当前时钟时间之间的偏移量来测量曝光时间。这是我正在使用的代码:

/* Control code snipped */
struct v4l2_buffer buf = {0}
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
ioctl(fd, VIDIOC_DQBUF, &buf);

switch( buf.flags & V4L2_BUF_FLAG_TIMESTAMP_MASK )
{
    case V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC:
    {
        struct timespec uptime = {0};
        clock_gettime(CLOCK_MONOTONIC,&uptime);

        float const secs =
            (buf.timestamp.tv_sec - uptime.tv_sec) +
            (buf.timestamp.tv_usec - uptime.tv_nsec/1000.0f)/1000.0f;

        if( V4L2_BUF_FLAG_TSTAMP_SRC_SOE == (buf.flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK) )
            printf("%s: frame exposure started %.03f seconds ago\n",__FUNCTION__,-secs);
        else if( V4L2_BUF_FLAG_TSTAMP_SRC_EOF == (buf.flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK) )
            printf("%s: frame finished capturing %.03f seconds ago\n",__FUNCTION__,-secs);
        else printf("%s: unsupported timestamp in frame\n",__FUNCTION__);

        break;
    }

    case V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN:
    case V4L2_BUF_FLAG_TIMESTAMP_COPY:
    default:
        printf("%s: no usable timestamp found in frame\n",__FUNCTION__);
}
使用
VIDIOC\u S\u CTRL
设置1秒曝光时间后返回的内容示例:

read_frame: frame exposure started 28.892 seconds ago
read_frame: frame exposure started 28.944 seconds ago
read_frame: frame exposure started 28.895 seconds ago
read_frame: frame exposure started 29.037 seconds ago
我得到了
SRC_SOE
时间戳和单调时钟之间奇怪的30秒偏移,1秒曝光焊接。V4L2/UVC时间戳应该根据
ktime\u get\u ts()
的结果来计算。知道我做错了什么吗

这在Linux 4.4 Gentoo系统上运行。网络摄像头是DMK21AU04.AS,被公认为标准UVC设备。

问题是……

1s=1000ms,
1ms=1000us,
1 us=1000纳秒。

所以。。。

它应该像

float const secs =
        (buf.timestamp.tv_sec - uptime.tv_sec) +
        (buf.timestamp.tv_usec - uptime.tv_nsec/1000.0f)/1000000.0f;

谢谢@TallFurryMan,事实证明,你的代码片段对我很有帮助……我不敢相信我盯着答案看了这么久却没有看到:)