Видео намного быстрее, чем аудио, когда мультиплексируется в GStreamer - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь научиться записывать содержимое окон X11, чтобы делать игровые скринкасты для Youtube. Это должно быть довольно тривиальной задачей, но она уже съела полный вечер. Теперь я немного узнал о мультиплексировании и организации очередей (используя gst-launch), но проблема остается: Когда я мультиплексирую аудио и видео в avi, видео воспроизводится в несколько раз быстрее, чем аудио в результирующем файле , Это означает, что видео скоро заканчивается и останавливается, а звук продолжает болтать в фоновом режиме.

Это моя цепочка фильтров, которая вызывает проблему:

gst-launch-1.0 ximagesrc xid=$XID ! video/x-raw,framerate=30/1 ! videoconvert ! 
    x264enc ! queue ! avimux name=mux ! queue ! filesink location=out.avi 
    pulsesrc device=$DEV ! queue ! audioconvert ! 
    lamemp3enc bitrate=192 ! queue ! mux.

Однако проблема исчезает, когда у меня только видео, и оно воспроизводится с совершенно нормальной скоростью:

ximagesrc xid=0x0820000b ! video/x-raw,framerate=30/1 ! videoconvert ! 
    x264enc ! avimux ! filesink location=out.avi

Буду также признателен, если вы поправите меня в отношении использования ! queue !. Где это нужно? В текущей настройке я почти никогда не получаю предупреждения о том, что образцы были отброшены.

Обновление: Я бы предпочел использовать mp4 muxer, но он создает непригодные для воспроизведения файлы без атома moov. Youtube рекомендует поместить его в начало файла, есть ли шанс, что я смогу форсировать его с помощью mp4 muxer?

1 Ответ

1 голос
/ 28 мая 2019

gst-launch-1.0 ximagesrc xid = $ XID! видео / x-raw, частота кадров = 30/1! очередь ! видеоконвертер! видеорейт! очередь ! x264enc! очередь ! имя avimux = mux! очередь ! расположение файловой системы = out.avi pulsesrc device = $ DEV! очередь ! аудиоконвертировать! очередь ! lamemp3enc битрейт = 192! очередь ! Мультиплексор.

Приведенный выше конвейер должен воспроизводить аудио-видео с правильной скоростью.

Буду также признателен, если вы меня поправите в использовании! очередь !. Где это нужно? В текущей настройке я почти никогда не получаю предупреждения что образцы были отброшены.

очередь - это просто буферы, их нужно использовать в местах, где один элемент медленнее, а другой быстрее, поэтому, например, генерация видео (ximagesrc) намного быстрее по сравнению с x264enc (программное кодирование), поэтому вы бы добавили очередь между ними, чтобы буферы не сбрасывались.

gst-launch-1.0 ximagesrc! видео / x-raw, частота кадров = 30/1! очередь ! видеоконвертер! очередь ! x264enc key-int-max = 5! очередь ! mp4mux имя = mux зарезервировано-байтов-в-сек = 100 зарезервирован-макс-импульсная = 20184000000000 reserved-moov-update-period = 100000000! очередь ! filesink location = out.mp4 audiotestsrc! очередь ! аудиоконвертировать! очередь ! lamemp3enc битрейт = 192! очередь ! Мультиплексор.

Приведенный выше конвейер создаст файл mp4 mp4mux, но атом moov будет в самом конце, также обратите внимание, что вы должны изменить свойства mp4mux в соответствии с вашими потребностями.

...