Сохранение веб-камеры в формате JPEG в несколько файлов с помощью gstreamer

Я пытаюсь сохранить поток MJPEG с веб-камеры logitech C920 в несколько видеофайлов (matroska).

У меня есть этот конвейер: (1 файл MKV каждые 60 с)

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 правильно? С любым другим контейнером тоже все в порядке, но я не могу транскодировать (нужна низкая загрузка процессора) и не могу использовать raw (нужен HD с высоким fps).

Я использую GStreamer 1.8.2 на Ubuntu 16.04.1.

Благодарю.

Обновление: следуя совету ниже, я попытался с 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 ответа

Решение

У меня есть успех с обновленным 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.

Кажется, работает следующий конвейер:

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.

Другие вопросы по тегам