2016-10-19 3 views
0

Je voudrais lire un fichier ts, qui a une ou deux vidéos.Impossible de lire le fichier ts, lorsque la corbeille du pipeline a plus de nombre de puits

J'ai créé un pipeline, et lié dynamiquement les éléments avec demux, chaque fois qu'un pavé survient dans le rappel de la fonction de démultiplexage.

Comme indiqué ci-dessous.

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; 
       } 
      } 

Dans un premier temps, j'ai ajouté deux videosinks à Pipeline BIN, si le fichier ts a deux vidéos il fonctionne bien.

Mais si le fichier ts n'a qu'une seule vidéo, la fenêtre ximagesink est mise en pause. Pour lire ce fichier ts, je dois supprimer un autre élément de récepteur, qui ne reçoit pas de données, doit être retiré de la corbeille.

Et dans ce cas, je ne suis pas en mesure de recevoir le message END OF THE STREAM.

Pourquoi cela se passe-t-il? Existe-t-il un autre moyen de lire ces deux fichiers ts, en utilisant le même pipeline, sans supprimer l'élément sink?

Répondre

1

Tous les puits dans un pipeline doivent recevoir des données pour que le pipeline préroule et passe ensuite à l'état de lecture. Si un récepteur ne reçoit pas de données, tous les autres l'attendent pour recevoir.

Détails sur prélaminage: https://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-preroll.txt

Fondamentalement, si un évier serait tout simplement commencer rendu avant que d'autres recevoir des données, cela signifierait que les données qui atteint le puits « tardif » serait déjà mis au rebut, car il serait trop tard pour jouer il en synchronisation avec les données sur le premier puits (il a déjà été joué).

En résumé, vous ne devez ajouter des puits au pipeline que si vous avez l'intention de les utiliser.