Потоковое видео: вещание с N810

Захотелось забросить свою нокию высоко в небо и посмотреть, как мы выглядим с высоты птичьего полёта.
Как забросить — понятно: самый простой вариант — взять воздушный змей побольше.
Как посмотреть — вопрос немного озадачил.
Что выяснилось:
  • gstreamer предоставляет набор плагинов, которые можно связывать в цепочки, подавая выход одного на вход другого. Среди плагинов есть простые базовые элементы: ввод/вывод из файлов ({file,fd}{src,sink}) и по сети ({tcp{client,server},udp}{src,sink}), захват видео через интерфейс video for linux (v4l2src), вывод видео средствами X (ximagesink). Есть кодировщики и декодировщики множества мультимедийных форматов — я поэкспериментировал с mpeg4video, h263 и theora. Есть средства формирования и разбора потоков RTP. Есть средства автоматического определения формата потока и декодирования (decodebin).
  • довольно свежий gstreamer входит в стандартную прошивку OS2008. Для полноты консольной радости нужно установить пакет gstreamer-tools, содержащий утилиты gst-launch и gst-inspect.

Отлично.

Первая попытка


[n810]$ gst-launch -v v4l2src ! \
    capsfilter caps="video/x-raw-yuv, format=(fourcc)UYVY, framerate=(fraction)8/1, width=(int)640, height=(int)480" ! \
    autovideosink

Фильтр capsfilter задает параметры видеозахвата. Их можно менять в разумных пределах, если видео невозможно захватить с такими параметрами, gstreamer пишет ближайшие допустимые.

Передача по сети


Хорошо было бы теперь передать это по сети. Простейший вариант выглядит так (IP машины desktop 192.168.1.254):

[desktop]$ gst-launch -v tcpserversrc host=0.0.0.0 protocol=gdp ! autovideosink

[n810]$ gst-launch -v v4l2src ! \
    capsfilter caps="video/x-raw-yuv, format=(fourcc)UYVY, framerate=(fraction)8/1, width=(int)320, height=(int)240" ! \
    tcpclientsink host=192.168.1.254 protocol=gdp

Параметр protocol=gdp добавляет к данным передаваемым по сети формат потока: дело в том, что в цепочку могут быть объединены только фильтры, имеющие выход и вход совместимого формата. tcp*src с этим параметром на приемной стороне имеет на выходе тот же формат, что и tcp*sink на передающей стороне на входе.

Простое решение, но через wifi работает тяжко: 7 мегабит, 600 пакетов в секунду — ощутимая нагрузка. 640х480 уже заметно тормозит.

Очевидно, следующий шаг — добавить сжатие.


Пусть это будет mpeg4:

[desktop]$ gst-launch -v tcpserversrc host=0.0.0.0 protocol=gdp ! decodebin ! autovideosink

[n810]$ gst-launch -v v4l2src ! \
    capsfilter caps="video/x-raw-yuv, format=(fourcc)UYVY, framerate=(fraction)8/1, width=(int)320, height=(int)240" ! \
    hantro4200enc ! tcpclientsink host=192.168.1.254 protocol=gdp

