0
我想創建一個動態的管道,這需要根據閱讀文件「的.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。
但是視頻不播放。如果我添加回調函數以外的,那麼它工作正常。
我認爲這是錯誤的方法,你應該聽取分路器的焊盤添加信號,並在每個新的焊盤檢查其上限,然後添加/鏈接任何你需要的墊 - 這是標準的方法,並有教程 - 使用你最喜歡的搜索引擎,HTH – nayana
哦,這是在墊添加..對不起,我讀了錯誤的問題..功能的名稱是相當混亂 – nayana
那好吧,我的方法是正確的或不?這種方法有什麼錯誤嗎? –