网络摄像头gstreamer没有完整的FPS录制

sty*_*uxx 2 webcam frame-rate gstreamer logitech

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

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)
Run Code Online (Sandbox Code Playgroud)

所以现在我要捕获300帧,分辨率为640x480 @ 30fps,jpeg压缩它们并将其复用到avi.捕获300帧@ 30fps应该会产生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
Run Code Online (Sandbox Code Playgroud)

我用fpsdisplaysink检查了,很多帧被删除了:

last-message = rendered: 48, dropped: 250, fps: 1.88, drop rate: 5.64
Run Code Online (Sandbox Code Playgroud)

显然我没有从凸轮上获得30fps.它通过USB 2.0连接,因此应该有足够的带宽.Gstreamer并不抱怨PC会减速或其他任何东西.

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

编辑1:

我现在在更好的光线条件下尝试过.随着guvcview我设置曝光为固定值.当我将大写字母设置为15fps时,结果与预期一致:捕获150帧会产生10秒的视频并需要10秒钟.

记录300帧@ 30fps所需的时间也减少到20秒.

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

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

last-message = rendered: 1, dropped: 298, fps: 0.00, drop rate: 30.07 
Run Code Online (Sandbox Code Playgroud)

编辑2:

好吧,当我使用videorate将其修复为30fps时,fpsdisplay接收器显示基本没有掉帧和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
Run Code Online (Sandbox Code Playgroud)

sty*_*uxx 6

我通过玩网络摄像头设置解决了这个问题.将暴露增加到300而不是默认的150对我来说是个窍门.

还可以使用videorate来修复特定的帧速率.

我的管道用于记录300帧,分辨率为640x480,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
Run Code Online (Sandbox Code Playgroud)