diff options
-rwxr-xr-x | Demo/sgi/video/aplay.py | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/Demo/sgi/video/aplay.py b/Demo/sgi/video/aplay.py new file mode 100755 index 0000000..5544fbe --- /dev/null +++ b/Demo/sgi/video/aplay.py @@ -0,0 +1,167 @@ +#! /ufs/guido/bin/sgi/python + +# Play synchronous video and audio. +# Highly experimental! + +import sys +import getopt +import string +import os + +import VFile +import aifc + +import gl, GL, DEVICE +import al, AL + + +def usage(): + sys.stderr.write( \ + 'usage: aplay [-o offset] [-q qsize] videofile audiofile\n') + sys.exit(2) + +def main(): + offset = 0 + qsize = 0 # This defaults to 1/10 second of sound + videofile = 'film.video' + audiofile = 'film.aiff' + + try: + opts, args = getopt.getopt(sys.argv[1:], 'o:q:') + except getopt.error, msg: + sys.stderr.write(msg + '\n') + usage() + + try: + for o, a in opts: + if o == '-o': + offset = string.atoi(a) + if o == '-q': + qsize = string.atoi(a) + except string.atoi_error: + sys.stderr.write(o + ' arg must be integer\n') + usage() + + if len(args) > 2: + usage() + + if args: videofile = args[0] + if args[1:]: audiofile = args[1] + + if not os.path.exists(videofile) and \ + os.path.exists(videofile + '.video'): + if not args[1:] and os.path.exists(videofile + '.aiff'): + audiofile = videofile + '.aiff' + videofile = videofile + '.video' + + print 'Opening video input file..' + vin = VFile.VinFile().init(videofile) + + print 'Opening audio input file..' + ain = aifc.open(audiofile, 'r') + print 'rate :', ain.getframerate() + print 'channels:', ain.getnchannels() + print 'frames :', ain.getnframes() + print 'width :', ain.getsampwidth() + print 'kbytes :', \ + ain.getnframes() * ain.getnchannels() * ain.getsampwidth() + + print 'Opening audio output port..' + c = al.newconfig() + c.setchannels(ain.getnchannels()) + c.setwidth(ain.getsampwidth()) + nullsample = '\0' * ain.getsampwidth() + samples_per_second = ain.getnchannels() * ain.getframerate() + if qsize <= 0: qsize = samples_per_second / 10 + qsize = max(qsize, 512) + c.setqueuesize(qsize) + saveparams = [AL.OUTPUT_RATE, 0] + al.getparams(AL.DEFAULT_DEVICE, saveparams) + newparams = [AL.OUTPUT_RATE, ain.getframerate()] + al.setparams(AL.DEFAULT_DEVICE, newparams) + aport = al.openport(audiofile, 'w', c) + + print 'Opening video output window..' + gl.foreground() + gl.prefsize(vin.width, vin.height) + wid = gl.winopen(videofile + ' + ' + audiofile) + gl.clear() + vin.initcolormap() + + print 'Playing..' + gl.qdevice(DEVICE.ESCKEY) + gl.qdevice(DEVICE.LEFTARROWKEY) + gl.qdevice(DEVICE.RIGHTARROWKEY) +## gl.qdevice(DEVICE.UPARROWKEY) +## gl.qdevice(DEVICE.DOWNARROWKEY) + gl.qdevice(DEVICE.SPACEKEY) + + while 1: + samples_written = 0 + samples_read = 0 + lastt = 0 + pause = 0 + while 1: + if gl.qtest(): + dev, val = gl.qread() + if val == 1: + if dev == DEVICE.ESCKEY: + sys.exit(0) + elif dev == DEVICE.LEFTARROWKEY: + offset = offset - 100 + print 'offset =', offset + elif dev == DEVICE.RIGHTARROWKEY: + offset = offset + 100 + print 'offset =', offset + elif dev == DEVICE.SPACEKEY: + pause = (not pause) + + if pause: + continue + + try: + t, data, cdata = vin.getnextframe() + except EOFError: + break + t = int(t) + dt = t - lastt + lastt = t + target = samples_per_second * t / 1000 + n = target - samples_written + qsize - offset + if n > 0: + # This call will block until the time is right: + try: + samples = ain.readframes(n) + except EOFError: + samples = '' + k = len(samples) / len(nullsample) + samples_read = samples_read + k + if k < n: + samples = samples + (n-k) * nullsample + aport.writesamps(samples) + samples_written = samples_written + n + vin.showframe(data, cdata) + + while 1: + try: + samples = ain.readframes(qsize) + except EOFError: + break + if not samples: + break + aport.writesamps(samples) + k = len(samples) / len(nullsample) + samples_read = samples_read + k + samples_written = samples_written + k + + print samples_read, 'samples ==', + print samples_read * 1.0 / samples_per_second, 'sec.' + print lastt, 'milliseconds' + + print 'Restarting..' + ain.close() + ain = aifc.open(audiofile, 'r') + vin.rewind() + + +main() |