Исправление несмешанного изображения / потока JPEG с веб-камеры с помощью gstreamer

Я сделал разбитые кадры, используя следующий конвейер:

gst-launch-1.0 v4l2src ! filesink location=encode.mjpeg

Каким-то образом gstreamer может воспроизвести его:

gst-launch-1.0 filesrc location=encode.mjpeg ! jpegdec ! videoconvert ! xvimagesink

Однако, поскольку я по ошибке не использовал какой-либо контейнер, поток воспроизводится в очень быстром темпе framerate=(fraction)0/1, Есть ли способ конвертировать мой сломанный файл в .avi или любой другой контейнер без повторного сжатия?

Следующее тривиальное мультиплексирование не сработало, как ожидалось:

gst-launch-1.0 filesrc location=encode.mjpeg \
    ! 'image/jpeg,framerate=30/1,width=1280,height=720' ! avimux \
    ! filesink location=encode.avi . -v

Как-то gstreamer играет encode.avi обратно очень медленно при ~1 FPS без значительного использования процессора. И ни Vlc`, ни Adobe Aftereffects не могут его импортировать - они отображают только правильно декодированный стип первого кадра вверху.

1 ответ

Проблема с мультиплексированием в avi связана с тем, что filesrc предоставляет буферам для avimux, которые неправильно выровнены по фреймам mjpeg, поэтому avimux создает сэмплы с неправильным выравниванием внутри, что усложняет их использование игроками. позже во время воспроизведения.

Это можно исправить с помощью парсера mjpeg после capsfilter (jpeg parse?). Другой вариант - декодировать и перекодировать сэмплы, чтобы выровнять их правильно и мультиплексировать. Следующий конвейер должен работать:

gst-launch-1.0 filesrc location=encode.mjpeg \
! 'image/jpeg,framerate=30/1,width=1280,height=720' ! decodebin ! videoconvert ! \
<some encoder> ! <some muxer> ! filesink location=outputfile

Вы можете выбрать кодировщик и мультиплексор, который вам нравится, вы даже можете закодировать их обратно в jpeg и mux в avi, как вы изначально хотели.

Изменить: Чтобы попытаться преобразовать содержимое в AVI без декодирования, попробуйте что-то вроде:

gst-launch-1.0 filesrc location=encode.mjpeg \
    ! 'image/jpeg,framerate=30/1,width=1280,height=720' ! jpegparse ! avimux \
    ! filesink location=encode.avi . -v

Если jpeg parse работает очень хорошо, ''image/jpeg, частота кадров =30/1, ширина =1280, высота =720'' не требуется.

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