Я работаю над программой 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