Соединение GStreamer с VLC с использованием библиотеки GstRTSP - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь написать приложение на C для подключения к потоку VLC RTSP (через RTP) и сохранения кадров в виде изображений.Я использую библиотеку GStreamer RTSP: https://gstreamer.freedesktop.org/documentation/gst-plugins-base-rtsp-1.0/index.html?gi-language=c

Я написал несколько простых кодов, представленных ниже, но приложение ожидает сообщения от VLC.Я не уверен, что это хороший способ подключения, но я застрял сейчас.Может быть, я должен сначала что-то отправить в VLC, но я не знаю, что и как это сделать.Может кто-нибудь помочь или указать некоторые ресурсы / примеры, как использовать GStreamer RTSP?

#include <gstreamer-1.0/gst/rtsp/rtsp.h>
#include <stdio.h>

int main() 
{
    GstRTSPUrl *gstUrl = NULL;
    const char* url = "rtsp://10.30.1.163:8554/test.sdp";
    if(gst_rtsp_url_parse(url, &gstUrl) == GST_RTSP_OK) {
        printf("URL PARSE");
        GstRTSPConnection *gstRTSPConnection = NULL;
        if(gst_rtsp_connection_create(gstUrl, &gstRTSPConnection) == GST_RTSP_OK) {
            printf("Connection created\n");
            GstRTSPMessage *message = NULL;
            gst_rtsp_message_new(&message);
            GstRTSPResult result = gst_rtsp_connection_connect_with_response(gstRTSPConnection, NULL, message);
            if(result == GST_RTSP_ETIMEOUT){
                printf("Timeout\n");
            } else if(result == GST_RTSP_OK) {
                printf("Connected\n");
                printf("%s\n", gst_rtsp_connection_get_ip(gstRTSPConnection));
                printf("Is tunelled: %d\n", gst_rtsp_connection_is_tunneled(gstRTSPConnection));
                gst_rtsp_connection_receive(gstRTSPConnection, message, NULL);
            }
        }
    }    

    return 0;
}

1 Ответ

0 голосов
/ 31 мая 2019

Хорошо.Я справлюсь с этим.Проблема заключалась в том, что мне сначала нужно было отправить сообщение на сервер в соответствии с протоколом RTSP.Решение ниже (с некоторыми сообщениями дампа):

#include <gstreamer-1.0/gst/rtsp/rtsp.h>
#include <stdio.h>

int main() 
{
    GstRTSPUrl *gstUrl = NULL;
    const char* url = "rtsp://10.30.1.163:8554";
    if(gst_rtsp_url_parse(url, &gstUrl) == GST_RTSP_OK) {
        printf("URL PARSE");
        GstRTSPConnection *gstRTSPConnection = NULL;
        if(gst_rtsp_connection_create(gstUrl, &gstRTSPConnection) == GST_RTSP_OK) {
            printf("Connection created\n");
            GstRTSPMessage *message = NULL;
            gst_rtsp_message_new(&message);
            GstRTSPResult result = gst_rtsp_connection_connect_with_response(gstRTSPConnection, NULL, message);
            if(result == GST_RTSP_ETIMEOUT){
                printf("Timeout\n");
            } else if(result == GST_RTSP_OK) {
                printf("Connected\n");
                printf("%s\n", gst_rtsp_connection_get_ip(gstRTSPConnection));
                printf("Is tunelled: %d\n", gst_rtsp_connection_is_tunneled(gstRTSPConnection));

                gst_rtsp_message_new(&message);
                gst_rtsp_message_init_request(message, GST_RTSP_DESCRIBE, "rtsp://10.30.1.163:8554/test.sdp");
                gst_rtsp_message_add_header(message, GST_RTSP_HDR_CSEQ, "1");
                printf("Message Type %d", gst_rtsp_message_get_type(message));


                gst_rtsp_message_dump(message);

                if(gst_rtsp_connection_send(gstRTSPConnection, message, NULL) == GST_RTSP_OK){
                    printf("Message sent");
                }else {
                    printf("Message not sent");
                }
                gst_rtsp_connection_receive(gstRTSPConnection, message, NULL);

                gst_rtsp_message_dump(message);
            }
        }
    }    

    return 0;
}
...