我有一个应用程序正在读取一个电影文件,我想在流到达流末尾时将其重置为初始位置。
所以我得到了通常的结构,我添加了一辆巴士来观看活动
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,因为它感觉不对。
答案 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);
如果当前流位置等于流长度,则意味着我们位于流的末尾。所以我调用一个函数来回放流....
感觉真的很生涩,但那是我现在所拥有的“最佳”解决方案。
我仍然愿意接受建议。