当管道箱有更多的接收器

时间:2016-10-19 06:27:53

标签: gstreamer mpeg

我想播放一个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文件,使用相同的管道,而不删除宿元素。??

1 个答案:

答案 0 :(得分:1)

管道中的所有接收器必须接收数据,以便管道预卷,然后移动到播放状态。如果一个接收器没有接收数据,则所有其他接收器将等待接收数据。

预登记详情:https://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-preroll.txt

基本上,如果一个接收器只是在其他接收数据之前开始渲染,那么就意味着到达“后期”接收器的数据已经被丢弃,因为与第一个接收器上的数据同步播放它将为时已晚(它已经播放过了。)

简而言之,如果您打算使用它们,则只应向管道添加接收器。