使用gstreamer将网络摄像头jpeg流保存到多个文件

时间:2017-01-12 14:56:56

标签: gstreamer webcam mjpeg matroska

我正在尝试将MJPEG流从Logitech C920网络摄像头保存到多个视频文件(matroska)。

我有这个管道:(每60秒1个mkv文件)

gst-launch-1.0 -ev v4l2src device=/dev/video0 \
! image/jpeg,width=1280,height=720,framerate=24/1 \
! matroskamux ! multifilesink next-file=max-duration max-file-duration=60000000000 location='test1-%02d.mkv'

它按预期输出了几个文件,但文件有错误,因此像avidemux这样的工具无法播放它们。 mkvalidator报告这些:

WRN080: Unknown element [FF] at 293 size 88
WRN080: Unknown element [FF] at 494 size 64
WRN080: Unknown element [7D][01] at 566 size w98603107602
WRN801: The segment has no SeekHead section
WRN0B8: Track #1 is defined but has no frame

顺便说一句,使用filesink保存到单个文件会生成一个没有错误的mkv文件。

有没有办法正确保存多个mkv文件? 任何其他容器也可以,但我不能转码(需要低CPU负载),我不能使用原始(需要高fps的HD)。

我在Ubuntu 16.04.1上使用GStreamer 1.8.2。

感谢。

更新: 按照下面的建议,我尝试使用splitmuxsink:

gst-launch-1.0 -e v4l2src device=/dev/video1 \
! image/jpeg,width=1280,height=720,framerate=24/1 \
! splitmuxsink muxer=matroskamux location='test1-%02d.mkv' \
max-size-time=10000000000

但它不起作用:文件永远不会分裂并且不断增长。

2 个答案:

答案 0 :(得分:0)

以下管道似乎有效:

gst-launch-1.0 -e v4l2src ! x264enc key-int-max=10 ! h264parse ! splitmuxsink muxer=matroskamux location='test1-%02d.mkv' max-size-time=60000000000

multifilesink对容器格式一无所知,因此您必须使用splitmuxsink进行拆分。

以下是multifilesink doc的引用:

  

无法使用此元素独立创建   可播放的mp4文件,请使用splitmuxsink元素。

答案 1 :(得分:0)

我通过升级的GStreamer(Ubuntu 18.04)取得了成功

$ gst-launch-1.0 --gst-version
GStreamer Core Library version 1.14.1

这是带有AVI容器的管道,每十秒钟会在其中生成一个新文件:

gst-launch-1.0 -e v4l2src device=/dev/video1 \
! image/jpeg,width=1280,height=720,framerate=24/1 \
! splitmuxsink muxer=avimux location='test1-%02d.avi' max-size-time=10000000000

它还可以与matroskamux一起使用。