"I have a simple mission: To create an open-source, non-linear video editor for Linux. Many have tried and fallen before me, but for some reason I feel compelled to try myself. I am documenting my journey in this blog for all to read. It will be a dangerous journey, and I might not make it back alive. Hold on tight, and enjoy the ride! By the way, I'm calling this project OpenShot Video Editor!"

I've spent the past few weeks putting together a working Python example, which allows a user to select a media file (audio or video) and display all the various information I can find (such as height, width, duration, position, frames per second, codec, etc...). One of my blog readers informed me of a module (which is already written and included in the Python bindings for Gstreamer) called Discoverer. This is far cleaner than the code I was writing, and super useful.

Give this example code a try in your favorite Python IDE. Be sure to pass 1 argument to the script (the file path of a media file):

#!/usr/bin/env python
# gst-python
# Copyright (C) 2006 Andy Wingo <wingo at pobox.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.


import os
import sys

import pygtk
pygtk.require('2.0')
import gobject
gobject.threads_init()
import pygst
pygst.require('0.10')
import gst
from gst.extend import discoverer

def fail(path):
print "error: %r does not appear to be a media file" % path
sys.exit(1)

def succeed(d):
def pp(prop, val):
print '%s: %s' % (prop, val)
pp('media type', d.mimetype)

pp('has video', d.is_video)
if d.is_video:
pp('video caps', d.videocaps)
pp('video width (pixels)', d.videowidth)
pp('video height (pixels)', d.videoheight)
pp('video length (ms)', d.videolength / gst.MSECOND)
pp('framerate (fps)', '%s/%s' % (d.videorate.num, d.videorate.denom))

pp('has audio', d.is_audio)
if d.is_audio:
pp('audio caps', d.audiocaps)
pp('audio format', d.audiofloat and 'floating-point' or 'integer')
pp('sample rate (Hz)', d.audiorate)
pp('sample width (bits)', d.audiowidth)
pp('sample depth (bits)', d.audiodepth)
pp('audio length (ms)', d.audiolength / gst.MSECOND)
pp('audio channels', d.audiochannels)

sys.exit(0)

def discover(path):
def discovered(d, is_media):
if is_media:
succeed(d)
else:
fail(path)

d = discoverer.Discoverer(path)
d.connect('discovered', discovered)
d.discover()
gobject.MainLoop().run()

def usage():
print >>sys.stderr, "usage: gst-discover PATH-TO-MEDIA-FILE"
sys.exit(1)

def main(argv):
if len(argv) != 2:
usage()
path = argv.pop()
if not os.path.isfile(path):
print >>sys.stderr, "error: file %r does not exist" % path
usage()

return discover(path)

if __name__ == '__main__':
sys.exit(main(sys.argv))


Here is the output of this example script using a short mpeg video file:

media type: video/mpeg, systemstream=(boolean)true, mpegversion=(int)1
has video: True
video caps: video/x-raw-yuv, format=(fourcc)I420, width=(int)192, height=(int)192, pixel-aspect-ratio=(fraction)16/15, framerate=(fraction)24000/1001
video width (pixels): 192
video height (pixels): 192
video length (ms): 6831
framerate (fps): 24000/1001
has audio: True
audio caps: audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)32, depth=(int)32, rate=(int)44100, channels=(int)1
audio format: integer
sample rate (Hz): 44100
sample width (bits): 32
sample depth (bits): 32
audio length (ms): 6831
audio channels: 1

1 comments

  1. b3rx  

    the discoverer module also have a print_info() function/method. for me this is more informative. but i think its harder to parse and to make it useful.

    b

Post a Comment

Subscribe to: Post Comments (Atom)