gstreamer python appsrc and mp3 files in python

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

gstreamer python appsrc and mp3 files in python

Josef Novak

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

_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: gstreamer python appsrc and mp3 files in python

Josef Novak
Hi, In fact it looks like the problem was that the mp3 files I was creating with sox for testing were invalid/uninterpretable.  After switching to lame to create the test files, the pipeline works fine.  -Joe

On Sun, Aug 21, 2016 at 5:53 PM, Josef Novak <[hidden email]> wrote:

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


_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel