网络摄像头gstreamer未以全FPS进行录制



我有一个罗技网络摄像头,当我列出它的可用格式时,它会显示(除其他外)以下内容:

Index       : 0
Type        : Video Capture
Pixel Format: 'YUYV'
Name        : YUV 4:2:2 (YUYV)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)

所以现在我想以640x480@30fps的分辨率捕获300帧,用jpeg压缩它们,并将其多路复用为avi。以每秒30帧的速度捕捉300帧应该会生成一部10秒的电影,录制时间应该为10秒,但在我的情况下,获取300帧大约需要40秒,但它会生成一个10秒的视频。

这是我的管道:

gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=300 ! 
"video/x-raw,width=640,framerate=30/1" ! jpegenc ! avimux ! 
filesink location=output.avi

我用fpsdisplaysink检查了一下,很多帧都被丢弃了:

last-message = rendered: 48, dropped: 250, fps: 1.88, drop rate: 5.64

很明显,我没有从摄像头中获得每秒30帧的画面。它通过USB 2.0连接,因此应该有足够的带宽。Gstreamer并没有抱怨电脑太慢或其他任何事情。

这是相机的问题,在fps上撒谎,还是我错过了什么?还有为什么会有这么多帧被丢弃?

编辑1:

我现在在更好的光照条件下尝试。使用guvcview,我将曝光设置为固定值。当我将上限设置为每秒15帧时,结果如预期:捕获150帧会产生10秒的视频,耗时10秒。

此外,以每秒30帧的速度录制300帧所需的时间也降至20秒。

好的,让我们找到正确的设置:我玩了固定的曝光时间,发现曝光时间越长,我就越接近10秒内的300帧。因此,将曝光设置为300解决了我在10秒内以每秒30帧的速度录制300帧的问题。

现在真正有趣的是,当我用fpsdisplaysink检查流时,它显示几乎所有的帧都被丢弃了:

last-message = rendered: 1, dropped: 298, fps: 0.00, drop rate: 30.07 

编辑2:

好吧,当我使用视频速率将其固定为30fps fps时,显示器接收器显示基本上没有丢弃的帧和30fps的恒定速率。

由此产生的管道是:

gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=300 ! 
"video/x-raw,width=640,framerate=30/1" ! 
videorate ! "video/x-raw,framerate=30/1" ! tee name=a ! 
queue ! jpegenc ! avimux ! filesink location=output.avi a. !  
queue ! fpsdisplaysink

我通过摆弄网络摄像头设置解决了这个问题。将曝光量增加到300,而不是默认的150,这对我来说很有用

也可以使用视频速率来修复特定的帧速率。

我在10秒内录制分辨率为640x480、每秒30帧的300帧,产生10秒avi的管道如下所示:

gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=300 ! 
"video/x-raw,width=640,framerate=30/1" ! 
videorate ! "video/x-raw,framerate=30/1" ! 
jpegenc ! avimux ! filesink location=output.avi

最新更新