用C++在GStreamer中发送和接收EOS信号的正确方法 [英] Proper way to send an EOS signal in GStreamer and receive it using C
本文介绍了用C++在GStreamer中发送和接收EOS信号的正确方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在开发一个C程序,该程序逐个从文件块中获取数据并将其发送到appsrc对象中。这部分代码工作很好,但我想使用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);
处理程序函数:
gboolean bus_call (GstBus *bus, GstMessage *msg, Session* user_data) {
switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_EOS:
g_print ("End of stream
");
break;
case GST_MESSAGE_ERROR: {
gchar *debug;
GError *error;
gst_message_parse_error (msg, &error, &debug);
g_free (debug);
g_printerr ("Error: %s
", error->message);
g_error_free (error);
break;
}
default:
g_print("got message %s
", gst_message_type_get_name (GST_MESSAGE_TYPE (msg)));
break;
}
return TRUE;
}
处理程序接受除EOS之外的所有消息类型。有什么建议吗?
之后,我尝试发送EOS消息
有两种不同的方法:从appsrc和使用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!
");
}
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!
");
}
}
因此,在任何情况下,我都不会在我的处理函数中获得EOS。有什么建议吗?
管道
appsrc name=appsrc do-timestamp=true ! identity silent=false ! video/x-vp8 ! rtpvp8pay mtu=1400 ! application/x-rtp, encoding-name=VP8 ! webrtcbin
推荐答案
appsrc
提供了自己的接口。检查gst_app_src_end_of_stream()
的文档。
还请记住,只有在所有接收器都是EOS之后,总线才会接收EOS。由于您没有透露您的渠道,如果这可能是一个问题或不是问题,我们无法透露任何信息。
这篇关于用C++在GStreamer中发送和接收EOS信号的正确方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文