视频流捕获和帧速率控制

时间:2013-07-19 08:07:57

标签: video-streaming video-capture rtp v4l2 vp8

我目前正在使用VP8和V4L2开发视频流软件,但我正在努力应对帧评级的关键概念。

我有一个基本的工作实现,它在循环中获取帧,对其进行编码并通过RTP发送(尽可能快)。 但是,我不明白如何控制视频的帧速率或调节采样。

基本上可以归纳如下:

while (true) {
    ioctl(fd, VIDIOC_DQBUF, buf); // Get the V4L buffer
    vpx_codec_encode(...);        // VP8 encode using pts and timebase
    sendto();                     // Send through RTP with the correct timestamp
}

特别是,我不知道如何正确设置:

  • V4L2捕获循环(是否需要定时器来定期获取帧?)
  • V4L2的FRAME INTERVAL设置(是强制性的吗?)
  • libvpx时基(我应该使用1 / fps吗?1001/30000?)
  • pts值(是否需要帧数*(1 / fps)* 90000?)
  • RTP时间戳(我可以在这里使用pts吗?)
  • 可以考虑的任何其他配置设置......

1 个答案:

答案 0 :(得分:1)

  

V4L2捕获循环(是否需要定时器来定期获取帧?)

或者找到一种方法阻止线程,直到新数据到达为止(例如使用select()

  

V4L2的FRAME INTERVAL设置(强制性吗?)

它不是强制性的。设置FRAME_INTERVAL时,您告诉设备以指定的间隔对数据进行采样。 设备可能只是忽略该请求(例如,因为它无法在给定的采样率下捕获)。 另请注意,设备的内部时钟可能不准确和/或与系统上的其他时钟不同。

  

libvpx时基(我应该使用1 / fps吗?1001/30000?)

显然这取决于你的帧率。

vpx-documentation在这里很清楚:

  

表示使用的最小时间间隔(以秒为单位)   流。对于固定帧速率材料或可变帧速率材料   其中帧以给定时钟的倍数计时(例如:视频   捕获),RECOMMENDED方法是将时基设置为   帧速率的倒数(例如:29.970 Hz NTSC的1001/30000)。这个   允许pts对应于帧号,这可以很方便。   要从具有绝对时间戳的容器重新编码视频,   RECOMMENDED方法是将时基设置为父时基   容器或多媒体框架(例如:ms为1/1000,如FLV)。

由于时基属于vpx_rational类型,您需要将其表示为两个整数之间的比率。例如您不能将1/fps用于NTSC的怪人费率。

  

pts值(是否需要帧数*(1 / fps)* 90000?)

不是没有(见上文)。它可以像frame_num一样简单。

  

RTP时间戳(我可以在这里使用pts吗?)