Исправление несмешанного изображения / потока 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'' не требуется.