Отлично, всё в mpeg-кубиках, но 110 килобит и 30 пакетов в секунду (:
Какие еще существенные минусы этой схемы? TCP/IP: потеря пакетов приводит к повторной передаче уже неактуальной картинки, а значит к задержкам. А разрыв соединения лечится только перезапуском сервера и клиента.

RTP


Значит нужно прикрутить RTP:

[desktop]$ gst-launch -v gstrtpbin name=rtpbin \
    udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263" port=5000 ! \
    rtpbin.recv_rtp_sink_0 rtpbin. ! \
    rtph263depay ! decodebin ! autovideosink

[n810]$ gst-launch -v gstrtpbin name=rtpbin \
  v4l2src ! \
  capsfilter caps="video/x-raw-yuv, format=(fourcc)UYVY, framerate=(fraction)8/1, width=(int)320, height=(int)240" ! \
  hantro4200enc stream-type=5 bit-rate=512 ! rtph263pay ! \
  rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! \
  udpsink port=5000 host=192.168.1.254

Что изменилось?
  • mpeg4 превратился в h263. Почему-то ffmpeg с десктопной машины не смог расшифровать присылаемые кадры от hantro4200. На передающей стороне это выразилось параметром stream-type=5. Чтобы было меньше кубиков добавился bit-rate=512.
  • Добавился rtpbin, используемый через именованные входы и выходы — наше видео идет по нулевому каналу. Конверсию сжатого видеопотока в RTP и обратно выполнили rtph263pay и rtph263depay.
  • tcp превратился в udp. На приемной стороне caps="..." вобрал в себя недостающую для восстановления потока информацию; эту строчку напечатал rtph263pay на передающей стороне.

Какой эффект?
  • Временная потеря связи не рвет соединения. Соединения-то нет (:
  • Просмотр можно останавливать и перезапускать. На сервер видео это никак не влияет.
  • Опоздавшие кадры не тормозят показ кадров пришедших вовремя.


Что осталось?


  • Непонятные трения между кодировщиками: mpeg4video через RTP не просматривается. Сжатие с помощью theora требует конверсии цветов, но цепочка
    v4l2src ! capsfilter ! ffmpegcolorspace ! theoraenc
    дает на выходе черный квадрат. При этом просмотр видео закодированного theora проблем не вызывает.
  • Может быть прикрутить multicasting. В моей конфигурации он конечно пока не нужен. Но было бы забавно посмотреть.
  • Сегодня в Питере дождь. Для змея погода нелётная. Ждём солнца и ветра (:


Справка по плагинам gstreamer на официальном сайте: gstreamer.freedesktop.org/documentation/
Список установленных плагинов и справка по их параметрам — gst-inspect

P.S. Получилась эдакая хвалебная ода gstreamer'у. Откровенно порадовал инструмент (:
+24
2 августа 2009, 23:49
11
jcmvbkbc 24,0

комментарии (25)

НЛО прилетело и опубликовало эту надпись здесь
–1
jcmvbkbc #
Выложу как слетаем.
+2
TMC #
А Qik'а для вашей нокии нету? :-)
0
jcmvbkbc #
Даже и не знаю. Полагаю что нет, ибо java. И qik.com отнюдь не проясняет.
+1
msalomatin #
Проясняет – qik.com/info/supported_phones. Но вашей модели в списке нет. :(
+4
skfd #
Это же Kite photography!
0
gerchik #
Отлично. Спасибо за линк.
Все бы добавляли к постам вот такие ссылки на интересные практические работы.
0
thevery #
к слову, vlc умеет всё то же самое.
или vlc нету под maemo?
+3
jcmvbkbc #
Вот здесь говорят что есть.

А я начал с gstreamer потому что всё равно было с чего начать, а он почти полностью присутствует в стандартной прошивке. Специально я ставил только gstreamer0.10-tools, чтобы получить gst-launch.

Резюме: велосипед не изобретен, просто собран из имеющихся деталей (:
+2
Vasily_Pupkin #
VLC собрать впринципе не проблема, но если решение собрано на базовом gstreamer — это на много лучше, т.к. по сути это офф. интерфейс работы с ММ данными на таблетках.
+1
nitro80 #
Вы маньяк, в хорошем смысле слова :)
На какую высоту планируете поднять?
0
jcmvbkbc #
Метров 200-300. Обычно, чем выше тем устойчивее. Но вот змея с такой блямбой я ещё ни разу не запускал.
0
nitro80 #
Жду теперь с нетерпением фоток :)
+1
msalomatin #
Змей подойдет почти любой, кроме самых детских моделей. Используйте те, которые с двух рук управляются. Тогда и видео будет более интересным, и подъёмной силы хватит. Заодно аппарат сбережёте. Эти змеи легко посадить без падения.
0
nitro80 #
мы сейчас в поисках аппарата для подъёма. пока есть только iphone (но его надо у участкового выпросить :) )
0
mimicria #
Планировали примерно тоже самое, но не со змеем, а с радиоуправляемым вертолетиком. Интересно посмотреть результат
+3
Vasily_Pupkin #
Опа. Спасибо. Полезно. А вообще тут кого то интересует n810? Могу на досуге написать пару информационных статеек по эдакому тюнингу операционки и ПО.
0
Biga #
Пишите. Только больше интересно, как этот девайс можно использовать в повседневной жизни, а то он у меня лежит на полке неделями.
0
Mezomish #
>А вообще тут кого то интересует n810? Могу на досуге написать пару информационных статеек по эдакому тюнингу операционки и ПО.

Было бы интересно.
+1
TWINc #
Вы там ничего не увидите. Камера у нокии просто отвратительная.
0
Barmaleikin #
Поддерживаю. Изображение-то будет, но из-за отсутствия стабилизации, фиг на нём что разберёшь.
0
Mezomish #
Ну не то чтобы прям таки отвратительная… по крайней мере для своих целей (общения по GTalk-у) она вполне подходит.
Чего-нибудь — да увидит. Основной поинт, как я понял, вовсе не в том, чтобы получить супер-пупер-качественное видео или фотки ;)
+2
Bentrizen #
я понимаю что речь шла о превращении имеющегося устройства (N810) в заменитель дистанционной камеры и вся прелесть в программинге устройства, но может быть решение должно быть более осмысленным — вот например сверхлегкая камера (http://www.shocker.ru/7/7.html) — вес 16г (+батарейка еще потребуется) передает до 400 метров (сигнал PAL/NTSC) можно и на змея и на модельку самолета/вертолета небольшую поставить…
0
flaresun #
Что-то стоимость у этой камеры постоянно скачет. Год-полтора назад приходило много спама с предложением купить такую камеру. Цена там была что-то типа 4800-5400 руб., при этом в магазине она на тот момент стоила со всеми наценками 1200 руб. Жаль, что сейчас эту камеру за такую цену не найти…
0
nitro80 #
а ebay?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.