I'm trying to port some pygtk music player code to pygi which uses gst's discoverer module.
from gi.repository import Gst, GstPbutils
def on_discovered(discoverer, ismedia): print("%s -- %s" %( discoverer.tags.get('title', 'Unknown'), discoverer.tags.get('artist', 'Unknown')))
Gst.init(None)
location = "file:///srv/Music/molly_hatchet-the_creeper.mp3"
discoverer = GstPbutils.Discoverer()
discoverer.discover_uri(location)
discoverer.connect('discovered', on_discovered)When I attempt to run this I get the following error:
/usr/lib/python2.7/dist-packages/gi/types.py:43: Warning: g_object_get_qdata: assertion `G_IS_OBJECT (object)' failed return info.invoke(*args, **kwargs)
/usr/lib/python2.7/dist-packages/gi/types.py:43: Warning: g_object_ref_sink: assertion `G_IS_OBJECT (object)' failed return info.invoke(*args, **kwargs)
** (python:21482): CRITICAL **: pygobject_register_wrapper: assertion `PyObject_TypeCheck(self, &PyGObject_Type)' failed
/usr/lib/python2.7/dist-packages/gi/types.py:43: Warning: g_object_unref: assertion `G_IS_OBJECT (object)' failed return info.invoke(*args, **kwargs)Unfortunately documentation on this pygi module seems a bit sparse.
22 Answers
I successfully used the GstPbutils module with the following code (note that this use version 1.2 of gstreamer)
if __name__ == "__main__": if len(sys.argv) < 2: print >> sys.stderr, "usage %s <filename>" % sys.argv[0] sys.exit(1) Gst.init(None) GObject.threads_init() discoverer = GstPbutils.Discoverer() discoverer.connect('discovered', on_discovered) info = discoverer.discover_uri(sys.argv[1]) # video info print '# video' for vinfo in info.get_video_streams(): print vinfo.get_caps().to_string().replace(', ', '\n\t') # audio info print '# audio' for ainfo in info.get_audio_streams(): print ainfo.get_caps().to_string().replace(', ', '\n\t')with which I obtain an output like the following
$ python source.py 'file:///home/gipi/Videos/Adventure Time - Season 2/Adventure time - 1x24 - Heat Signature.mp4'
# video
video/x-h264 stream-format=(string)avc alignment=(string)au level=(string)4.1 profile=(string)high codec_data=(buffer)01640029ffe1001967640029ac5208014016ec04400000fa40002ee023c60c626001000668e88ecb22c0 width=(int)1280 height=(int)720 framerate=(fraction)24000/1001 pixel-aspect-ratio=(fraction)1/1 parsed=(boolean)true
# audio
audio/mpeg mpegversion=(int)4 framed=(boolean)true stream-format=(string)raw level=(string)2 base-profile=(string)lc profile=(string)lc codec_data=(buffer)1190 rate=(int)48000 channels=(int)2The documentation is a little tricky since the various data type are not defined explicitely (for example GstDiscovererAudioInfo); BTW you can find some documentation here
Here is an example of generic GST discoverer invocation :
import sys
import gobject
gobject.threads_init()
import pygst
pygst.require('0.10')
import gst
from gst.extend.discoverer import Discoverer
def on_discovered(discoverer, ismedia, infile): print '\non_discovered:', infile discoverer.print_info()
if __name__ == '__main__': if len(sys.argv) >= 2: print 'Audio file: %s ' % sys.argv[0] discoverer = Discoverer(sys.argv[1]) discoverer.connect('discovered', on_discovered, sys.argv[1]) # The MainLoop mainloop = gobject.MainLoop() gobject.idle_add(discoverer.discover) mainloop.run() else: print 'Usage: %s <input_file>' % sys.argv[0]EDIT : If you just want the tags, use this :
1