Тройник GStreamer (множественный мультиплексор)

Я пытаюсь сохранить видеопоток (исходящий с моей веб-камеры) в файл MKV и FLV. Это означает, что я должен разделить видео- и аудиоконвейер после кодирования h264 и мультиплексировать каждый путь с помощью другого мультиплексора.

Вот как я представляю, что это должно работать:

                                             |->queue->matroskamux->filesink
v4l2src->videorate->videoscale->x264enc->tee-|
                                             |->queue->flvmux->filesink

Верно ли это предположение? Все ли очереди в правильных местах? Как будет выглядеть такая команда GStreamer? У меня особенно проблемы с концепцией "Tees". Как/где их запускать в команде и как манипулировать разными Tee-Paths. Я искал «Tee» в документации GStreamer, но у меня все еще есть проблемы с их применением.

Заранее спасибо!

РЕДАКТИРОВАТЬ: Хорошо, благодаря mreithub у меня получилось работать с видео. Вот как выглядит команда на данный момент:

gst-launch-0.10 -v -m v4l2src ! videorate ! videoscale ! ffmpegcolorspace ! x264enc ! tee name=muxtee ! queue2 ! matroskamux name=mkvmux ! filesink location=file1.mkv muxtee. ! queue ! flvmux name=flvmux ! filesink location=file1.flv

Вот моя попытка запустить звук:

gst-launch-0.10 -v -m v4l2src ! videorate ! videoscale ! ffmpegcolorspace ! x264enc ! tee name=muxtee ! queue2 ! matroskamux name=mkvmux pulsesrc ! ffenc_aac ! filesink location=file1.mkv muxtee. ! queue ! flvmux name=flvmux pulsesrc ! ffenc_aac ! filesink location=file1.flv

Это не работает (команда выполняется, но сразу останавливается - нет сообщения об ошибке). Но у меня также возникают проблемы с определением места, где разместить кодировку звука. В моем предпринятом решении я кодирую звук в каждом тройнике (правильно?). Но я хотел бы кодировать звук только один раз, а затем просто мультиплексировать его в обоих конвейерных путях соответственно.

Вот еще одна попытка: после кодирования звука я разделяю конвейер с помощью тройника и назначаю его mkvmuxer и flvmuxer:

gst-launch-0.10 -v -m v4l2src ! videorate ! videoscale ! ffmpegcolorspace ! x264enc ! tee name=muxtee ! queue2 ! matroskamux name=mkvmux ! filesink location=file1.mkv muxtee. ! queue ! flvmux name=flvmux ! filesink location=file1.flv pulsesrc ! ffenc_aac ! tee name=t2 ! queue ! mkvmux. t2. ! queue ! flvmux.

Но с этим я получаю следующее сообщение об ошибке:

could not link queue1 to flvmux

Спасибо!


person Dominik Schreiber    schedule 13.11.2012    source источник


Ответы (1)


Поскольку вы хотите использовать видео и аудио в своем конвейере, это будет немного сложно (я подумал, что небольшая картинка может помочь): Диаграмма GraphViz, показывающая получившийся конвейер

Чтобы сделать команду gst-launch максимально понятной, я поместил каждую часть линейного конвейера в одну командную строку (красные соединения в первой строке, затем синие, зеленые и желтые и, наконец, элементы очереди, окрашенные черным цветом в картинку выше):

gst-launch-0.10 v4l2src ! videorate ! videoscale ! x264enc ! tee name=videoTee \
    pulsesrc ! ffenc_aac ! tee name=audioTee \
    flvmux name=flvMux ! filesink location=/tmp/foo.flv \
    matroskamux name=mkvMux ! filesink location=/tmp/foo.mkv \
    audioTee. ! queue ! flvMux. \
    audioTee. ! queue ! mkvMux. \
    videoTee. ! queue ! flvMux. \
    videoTee. ! queue ! mkvMux.

Только одно последнее замечание: я пробовал использовать lame вместо ffenc_aac, так как он у меня не установлен, но он должен работать с ними обоими.

Редактировать: Полностью переписал ответ, включая поддержку звука, добавил изображение конвейера (кстати, изображение было сделано с помощью замечательного инструмента GraphViz).

person mreithub    schedule 14.11.2012
comment
Спасибо mreithub! С вашей помощью мне удалось запустить видео, но я также попытался интегрировать в него звук. У меня проблемы с этим, как описано в моем отредактированном посте. У вас есть идея, как это эффективно реализовать? - person Dominik Schreiber; 14.11.2012
comment
@user1595257 user1595257 Я только что переписал свой полный ответ, включив поддержку звука (надеюсь, вам понравится картинка;)) - person mreithub; 15.11.2012
comment
командная строка для текущей версии gstreamer в Windows: gst-launch-1.0.exe dxgiscreencapsrc ! очередь ! видео конвертировать ! x264enc! tee name=videoTee directsoundsrc ! очередь ! аудиоконвертер! avenc_aac ! tee name=audioTee имя flvmux=flvMux ! Расположение файлов = test.flv имя matroskamux = mkvMux ! расположение файлов=test.mkv audioTee. ! очередь ! flvMux. аудиоTee. ! очередь ! mkvMux. видеоTee. ! очередь ! flvMux. видеоTee. ! очередь ! mkvMux. - person manit; 05.01.2021