我想播放一个ts文件,它有一两个视频。
我创建了一个管道,并且每当在demux函数的回调中出现pad时,动态地将元素与demux链接。
如下图所示。
if(g_str_has_prefix(pad_name, "video"))
{
UU_PRINT("Player :: In dynamic ADDING DL PAD %s DLLinkFlag %d, LinkFlag %d", pad_name, pObjPlayer->mDlLinkFlag, linkFlag);
if(!linkFlag)
{
GstPad *dlsink = gst_element_get_static_pad(pObjPlayer->mpDlQueue, "sink");
}
else
{
GstPad *dlsink = gst_element_get_static_pad(pObjPlayer->mpIrQueue, "sink");
}
if(GST_IS_PAD(DeMuxPad) && GST_IS_PAD(dlsink))
{
if(gst_pad_link(DeMuxPad, dlsink) != GST_PAD_LINK_OK)
{
UU_PRINT( "Player :: Failed to Link Demux with DL Video Queue !!");
}
else
{
linkFlag = 1;
}
}
最初,我添加了两个视频链接到Pipeline BIN,如果ts文件有两个视频,那么它工作正常。
但是如果ts文件只有一个视频,那么在ximagesink窗口中会暂停。 为了播放那个ts文件,我必须删除另一个不接收数据的宿元素,应该从bin中删除。
在这种情况下,我无法收到流媒体的消息。
为什么会这样?有没有其他方法来播放这两个ts文件,使用相同的管道,而不删除宿元素。??
答案 0 :(得分:1)
管道中的所有接收器必须接收数据,以便管道预卷,然后移动到播放状态。如果一个接收器没有接收数据,则所有其他接收器将等待接收数据。
预登记详情:https://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-preroll.txt
基本上,如果一个接收器只是在其他接收数据之前开始渲染,那么就意味着到达“后期”接收器的数据已经被丢弃,因为与第一个接收器上的数据同步播放它将为时已晚(它已经播放过了。)
简而言之,如果您打算使用它们,则只应向管道添加接收器。