LINUX.ORG.RU

GStreamer 1.0, gst-rtsp-server, стриминг вебкамеры в RTSP, дубль 2

 , ,


0

2

Суть такова. Собрал из гит репов последний GStreamer(1.0.9), а так же все плагины (base, good, bad, ugly, libav) и rtsp-server. Установил (make install). Модифицировал один из примеров(gst-rtsp-server/examples) простейшего сервера на стриминг с вебки - поменял строчку gst_rtsp_media_factory_set_launch()... на найденную в на одном из форумов:

gst_rtsp_media_factory_set_launch (factory,
                                     "( "
                                     "uvch264src device=/dev/video0 name=src auto-start=true iframe-period=1000 src.vidsrc ! queue ! video/x-h264,width-1920,height=1080,framerate=30/1 ! h264parse ! rtph264pay pt=96 name=pay0 src.vfsrc ! queue ! video/x-raw,width=432,height=240,framerate=30/1 ! xvimagesink "
                                     ")");

Всё скомпилилось, запустилось, но при попытке подключиться к вещанию в логи сыпятся ошибки и подключения не происходит:

0:00:02.334165091   [335m 6880  [00m  0x9362af0   [31;01mERROR    [00m   [00;01;37;41m        GST_PIPELINE ./grammar.y:672:priv_gst_parse_yyparse:  [00m no element "uvch264src"
0:00:02.334239918   [335m 6880  [00m  0x9362af0   [31;01mERROR    [00m   [00;01;37;41m        GST_PIPELINE ./grammar.y:942:priv_gst_parse_launch:  [00m Unrecoverable syntax error while parsing pipeline ( uvch264src device=/dev/video0 name=src auto-start=true iframe-period=1000 src.vidsrc ! queue ! video/x-h264,width-1920,height=1080,framerate=30/1 ! h264parse ! rtph264pay pt=96 name=pay0 src.vfsrc ! queue ! video/x-raw,width=432,height=240,framerate=30/1 ! xvimagesink )

** (gstrtspserver-test1_0:6880): CRITICAL **: could not parse launch syntax (( uvch264src device=/dev/video0 name=src auto-start=true iframe-period=1000 src.vidsrc ! queue ! video/x-h264,width-1920,height=1080,framerate=30/1 ! h264parse ! rtph264pay pt=96 name=pay0 src.vfsrc ! queue ! video/x-raw,width=432,height=240,framerate=30/1 ! xvimagesink )): no element "uvch264src"

** (gstrtspserver-test1_0:6880): CRITICAL **: could not create element
0:00:02.334412208   [335m 6880  [00m  0x9362af0   [31;01mERROR    [00m   [00m          rtspclient rtsp-client.c:584:find_media:  [00m client 0x94eec18: can't create media
0:00:02.334508028   [335m 6880  [00m  0x9362af0   [31;01mERROR    [00m   [00m          rtspclient rtsp-client.c:1724:handle_describe_request:  [00m client 0x94eec18: no media

(gstrtspserver-test1_0:6880): GLib-CRITICAL **: unblock_source: assertion `!SOURCE_DESTROYED (source)' failed

(gstrtspserver-test1_0:6880): GLib-CRITICAL **: unblock_source: assertion `!SOURCE_DESTROYED (source)' failed

До этого использовал GStreamer 0.10, там стримилось с такой строкой:

    gst_rtsp_media_factory_set_launch (factory,
                                       "( "
                                       "v4l2src device=/dev/video0 "
                                       "! video/x-raw-yuv,width=352,height=288,framerate=30/1 "
                                       "! ffmpegcolorspace "
                                       "! videoscale "
                                       "! ffenc_mpeg4 tune=zerolatency byte-stream=true threads=2 speed-preset=3 "
                                       "! ffenc_mpeg4 tune=zerolatency byte-stream=true bitrate=1050 threads=0 speed-preset=3"
                                       "! v4l2sink "
                                       "! rtpmp4vpay pt=96 name=pay0 "
                                       ")");

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

Так кто-нибудь может быть знает как это дело завести? Может какие мысли есть? Как понимаю no element «uvch264src» означает что элемент не найден, но как это исправить не знаю.

Сразу оговорюсь, vlc и ffmpeg(ffserver/avserver) пробовал, не впечатлило, не подходит вобщем. Нужно именно решение с GStreamer 1.0+

gst_parse_yyparse: [00m no element «uvch264src»

Эээ... Я ничего не смыслю в данной теме, но выхлоп вроде ясно говорит, что система не знает, что такое «uvch264src»

pathfinder ★★★★ ()
Последнее исправление: pathfinder (всего исправлений: 1)

Попробуй заменить:
- uvch264src
на:
v4l2src (lin)
d3dvideosrc (win)
autovideosrc (общее)
videotestsrc (для тестов)

- ffmpegcolorspace
на:
videoconvert
autovideoconvert

- capsfilter они тоже перекроили в версии 1.0,
вместо «video/x-vp8,width=320,height=240,framerate=30/1» в 0.1 щас надо писать что-то типа: «video/x-raw, format=(string)I420, width=(int)320, height=(int)240, framerate=(fraction)30/1»

Щас гстример еще сильнее приколачивается гвоздями к гному, там идёт какая-то глобальная перестройка, некоторые функции (по крайней мере через обвязку руби) вобще перестали работать.

Я пытался выйти на разрабов. Надо признать что разрабы самого гстримера (немцы) довольно отзывчивые, и подсказывают как могут. Но например, до разрабов обвязки для руби я так и не достучался. Предыдущий чувак (итальяшка) забросил обвязку, а новые не откликаются. Уже всерьез подумываю свалить на ffmpeg, хотя немцы уверяют что он не такой кроссплаформенный.. вобщем, беда с этим переходом..

Novator ★★★★★ ()
Ответ на: комментарий от Novator

На v4l2src пробовал менять, что-то не завелось тоже.

А с uvch264src - оказалось что когда собирал bad плагины не был установлен libudev-dev, поставил, запустил скрипт autogen, пересобрал плагины. Попробовал запустить и на uvch264src перестало ругаться. Но правда ругается теперь дальше.

Код строки media_factory:

gst_rtsp_media_factory_set_launch (factory,
                                     "( "
                                     " uvch264src device=/dev/video0 ! queue ! "
                                     " video/x-h264,width=640,height=480,framerate=30/1  ! rtph264pay pt=99 name=pay0 "
                                     ")");

Выхлоп:

0:00:02.407363901   [334m11229  [00m  0x8f98af0   [31;01mERROR    [00m   [00m          rtspclient rtsp-client.c:602:find_media:  [00m client 0x9090c10: can't prepare media
0:00:02.409006321   [334m11229  [00m  0x8f98af0   [31;01mERROR    [00m   [00m          rtspclient rtsp-client.c:1724:handle_describe_request:  [00m client 0x9090c10: no media

(gstrtspserver-test1_0:11229): GLib-CRITICAL **: unblock_source: assertion `!SOURCE_DESTROYED (source)' failed

(gstrtspserver-test1_0:11229): GLib-CRITICAL **: unblock_source: assertion `!SOURCE_DESTROYED (source)' failed

Сейчас буду копать дальше, попробую твои рекомендации для capsfilter и прочее.

Насчет ffmpeg тоже не всё там хорошо, на прошлой работе использовали его, курение сорцов вызывает рак мозга ну вобщем тоже проблем хватает. Хотя если пользоваться более-менее конечными продуктами, то попроще немного становится. Но вот опять же например так просто стрим сервер не сделать(по сравнению с гстримером), придется покодить. Готовый ffserver лишь демонстрация работы и на что-то серьезное не пригоден, как мне показалось.

Blastbit ()
Ответ на: комментарий от Novator

о чудо, запустилось таки, с такими настройками:

    gst_rtsp_media_factory_set_launch (factory,
                                       "( "
                                       "v4l2src device=/dev/video0 "
                                       "! video/x-raw, format=(string)I420, width=(int)320, height=(int)240, framerate=(fraction)30/1"
                                       "! x264enc "
                                       "! rtph264pay pt=96 name=pay0 "
                                       ")");

С uvch264src не работало похоже из-за того, что камера не может отдавать видео в h264, а только в mjpeg и YUYV. Видимо пример тот из которого я брал строку был для камеры с хардварным енкодером.

Единственное что видео стримится с задержкой в секунды 3, но я думаю это можно будет подправить настройками енкодера. А autoconvert(и videoconvert) не подцепился, почему то, но вроде и без него запахало.

Если есть какие-то рекомендации по поводу уменьшения задержки, то буду признателен. На версии 0.10 удалось сделать задержку в 800-1500 мс с помощью настроек енкодера:

x264enc cabac=false tune=zerolatency byte-stream=true threads=4 speed-preset=3 

Но из магической строки я понял только: tune=zerolatency - не ставит искуственной задержки, threads=4 - обработка в 4 потока(интересно как будет работать если ядер меньше). Но я не уверен что верно понял.

Blastbit ()
Ответ на: комментарий от Blastbit

В версии 0.1 мне помогало «v4l2src decimate=3»,
но в версии 1.0 похоже «decimate» убрали. С задержкой боролся отбрасыванием «лишних» кадров используя примерно такую цепочку:
«v4l2src ! videorate ! video/x-raw, format=(string)I420, width=(int)320, height=(int)240, framerate=(fraction)25/24 !»

т.е. добавлял «videorate» и играл параметром «framerate».

Что касается ffmpeg, то мне не нужна высокоуровневая работа с медиа (rtsp-сервера и т.п.), нужен тока захват с устройств, кодирование, раскодирование и вывод на устройства.

Novator ★★★★★ ()
Последнее исправление: Novator (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.