LINUX.ORG.RU

Задержка в gstreamer по rtsp


0

1

Здравствуйте! Пишу программу на gtk, в которой в drawing_area необходимо выводить изображение с видеосервера по rtsp. Использую библиотеку gstreamer. Но видео воспроизводится с задержкой примерно в 3 секунды. Хотя, например, в VLC проигрывателе в настройках есть такая опция rtsp-cashing, изменяя числовой параметр которой можно регулировать эту самую задержку. Вопрос: есть ли что-то подобное в gstreamer? И если нет, то посоветуйте плееры с такой функцией, код которых можно без особых проблем впихнуть в свое gtk-приложение. Спасибо.

Ответ на: комментарий от true_admin

Вот все функции проигрывателя:

void backend_set_window (gpointer window_)
{
    windowww = window_;
}

void backend_play (const char *uri)
{
    	pipeline = gst_pipeline_new ("gst-player");
    	bin = gst_element_factory_make ("playbin", "bin");
    	videosink = gst_element_factory_make ("ximagesink", "videosink");
    	g_object_set (G_OBJECT (bin), "video-sink", videosink, NULL);
    	gst_bin_add (GST_BIN (pipeline), bin);
        GstBus *bus;
        bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
        gst_object_unref (bus);
	g_object_set (G_OBJECT (bin), "uri", "rtsp://192.168.127.100:554/moxa-cgi/udpStreamer", NULL);
    	if (GST_IS_X_OVERLAY (videosink))
    	{
        gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (videosink), GPOINTER_TO_INT (windowww));
    	}
    	gst_element_set_state (pipeline, GST_STATE_PLAYING);
}


static gboolean inite (gpointer data)
{
    backend_set_window (GINT_TO_POINTER (GDK_WINDOW_XWINDOW (video_output->window)));
    backend_play (uri_to_play);
    return FALSE;
}

Функцию inite() вызываю в main-е с помощью g_timeout_add (50,(GSourceFunc) inite,video_output)

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

У playbin2 есть параметры буферизации, попробуй покрутить их. Я и про playbin что-то нашёл, но то ли это недокументированные фичи, то ли это уже вынесли...

true_admin ★★★★★ ()

playbin - устаревший элемент. Используй playbin2

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

Нашел такую вот терменальную команду, по которой видео воспроизводится без задержки:

gst-launch-0.10 rtspsrc location=rtsp://192.168.127.100:554/moxa-cgi/udpStreamer latency=0 ! decodebin ! autovideosink
Здесь при изменении latency меняется задежка. Теперь попробую как-нубудь модифицировать мой код...

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

Поменял функцию backend_play():

void
backend_play (const char *location)
{
    pipeline = gst_pipeline_new ("gst-player");

    source = gst_element_factory_make ("rtspsrc", "source");
    g_object_set (G_OBJECT (source), "location", "rtsp://192.168.127.100:554/moxa-cgi/udpStreamer", NULL);
    decoder = gst_element_factory_make("decodebin", "decoder");
    sink = gst_element_factory_make("autovideosink", "sink");

if (!pipeline || !source || !decoder || !sink) {g_print ("One element could not be created\n");}

        GstBus *bus;
        bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
        gst_object_unref (bus);
	gst_bin_add_many (GST_BIN (pipeline),source, decoder,  sink, NULL);

    if (GST_IS_X_OVERLAY (sink))
    {
	g_print("Зашел\n");
    gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (sink), GPOINTER_TO_INT (windowww));
    }

    gst_element_set_state (pipeline, GST_STATE_PLAYING);

}
Но не заходит в if (GST_IS_X_OVERLAY (sink)) {}. Если в строке sink = gst_element_factory_make() поменять «autovideosink» на «xvimagesink», то заходит, но видео ни в том ни в другом случае не воспроизводится.

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

Правильный ответ:

void
backend_play (const char *location)
{
GstElement *pipeline=gst_parse_launch("rtspsrc location=rtsp://192.168.127.100:554/moxa-cgi/udpStreamer latency=0 ! decodebin2 ! xvimagesink name=sink",NULL);
GstElement *sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (sink), GPOINTER_TO_INT (windowww));

gst_element_set_state (pipeline, GST_STATE_PLAYING);
}

Vitaly1988 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.