如何通过GMainLoop访问管道?

时间:2014-11-01 10:58:42

标签: gstreamer

我有一个应用程序正在读取一个电影文件,我想在流到达流末尾时将其重置为初始位置。

所以我得到了通常的结构,我添加了一辆巴士来观看活动

bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);

这是一个bus_call函数的snipet

static gboolean bus_call (GstBus     *bus,
                      GstMessage *msg,
                      gpointer data)
{
    GMainLoop *loop = (GMainLoop *) data;

    switch (GST_MESSAGE_TYPE (msg))
    {
    case GST_MESSAGE_EOS:
        g_print ("End of stream\n");
            g_main_loop_quit (loop);
        break;
    default:
        break;
    }
    return TRUE;
}

所以现在当我到达流的末尾时,我就退出了循环。 我可以通过循环访问我的管道吗? 感谢您的阅读,如果我想做一些不可能的事情,请告诉我

ps:我想避免将我的管道设置为全局变量,或者将包含我的管道和循环的结构传递给bus_call,因为它感觉不对。

1 个答案:

答案 0 :(得分:1)

我的目标是在到达流末尾时自动回放。然后用户可以点击播放按钮,再次播放。

所以我绕开了问题并修改了播放按钮的回调功能。 现在它检测当前流的位置,并将其与流的长度进行比较。

gint64 streamPosition, streamLength;
GstFormat format = GST_FORMAT_TIME;

gst_element_query_position (pipeline, &format, &streamPosition);
gst_element_query_duration (pipeline, &format, &streamLength);
if (streamPosition==streamLength)
    stopIt(widget,pipeline);

如果当前流位置等于流长度,则意味着我们位于流的末尾。所以我调用一个函数来回放流....

感觉真的很生涩,但那是我现在所拥有的“最佳”解决方案。

我仍然愿意接受建议。