oxtools/oxgst/info.py

77 lines
2.9 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
# GPL 2008
import gobject
gobject.threads_init()
import os
import pygst
pygst.require("0.10")
import gst
from gst.extend import discoverer
codec_list = {
'MPEG-1 layer 3': 'MPEG-1 Audio layer 3',
'MPEG-1 layer 3 audio': 'MPEG-1 Audio layer 3',
'MPEG 1 Audio, Layer 2': 'MPEG-1 Audio layer 2',
'VP6 Flash video': 'VP6',
'AC-3 audio': 'AC-3',
'Uncompressed 16-bit PCM audio': 'Uncompressed 16-bit PCM',
'Generic DV': 'DV Video',
}
class Info(dict):
def __init__(self, path):
self._stream_id = 0
self['video'] = []
self['audio'] = []
self['size'] = os.stat(path).st_size
mainloop = gobject.MainLoop()
def discovered(d, is_media):
if is_media:
if d.is_video:
c = {}
c['width'] = d.videowidth
c['height'] = d.videoheight
self['duration'] = float(d.videolength)/gst.SECOND
c["framerate"] = "%d:%d" % (d.videorate.num, d.videorate.denom)
s = d.videocaps[0]
par = gst.Fraction(1, 1)
if 'pixel-aspect-ratio' in s.keys():
par = s['pixel-aspect-ratio']
c["pixel_aspect_ratio"] = "%s:%s" %(par.num, par.denom)
dar = gst.Fraction(d.videowidth * par.num, d.videoheight * par.denom)
if 'display-aspect-ratio' in s.keys():
dar = s['display-aspect-ratio']
c["display_aspect_ratio"] = "%s:%s" %(dar.num, dar.denom)
if 'video-codec' in d.tags:
c['codec'] = codec_list.get(d.tags['video-codec'], d.tags['video-codec'])
c['id'] = self._stream_id
self._stream_id += 1
self['video'].append(c)
if d.is_audio:
c = {}
#self['audio caps'] = d.audiocaps
#self['audio format'] = d.audiofloat and 'floating-point' or 'integer'
#self['sample width (bits)'] = d.audiowidth
#self['sample depth (bits)'] = d.audiodepth
c['samplerate'] = d.audiorate
if 'duration' not in self:
self['duration'] = float(d.audiolength)/gst.SECOND
c['channels'] = d.audiochannels
if 'audio-codec' in d.tags:
c['codec'] = codec_list.get(d.tags['audio-codec'], d.tags['audio-codec'])
c['id'] = self._stream_id
self._stream_id += 1
self['audio'].append(c)
mainloop.quit()
d = discoverer.Discoverer(path)
d.connect('discovered', discovered)
d.discover()
mainloop.run()