2016-09-09 43 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

那好吧,我的方法是正确的或不?这种方法有什么错误吗? –

回答