2016-09-09 84 views
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。

但是視頻不播放。如果我添加回調函數以外的,那麼它工作正常。

+0

我認爲這是錯誤的方法,你應該聽取分路器的焊盤添加信號,並在每個新的焊盤檢查其上限,然後添加/鏈接任何你需要的墊 - 這是標準的方法,並有教程 - 使用你最喜歡的搜索引擎,HTH – nayana

+0

哦,這是在墊添加..對不起,我讀了錯誤的問題..功能的名稱是相當混亂 – nayana

+0

那好吧,我的方法是正確的或不?這種方法有什麼錯誤嗎? –

回答