无法播放 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' 接收器的数据已经被丢弃,因为与数据同步播放为时已晚在第一个接收器上(已经播放过)。
简而言之,如果您打算使用接收器,您应该只将它们添加到管道中。
我想播放一个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' 接收器的数据已经被丢弃,因为与数据同步播放为时已晚在第一个接收器上(已经播放过)。
简而言之,如果您打算使用接收器,您应该只将它们添加到管道中。