<div dir="ltr"><div>I would add a handler for the "pad-added" event on the filesrc element and only create/add the audio part of the pipeline if you get an audio pad created.  That is what I have done to handle rtspsrc streams that may or may not have audio.  Reply if you want more details.</div><div><br></div><div>   g_signal_connect(m_sourceElement, "pad-added", G_CALLBACK(&SynxRTSPPipeline::onPadAdded), this);<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 2 Oct 2024 at 07:30, Terry Barnaby via gstreamer-devel <<a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><u></u>

  

    
  
  <div>
    <p>I am developing a C++ video inspection program that creates
      MP4/H264/MP3 files and needs to play them back with the video
      stream processed by various gstreamer elements and audio
      separately.</p>
    <p>In general this has been working fine when just video was being
      recorded/played back, but I am just adding audio to the mix. Some
      MP4 files will contain only a video stream and some will contain
      both video and audio streams.</p>
    <p>I need some way to handle the playback of these MP4 files that
      may or may not have MP3 audio streams.<br>
    </p>
    <p>As a simple idea if I use something like (The real C++ code
      constructs the gstreamer piple line and tees the video stream to
      various gstreamer sub pipelines):<br>
    </p>
    <pre>gst-launch-1.0 -v filesrc location=temp.mp4 ! qtdemux name=demux</pre>
    <pre> demux.video_0 ! queue ! h264parse ! openh264dec ! glimagesink</pre>
    <pre> demux.audio_0 ! queue ! decodebin ! audioconvert ! pulsesink</pre>
    <p>This plays back the video and audio streams fine (not sure how
      well synchronised?) from an MP4 with video and audio streams, but
      hangs if the MP4 only has a video stream.</p>
    <p>So I think I need to:</p>
    <p>1. Maybe there is some gstreamer element or attribute that can
      ignore the audio stream if not present somehow ?</p>
    <p>2. Check if the MP4 file has an audio stream before creating the
      gstreamer pipeline in C++.</p>
    <p>3. Create the basic C++ pipleline in C++ and interrogate pads or
      something somehow and add the "demux.audio_0 ! queue ! decodebin !
      audioconvert ! pulsesink" sub pipeline if it is seen an audio
      stream is present.<br>
    </p>
    Any ideas on the simplest/most CPU efficient way of doing this with
    gstreamer ?<br>
    <p><br>
    </p>
  </div>

</blockquote></div>