Gstreamer从网络摄像头捕获并存储mjpeg

时间:2018-08-08 07:33:21

标签: gstreamer mjpeg

我正在尝试捕获和存储网络摄像头流。要求是1920x1080 @ 30fps。而且必须由单板计算机(Raspberry)完成。 捕获时间为10分钟。 (目前我只捕获了10秒钟进行测试)

通常,摄像机(来自ELP的usbfhd01m)能够以1920x1080 @ 30fps的速度提供MJPEG流。我只是无法存储它。而且我不知道为什么。我通过以下管道进行了尝试:

gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=300 do-timestamp=true ! image/jpeg,width=1920,height=1080,framerate=30/1 ! queue ! avimux ! filesink location=test.avi

结果是一个视频文件,远远没有流利。我的管道中缺少什么?

当我使用相同的管道时,对流进行解码并将其保存在这样的原始文件中:

gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=300 do-timestamp=true ! image/jpeg,width=1920,height=1080,framerate=30/1 ! queue ! jpegdec ! filesink location=test.yuv

然后原始视频绝对流畅。因此,我认为管道和设备能够以1920x1080 @ 30fps的速度进行记录,但是保存流似乎有些错误。

将流存储为matroska文件格式不会改变我的问题。而且,对于将代码即时转换为H264而言,Raspberry Pi 3似乎还不够强大。 (甚至使用omxh264enc)

1 个答案:

答案 0 :(得分:1)

删除do-timestamp=true会发生什么?此选项将当前管线时间戳应用于采样缓冲区-覆盖从设备发出的时间戳。您可能想要存储原始时间戳,而不是覆盖它们,因为它们可能会带来一些流水线抖动。

在第二个管道中,将流另存为原始流。基本上删除所有您拥有的时间戳信息(以及抖动时间戳)。因此,当您播放原始流时,它会采用恒定的帧速率。