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

Saving webcam jpeg stream to multiple files with gstreamer

我正在尝试将来自罗技 C920 网络摄像头的 MJPEG 流保存到多个视频文件 (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 的高清)。

我在 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

但它不起作用:文件永远不会拆分并且大小不断增加。

以下管道似乎有效:

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

It is not possible to use this element to create independently playable mp4 files, use the splitmuxsink element for that instead.

我已成功使用升级后的 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。