Video streaming 视频流捕获和帧速率控制

Video streaming 视频流捕获和帧速率控制,video-streaming,video-capture,rtp,v4l2,vp8,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 t

我目前正在开发一个使用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的帧间隔设置(是否强制?)
  • libvpx时基(我应该使用1/fps吗?1001/30000?)
  • pts值(是否需要帧编号*(1/fps)*90000?)
  • RTP时间戳(我可以在这里使用pts吗?)
  • 可以考虑的任何其他配置设置
V4L2捕获循环(是否需要计时器定期获取帧?)

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

V4L2的帧间隔设置(是否强制?)

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

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

显然这取决于你的帧率

vpx文档在这里非常清楚:

指示服务器使用的最小时间间隔(以秒为单位) 流动对于固定帧速率材质,或可变帧速率材质 其中帧以给定时钟的倍数计时(例如:视频 建议的方法是将时基设置为 帧速率的倒数(例如:对于29.970 Hz NTSC,为1001/30000)。这 允许pts与帧号相对应,这非常方便。 对于从带有绝对时间戳的容器中重新编码视频, 建议的方法是将时基设置为父级的时基 容器或多媒体框架(例如:ms为1/1000,如FLV)

由于时基是
vpx\u rational
类型,因此需要将其表示为两个整数之间的比率。e、 g.NTSC的古怪率不能使用
1/fps

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

不,不是真的(见上文)。它可以像
frame\u num
一样简单

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