无法添加元素,BIN,在回调函数“垫添加”
问题描述:
我想创建一个动态的管道,这需要根据阅读文件“的.ts”无法添加元素,BIN,在回调函数“垫添加”
在阅读进行修改,文件我可能只有一个视频流,或者它可能是两个视频,或者它也可能有文本数据。
如果该文件有两个视频,那么如果我为文本数据添加两个videosinks和一个appsink,那么我无法播放该视频。
然后,我尝试在回调函数中添加该元素,然后每当文本数据到来时,它都不起作用。
在这里我附上了代码。
void uuCMediaPlayer::DemuxLinking(GstElement *Demux, GstPad *DeMuxPad, gpointer data)
{
uuCMediaPlayer* pObjPlayer = (uuCMediaPlayer *)data;
int linkFlag = 0;
char* pad_name = gst_pad_get_name(DeMuxPad);
UU_PRINT("Player :: In dynamic ADDING PAD %s", pad_name);
if(g_str_has_prefix(pad_name, "metadata"))
{
if(!gst_bin_add(GST_BIN(pObjPlayer->mpPlayerPipe), pObjPlayer->mpMetaSink))
printf"Failed to Add Meta Sink !!");
printf(" Player :: In dynamic ADDING Meta PAD %s", pad_name);
GstPad *metasink = gst_element_get_static_pad(pObjPlayer->mpMetaQueue, "sink");
if(GST_IS_PAD(DeMuxPad) && GST_IS_PAD(metasink))
{
if(gst_pad_link(DeMuxPad, metasink) != GST_PAD_LINK_OK)
{
UU_PRINT("Player ::Failed to Link Demux with Meta Queue !!");
pObjPlayer->mRunFlag = 0;
}
else
{
gst_element_link_many(pObjPlayer->mpMetaQueue, pObjPlayer->mpMetaCapsFilter,
pObjPlayer->mpMetaKlvParse, pObjPlayer->mpMetaParseCapsFilter,
pObjPlayer->mpMetaSubParse, pObjPlayer->mpMetaSink, NULL);
//gst_bin_add_many(GST_BIN(pObjPlayer->mpPlayerPipe), pObjPlayer->mpMetaSink, NULL);
}
}
else
{
UU_PRINT("Player ::Failed to Link Demux with Meta Queue !!");
pObjPlayer->mRunFlag = 0;
}
}
else if(g_str_has_prefix(pad_name, "video"))
{
UU_PRINT("Player :: In dynamic ADDING VIDEO PAD %s", pad_name);
if((!pObjPlayer->mDlLinkFlag) && (!linkFlag))
{
GstPad *dlsink = gst_element_get_static_pad(pObjPlayer->mpDlQueue, "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 !!");
pObjPlayer->mRunFlag = 0;
}
else
{
/** adding elements to bin */
gst_bin_add_many(GST_BIN(pObjPlayer->mpPlayerPipe), pObjPlayer->mpDLVideoDecoder,
pObjPlayer->mpDLVideoParse, pObjPlayer->mpDLVideoSink,
NULL);
gst_element_link_many(pObjPlayer->mpMetaQueue, pObjPlayer->mpDLVideoDecoder,
pObjPlayer->mpDLVideoParse, pObjPlayer->mpDLVideoSink,
NULL);
}
}
else
{
UU_PRINT("Player :: Failed to Link Demux with DL Video Queue !!");
pObjPlayer->mRunFlag = 0;
}
}
else if((!pObjPlayer->mIrLinkFlag) && (!linkFlag))
{
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 !!");
pObjPlayer->mRunFlag = 0;
}
else
{
pObjPlayer->mIrLinkFlag = 1;
linkFlag = 1;
}
}
else
{
UU_PRINT("Player :: Failed to Link Demux with DL Video Queue !!");
pObjPlayer->mRunFlag = 0;
}
}
else
UU_PRINT("Player :: Ignoring the Video Stream !!");
}
在地方的
pObjPlayer->mDlLinkFlag = 1;
linkFlag = 1;
我加入videodecoder和xvimagesink元素对管道箱。并且,
我试图链接tsdemux与视频解码器,然后xvimagesink。
但是视频不播放。如果我添加回调函数以外的,那么它工作正常。
答
我有一个类似的问题,使用gst1-java-core java绑定。我必须在我添加到管道回调中的管道上调用play()。我不确定在非java代码中确切的方法调用是什么。
也许在https://groups.google.com/d/msg/gstreamer-java/Zvf-3ZAhAwg/fekxcsJDCAAJ讨论的其他内容可以帮助你取得进展。
我认为这是错误的方法,你应该听取分路器的焊盘添加信号,并在每个新的焊盘检查其上限,然后添加/链接任何你需要的垫 - 这是标准的方法,并有教程 - 使用你最喜欢的搜索引擎,HTH – nayana
哦,这是在垫添加..对不起,我读了错误的问题..功能的名称是相当混乱 – nayana
那好吧,我的方法是正确的或不?这种方法有什么错误吗? –