Как стать автором
Обновить

Комментарии 11

Спасибо за статью.
Одна просьба. Не могли бы Вы делать хоть кратенький анонс следующей статьи?
Можно было бы заранее «подбросить» вопросы.
Всегда пожалуйста!
В следующей статье я подумываю рассмотреть элементы для вывода потока (sink).
Есть ещё пара элементов очень полезных при разработке приложений: videotestsrc и audiotestsrc — бесконечные видео- и аудио-потоки.
Добавил их в статью. Спасибо что напомнили, а то совсем из головы вылетело.
Хочется увидеть описание общего подхода при построение пайпов: enc/dec, mux/demux, pay/depay. А то даже для простого воспроизведение h264 оказывается h264parse нужен. Я поэтому частично гуглю готовые пайпы, т.к. общей логики не понял пока.

Не подскажите, кстати как записать аудио и видео потоки в файл полученные с ip камеры через souphttp?

Добавлю ссылку на различие между 0.1 и 1.0, мне была полезна т.к. в сети много примеров для 0.1
gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-porting-1.0.html#section-porting-objects-1.0

И есть еще ключ -e у gst-launch, который позволяет корректно завершать видео поток при завершение по ctrl-c
Все это будет, про кодирование/декодирование потоков хочу рассказать через одну-две статьи, пока что по плану у меня устройства вывода (sink) и контейнеры (bins). К сожалению все никак не могу время для публикации статьи, уже почти два месяца прошло…
Для воспроизведения зачастую (мне так кажется, ибо это более разумно) используют decodebin в pipeline, но главной его особенностью является то, что аудио/видео потоки он может отдавать не в ожидаемом x-raw, а в том, в чем отдает его реальный декодер, а дальше уже искать нужный парсер/демуксер из имеющихся проверяя из возможности, о которых я как-нибудь попытаюсь рассказать, и если честно — сам еще не особо понял как они работают.

По поводу записи потоков в файл: на счет аудио ничего не скажу, ибо все IP-камеры которые мне попадались отдавали видео в Motion JPEG, в котором аудио-дорожки само-собой нет. Для записи mjpg можно использовать например такую команду:
gst-launch-1.0 souphttpsrc location="http://192.168.1.25:8080/video" ! decodebin use-buffering=true ! avimux ! filesink location=/tmp/1.avi

В случае если камера отдает видео в каком-то ином формате с аудио-дорожкой, можно попробовать что-то вроде:
gst-launch-1.0 souphttpsrc location="http://192.168.1.25:8080/video" ! decodebin use-buffering=true ! muxer. \
      lamemp3enc ! muxer. \
      avimux name=muxer ! filesink location=/tmp/1.avi

(примерно так, в случае чего можно указать нужные энкодеры для потоков и муксеры для сбора в нужный контейнер).
Мне казалось decodebin достаточно топорное решение, то есть его удобно использовать для разведки, чтобы получить список элементов, а затем собрать из тих нужный пайп, который гораздо гибче будет. Хотя, возможно, это излишне)

Вчера все-таки собрал;
gst-launch-1.0 souphttpsrc location=http://192.168.81.30/videostream.asf user-id=admin user-pw=1! asfdemux name=d d.! multiqueue! jpegdec! xvimagesink d.! multiqueue! adpcmdec! autoaudiosink

Тема очень хорошая, найдите время)
всё еще актуально кстати :)
ждем
Увы, я потерял интерес к gst, т.к. прекратил участие в разработке foobnix. Поэтому, скорее всего, продолжения не будет. И да, я очень сожалею об этом, но у меня нет ни сил, ни времени на продолжение этой серии статей.
Извините. :(
Виктор, спасибо за подробные статьи из курса «начальный» :)
Вы так уверенно отделили все входные параметры от остальных, да еще и исказали, что всего входных около тридцати. Скажите, вы это как сделали? Просто проштутдировав все маны? Пытаюсь сейчас найти какие-то упорядоченные списки и не нахожу ничего, кроме их мануала, на которые вы дали ссылки, но его струтура очень печальна, и для изучения не очень годится.
Может, вы все еще помните..?)

Пожалуйста :)


Как я это сделал… Да черт его знает как. Что-то понимал методом тыка, что-то выковыривал из материалов, на которые давал ссылки.
Но в целом происходило так — сначала понял как должен создаваться pipeline, это не сложно, достаточно иметь логическое мышление, чтобы понять что за источником должен быть декодер, за кучей источников должна быть куча декодеров за которыми должен быть муксер, за всем этим должен находиться sink, который либо выведет звук в колонки, либо картинку в окно, или же должен быть энкодер и filesink для сохранения потока в файл.
Ну а дальше уже разбирать каждый "блок" на "составляющие" — как соединять его с другими "блоками", какие у него есть аргументы, что нужно передавать в эти аргументы. Зачастую всю подобную информацию можно найти либо в официальной документации (которая да, не совсем хороша), либо на stackoverflow.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации