Зависимости элементов GStreamer: Как подключить playbin к hlssink?

6990
Przemek Lach

Я новичок в GStreamer и пытаюсь создать несколько простых конвейеров, используя gst-launch-1.0. Мне трудно понять, какие элементы должны идти вместе. Например, я хочу передать потоковое видео в веб-тег HTML5 в браузере. Чтобы открыть и прочитать файл, я думаю, что мне нужно использовать playbin:

gst-launch-1.0 playbin uri=file:///home/ubuntu/g-streamer-lively/skyrim.webm ... 

Затем, чтобы сделать файл доступным, я использую hlssink:

! hlssink max-files=5 playlist-root=http://10.12.9.3/ location=/var/www/html/hlssink.webm 

Затем в моем браузере я использую тег видео:

<video src="http://10.12.9.3/hlssink.webm" controls> 

Так что этот конвейер не запустится, и я получаю следующую ошибку:

WARNING: erroneous pipeline: could not link playbin0 to hlssink0 

Так что это говорит мне, что я не могу связать эти два элемента. Хорошо, но где я могу найти другие элементы, которые мне нужно включить в конвейер, чтобы эта работа работала?

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

1

1 ответ на вопрос

0
thiagoss

I guess you should stop and read a bit the gstreamer documentation to understand how it works. GStreamer is a framework for building a graph for data processing. You can find the manual here: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html

Playbin is a special element (a bin) and it will assemble an internal pipeline for you. Playbin won't expose any linking pads as it is designed to create a full playback pipeline, that's why you can't link it to hlssink.

You can use other elements to create a pipeline to transcode your webm input to hlssink, for example you can use uridecodebin that is another bin that will automatically create a decoding pipeline for any media that you use (provided that you have the right plugins for it). Something like:

gst-launch-1.0 uridecodebin uri=<youruri> name=decbin ! queue ! videoconvert ! x264enc ! tsmux name=muxer ! hlssink decbin. ! queue ! audioconvert ! faac ! muxer. 

I haven't tested it, but something like that should work to convert your input to mpegts using H264 and AAC, for example, and pass the data for hlssink.

To check what elements you have on your system use the gst-inspect-1.0 tool. It will list all elements if you don't give it an argument or give you details about a particular element if you give it one, like:

gst-inspect-1.0 hlsssink 

EDIT: fixing the pipeline you proposed in comments

gst-launch-1.0 uridecodebin uri=file:///home/ubuntu/g-streamer-lively/skyrim.webm name=decbin ! queue ! videoconvert ! x264enc ! mpegtsmux name=muxer ! hlssink max-files=5 playlist-root=10.12.9.3 location=/var/www/html/hlssink decbin. ! queue ! audioconvert ! avenc_aac ! muxer. 
Итак, я прочитал документацию раньше, но мне все еще трудно разобраться в порядке элементов. Возможно, это потому, что у меня нет опыта в редактировании видео / аудио, поэтому я не совсем понимаю процесс. Если я просто хочу передать потоковый файл .webm, почему я должен делать такие вещи, как видеоконверт, x264enc и т. Д. Я могу подать файл .webm напрямую в свой браузер через apache, почему мне нужно использовать эти дополнительные элементы gstreamer для простого перемещения файл через простой конвейер? Przemek Lach 9 лет назад 0
Я попытался использовать ваш конвейер, и мне пришлось изменить несколько вещей: gst-launch-1.0 uridecodebin uri = file: ///home/ubuntu/g-streamer-lively/skyrim.webm name = decbin! очередь ! видеоконвертер! x264enc! mpegtsmux name = muxer! hlssink decbin. ! очередь ! аудиоконвертировать! avenc_aac! мультплексор. ! hlssink max-files = 5 playlist-root = http: //10.12.9.3/ location = / var / www / html / hlssink.webm. Теперь, когда я пытаюсь начать, я получаю сообщение об ошибке: ПРЕДУПРЕЖДЕНИЕ: ошибочный конвейер: ссылка без исходного элемента. Przemek Lach 9 лет назад 0
Вы не «двигаете» файл по конвейеру, он будет обрабатываться на каждом узле. Когда вы используете uridecodebin, он будет демультиплексировать и декодировать ваш входной файл, при условии, что у вас есть как видео, так и аудио, вы получите 2 выхода из него. Каждый из них перекодируется с новым форматом для слияния в mpegts, который обычно используется по протоколу HLS, который вы хотели использовать. thiagoss 9 лет назад 0
Ваш конвейер неверен, созданы два экземпляра hlssink, и я не уверен, что вы понимаете, что такое HLS и как он работает по выбранным вами параметрам. HLS создаст список воспроизведения небольших файлов, которые будут загружаться и воспроизводиться последовательно. thiagoss 9 лет назад 0
Привет спасибо за редактирование. Я пробовал ваш новый конвейер и получаю следующую ошибку: ОШИБКА: от элемента / GstPipeline: pipeline0 / avenc_aac: avenc_aac0: Кодек экспериментальный, но настройки не позволяют кодировщикам производить вывод экспериментального качества. Я пытался выяснить, где я могу установить «экспериментальное качество», но не смог его найти. Я пропускаю флаг или что-то? Przemek Lach 9 лет назад 0
Хорошо, так что я понял это. Просто нужно установить соответствие = -2 сразу после avenc_acc: ...! Соответствие avenc_aac = -2 ... Я не нашел этого ни в одной документации, просто повезло, прочитав форум. К сожалению, я до сих пор не получаю хороших результатов. Этот конвейер создает файл, который постоянно увеличивается в размере, и моя веб-страница с Przemek Lach 9 лет назад 0
Вам нужно правильно установить свойства hlssink, чтобы он делал вывод HLS в реальном времени. Проверьте свойства hstssink gst-inspect-1.0 и установите его в соответствии с желаемой конфигурацией. Например, вам не хватает целевой продолжительности для сегментов. thiagoss 9 лет назад 0

Похожие вопросы