gstreamer python appsrc and mp3 files in python

Josef Novak josef.robert.novak at gmail.com
Sun Aug 21 15:53:57 UTC 2016


Hi,

I am trying to setup a pipeline that will accept mp3 input to convert to
raw, using the appsrc source, and the python bindings.

In the command line, either of these work fine:


$ gst-launch-1.0 -v -m filesrc location=test/1-dual-30s.l.mp3 \
   ! decodebin ! audioconvert ! audioresample \
   ! audio/x-raw,format=S16LE,rate=8000,channels=1 \
   ! filesink location=out.raw

or

$ cat test/1-dual-30s.l.mp3 | gst-launch-1.0 -v -m fdsrc fd=0 \
   ! decodebin ! audioconvert ! audioresample \
   ! audio/x-raw,format=S16LE,rate=8000,channels=1 \
   ! filesink location=out.raw

however, when I try to replicate this with 'appsrc' and the python bindings:
-----------------------------
class DecodeToHTTPStreamPipeline () :
    def __init__ (self, http_conf, blocksize, loop) :
        self.HTTPClient = self._InitClient (http_conf, blocksize)
        self.blocksize  = blocksize
        self.pipeline   = gst.Pipeline ()

        self.bus        = self.pipeline.get_bus ()
        self.bus.add_signal_watch ()
        self.bus.enable_sync_message_emission ()
        self.bus.connect ('message::eos', self._OnEOS)
        self.bus.connect ('message::tag', self._OnTag)
        self.bus.connect ('message::error', self._OnError)

        self.audiosource   = gst.ElementFactory.make ('appsrc', 'appsrc')
        self.audiosource.set_property ("is-live", True)
        self.decodebin     = gst.ElementFactory.make ('decodebin', 'decodebin')
        self.decodebin.connect ('pad-added', self._OnNewDecodedPad)

        self.audioconvert  = gst.ElementFactory.make ('audioconvert',
'audioconvert')
        self.audioresample = gst.ElementFactory.make ('audioresample',
'audioresample')
        self.capsfilter    = gst.ElementFactory.make ('capsfilter',

'audio/x-raw,format=S16LE,rate=8000,channels=1')

        self.audiosink     = gst.ElementFactory.make ('appsink', 'appsink')
        self.audiosink.set_property ("emit-signals", True)
        self.audiosink.set_property ('drop', True)
        self.audiosink.set_property ('sync', False)
        self.audiosink.connect ('new-sample', self._OnNewBuffer, self.audiosink)

        if (not (self.pipeline and self.audiosource and self.decodebin and \
                 self.audioconvert and self.audioresample and self.audiosink)) :
            print "Error with configuration. Quitting."
            sys.exit (-1)

        self.pipeline.add (self.audiosource)
        self.pipeline.add (self.decodebin)
        self.pipeline.add (self.audioconvert)
        self.pipeline.add (self.audioresample)
        self.pipeline.add (self.capsfilter)
        self.pipeline.add (self.audiosink)
        #self.SetOutLocation (outlocation)

        self.audiosource.link (self.decodebin)
        self.decodebin.link (self.audioconvert)
        self.audioconvert.link (self.audioresample)
        self.audioresample.link (self.capsfilter)
        self.capsfilter.link (self.audiosink)

        self.loop = loop
        self.pipeline.set_state (gst.State.PLAYING)
-----------------------------

I end up with a pipeline that works fine for a range of codecs: .wav,
.flac, etc, but it fails with .mp3 files in the sense that

it does not seem to detect them as .mp3 files, and the output is junk.

I noted that even on yakkety, gst-inspect lists avdec_mp3 is ranked as
'marginal', is it possible that this is the problem?

--------------------
$ gst-inspect-1.0 avdec_mp3
Factory Details:
  Rank                     marginal (64)
  Long-name                libav MP3 (MPEG audio layer 3) decoder

----------------------

Is there a work around or reconfiguration for the python bindings that
does not involve recompiling everything from source?

A different combination of elements for .mp3 would be no problem, but
I could not find any that worked (including 'mad' or 'mpg123').

Best regards

 -Joe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20160821/9114560b/attachment.html>


More information about the gstreamer-devel mailing list