用C++在GStreamer中发送和接收EOS信号的正确方法 [英] Proper way to send an EOS signal in GStreamer and receive it using C

查看:11
本文介绍了用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