Вопрос или проблема
Я новенький в GStreamer и пытаюсь создать несколько простых конвейеров с помощью gst-launch-1.0. У меня возникают трудности с тем, какие элементы должны быть вместе. Например, я хочу транслировать видео в формате webm в тег video 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:
<video src="http://10.12.9.3/hlssink.webm" controls>
Так что этот конвейер не запускается, и я получаю следующую ошибку:
WARNING: erroneous pipeline: could not link playbin0 to hlssink0
Это говорит мне, что я не могу соединить эти два элемента. Хорошо, но где мне посмотреть, какие другие элементы нужно включить в мой конвейер, чтобы это работало?
Заранее спасибо.
Я думаю, вам стоит остановиться и немного прочитать документацию gstreamer, чтобы понять, как это работает. GStreamer – это фреймворк для построения графа для обработки данных. Вы можете найти руководство здесь: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html
Playbin – это специальный элемент (бин), который будет собирать внутренний конвейер для вас. Playbin не будет экспонировать никакие связывающие пэды, поскольку он предназначен для создания полного конвейера воспроизведения, именно поэтому вы не можете соединить его с hlssink.
Вы можете использовать другие элементы, чтобы создать конвейер для транскодирования вашего входного webm в hlssink, например, вы можете использовать uridecodebin, который является другим бин, который автоматически создаст декодирующий конвейер для любых медиа, которые вы используете (при условии, что у вас есть подходящие плагины для этого). Что-то вроде:
gst-launch-1.0 uridecodebin uri=<youruri> name=decbin ! queue ! videoconvert ! x264enc ! tsmux name=muxer ! hlssink decbin. ! queue ! audioconvert ! faac ! muxer.
Я этого не тестировал, но что-то подобное должно сработать для преобразования вашего входного потока в mpegts с использованием H264 и AAC, например, и передачи данных для hlssink.
Чтобы проверить, какие элементы у вас есть на вашей системе, используйте инструмент gst-inspect-1.0. Он перечислит все элементы, если вы не передадите ему аргумент, или даст вам подробности о конкретном элементе, если вы его укажете, например:
gst-inspect-1.0 hlsssink
ИЗМЕНЕНИЕ: исправление конвейера, который вы предложили в комментариях
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.
Ответ или решение
Чтобы подключить элемент playbin к hlssink в GStreamer, важно понимать, что playbin является специальным элементом, который самостоятельно создаёт внутренний пайплайн для воспроизведения медиа. Он не предоставляет открытых пэдов для соединения с другими элементами, поэтому нельзя напрямую соединить playbin с hlssink. Вместо этого необходимо использовать другой элемент, например uridecodebin, который может декодировать любые источники медиа и создавать соответствующий пайплайн.
Вот пример, как можно построить пайплайн, который будет считывать ваш видеофайл и передавать данные в hlssink:
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=http://10.12.9.3/ location=/var/www/html/hlssink/segment%05d.ts decbin. ! queue ! audioconvert ! faac ! muxer.
Объяснение пайплайна:
-
uridecodebin: Этот элемент автоматически создаст нужный пайплайн для декодирования вашего WebM-файла.
-
name=decbin: Даем название потоку, чтобы можно было к нему обращаться позже.
-
queue: Добавляем очереди, чтобы предотвратить отсечку данных при обработке.
-
videoconvert: Преобразует видео в нужный формат.
-
x264enc: Кодирует видео в формат H.264, который поддерживается большинством браузеров.
-
mpegtsmux: Мультиплексор для объединения аудио и видео потоков.
-
hlssink: Записывает сегменты видео и создаёт плейлист для HLS.
max-files=5
— максимальное количество сегментов.playlist-root=http://10.12.9.3/
— базовый URL для доступа к сегментам.location=/var/www/html/hlssink/segment%05d.ts
— форматирование имени файлов сегментов.
-
decbin. ! queue ! audioconvert ! faac ! muxer.: Это часть, которая обрабатывает аудиопоток, выполняет конвертацию и кодирование в AAC, а затем передаёт в мультиплексор.
Важно, чтобы путь к файлам, указанным в параметрах, был доступен на сервере, на котором находится ваш веб-сервер, чтобы браузер мог получить доступ к сегментам с использованием указанного URL.
Проверка доступных элементов
Чтобы убедиться, что все необходимые плагины установлены на вашем сервере, используйте команду gst-inspect-1.0
. Это поможет вам убедиться, что элементы, такие как uridecodebin
, x264enc
, faac
и hlssink
, доступны:
gst-inspect-1.0
Если какой-то элемент отсутствует, убедитесь, что соответствующий плагин установлен в системе.
Теперь, когда вы создадите пайплайн, чтобы он начал работать, откройте ваш HTML-файл с тегом <video>
:
<video src="http://10.12.9.3/hlssink/playlist.m3u8" controls>
</video>
Это позволит вашему браузеру воспроизводить поток HLS, который вы создали.
Всё это позволит вам успешно стримить ваше видео из файла WebM в формате HLS через GStreamer.