GStreamer playback of MP4 files with and without audio

Terry Barnaby via gstreamer-devel <[email protected]> Wed, 2 Oct 2024 07:21:25 +0100
Newsgroups gmane.comp.video.gstreamer.devel
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------Uvx0ChUZW8WVgDHUXcsq4oCD
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

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.

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.

I need some way to handle the playback of these MP4 files that may or 
may not have MP3 audio streams.

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):

gst-launch-1.0 -v filesrc location=temp.mp4 ! qtdemux name=demux

  demux.video_0 ! queue ! h264parse ! openh264dec ! glimagesink

  demux.audio_0 ! queue ! decodebin ! audioconvert ! pulsesink

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.

So I think I need to:

1. Maybe there is some gstreamer element or attribute that can ignore 
the audio stream if not present somehow ?

2. Check if the MP4 file has an audio stream before creating the 
gstreamer pipeline in C++.

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.

Any ideas on the simplest/most CPU efficient way of doing this with 
gstreamer ?


--------------Uvx0ChUZW8WVgDHUXcsq4oCD
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE html>
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <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>
  </body>
</html>

--------------Uvx0ChUZW8WVgDHUXcsq4oCD--