Правильный способ отправить сигнал EOS в GStreamer и получить его, используя C - PullRequest
0 голосов
/ 09 июля 2020

Я работаю над программой C, которая берет данные из фрагмента файла за фрагментом и отправляет их в объект appr c. Эта часть кода отлично работает, но я хочу использовать сигнал EOS. Итак, я пробовал разные способы, но все равно не могу поймать EOS.

Прежде всего нам нужно настроить GstBus для получения разных сообщений

_bus = gst_pipeline_get_bus (GST_PIPELINE (_pipeline));
_bus_watch_id = gst_bus_add_watch (_bus, bus_call, this);
gst_object_unref(_bus);

Обработчик function:

gboolean bus_call (GstBus *bus, GstMessage *msg, Session* user_data) {
    switch (GST_MESSAGE_TYPE (msg)) {

        case GST_MESSAGE_EOS:
            g_print ("End of stream\n");
            break;

        case GST_MESSAGE_ERROR: {
            gchar  *debug;
            GError *error;

            gst_message_parse_error (msg, &error, &debug);
            g_free (debug);
            g_printerr ("Error: %s\n", error->message);
            g_error_free (error);
            break;
        }
        default:
            g_print("got message %s\n", gst_message_type_get_name (GST_MESSAGE_TYPE (msg)));
            break;
    }

    return TRUE;
}

Обработчик принимает все типы сообщений, кроме EOS. Есть предложения?

После этого я попытался отправить сообщение EOS

Есть два разных способа: из appsr c и с помощью функции gst_element_send_event .

Первый

gboolean push_data(Session *) {
    if(!_stream_alive) {
        GstFlowReturn ret;
        g_signal_emit_by_name(_appsrc, "end-of-stream", &ret);

        if (GST_FLOW_OK != ret) {
            g_print("Error occurred! EOS signal cannot be sent!\n\r");
        }

        return FALSE;
    }

    push_data_all();

    return TRUE;
}

Второй

if (_pipeline != nullptr) {
        gboolean res = gst_element_send_event(_pipeline, gst_event_new_eos());
        if(!res) {
            g_print("Error occurred! EOS signal cannot be sent!\n\r");
        }
    }

Так что в любом случае я не получаю EOS в моей функции обработчика. Есть предложения?

Трубопровод

appsrc name=appsrc do-timestamp=true ! identity silent=false ! video/x-vp8 ! rtpvp8pay mtu=1400 ! application/x-rtp, encoding-name=VP8 ! webrtcbin

1 Ответ

0 голосов
/ 10 июля 2020

appsrc поставляется с собственным API для этого. Проверьте документацию для gst_app_src_end_of_stream().

Также имейте в виду, что шина получит EOS только после того, как все приемники будут EOS. Поскольку вы не раскрыли свой конвейер, мы ничего не можем сказать, может это быть проблемой или нет ..

...