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

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 ответ1

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .