summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xDemo/sgi/video/aplay.py167
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()