无法播放 ts 文件,当 pipeline bin 有更多的接收器时

Unable to play ts file, when pipeline bin has more number of sinks

我想播放一个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 中添加了两个 videosinks,如果 ts 文件有两个视频那么它工作正常。

但是如果 ts 文件只有一个视频,那么在 ximagesink 中 window 会暂停。 为了播放那个 ts 文件,我必须删除另一个接收器元素,它不接收数据应该从 bin 中删除。

在这种情况下,我无法收到流结束消息。

为什么会这样?有没有其他方法可以使用相同的管道播放这两个 ts 文件,而无需删除接收器元素。??

管道中的所有接收器都必须接收数据,以便管道预滚动,然后进入播放状态。如果一个接收器没有接收数据,所有其他接收器将等待它接收。

关于预滚动的详细信息:https://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-preroll.txt

基本上,如果一个接收器在其他接收器接收数据之前开始渲染,这意味着到达 'late' 接收器的数据已经被丢弃,因为与数据同步播放为时已晚在第一个接收器上(已经播放过)。

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