2014-02-23 28 views
2

记录我有一个罗技网络摄像头,当我列出了可用的格式它显示(其中包括)以下内容:网络摄像头的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) 

所以现在我想要捕获300帧,分辨率640x480 @ 30fps,JPEG压缩它们并将其复制到AVI。在30fps下捕捉300帧应该会产生10秒的电影,并且应该需要10秒才能录制,但在我的情况下,需要大约40秒才能获得300帧,但会导致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 

所以,很显然,我不从凸轮获得30fps的。它通过USB 2.0连接,所以应该有足够的带宽。 Gstreamer并没有抱怨个人电脑会减慢速度或其他任何事情。

这是一个相机的问题,说谎的fps,还是我错过了什么? 另外为什么有这么多帧被丢弃?

编辑1:

我现在更好的光线条件下试过。用guvcview我将暴露量设置为固定值。当我将上限设置为15fps时,结果如预期:捕获150帧会产生10秒的视频,需要10秒。

此外,在30fps下记录300帧所需的时间降至20秒。

OK,所以让我们找到合适的设置: 我打了固定的曝光时间,并发现,该曝光时间越长,越接近我来10秒大关的300帧。所以将曝光值设置为300解决了我在10秒内以30fps录制300帧的问题。

现在真正有趣的事情是,当我与fpsdisplaysink检查流它表明,几乎所有的帧需要DROP掉:

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

编辑2:

好吧,当我使用videorate将其修复为30fps fpsdisplay接收器显示basicaly没有丢帧和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 

回答

6

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

还使用视频速率来修复特定的帧率。

我记录300帧,640×480的分辨率,在10秒30fps的导致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 
+0

谢谢你的分享 –