--- /dev/null
+#!/usr/bin/python
+import gobject; gobject.threads_init()
+import pygst; pygst.require("0.10")
+import os, gst
+from threading import Thread
+
+
+class OSCController(Thread):
+
+ def __init__(self, port):
+ Thread.__init__(self)
+ import liblo
+ self.port = port
+ try:
+ self.server = liblo.Server(self.port)
+ except liblo.ServerError, err:
+ print str(err)
+ # self.server.add_method(None, None, self.fallback)
+
+ def fallback(self, path, args, types, src):
+ print "got unknown message '%s' from '%s'" % (path, src.get_url())
+ for a, t in zip(args, types):
+ print "argument of type '%s': %s" % (t, a)
+
+ def add_method(self, path, type, method):
+ self.server.add_method(path, type, method)
+
+ def run(self):
+ while True:
+ self.server.recv(100)
+
+
+class V4L2Controller(object):
+
+ def __init__(self, video_id=0, osc_port=12345):
+ self.osc_port = osc_port
+ self.osc = OSCController(self.osc_port)
+ self.video_id = video_id
+
+ self.zoom_param = 'zoom_absolute'
+ self.zoom_range = [100, 250]
+ self.zoom_path = '/1/fader1'
+ self.zoom_toggle = '/1/toggle1'
+ self.osc.add_method(self.zoom_toggle, 'f', self.zoom_toggle_callback)
+ self.osc.add_method(self.zoom_path, 'f', self.zoom_callback)
+ self.zoom = False
+
+ self.exposure_param = 'exposure_absolute'
+ self.exposure_range = [0, 250]
+ self.exposure_path = '/1/fader2'
+ self.exposure_toggle = '/1/toggle2'
+ self.osc.add_method(self.exposure_toggle, 'f', self.exposure_toggle_callback)
+ self.osc.add_method(self.exposure_path, 'f', self.exposure_callback)
+ self.exposure = False
+
+ def set_param(self, param, value):
+ command = 'v4l2-ctl -d ' + str(self.video_id) + ' -c ' + param + '=' + value
+ print command
+ os.system(command)
+
+ def zoom_toggle_callback(self, path, args, types, src):
+ for a, t in zip(args, types):
+ value = a
+ if not value:
+ self.zoom = False
+ else:
+ self.zoom = True
+
+ def zoom_callback(self, path, args, types, src):
+ for a, t in zip(args, types):
+ value = a
+ if self.zoom:
+ zoom_value = self.zoom_range[0] + (self.zoom_range[1] - self.zoom_range[0]) * value
+ self.set_param(self.zoom_param, str(int(zoom_value)))
+
+ def exposure_toggle_callback(self, path, args, types, src):
+ for a, t in zip(args, types):
+ value = a
+ if not value:
+ self.set_param('exposure_auto', str(3))
+ self.exposure = False
+ else:
+ self.set_param('exposure_auto', str(1))
+ self.exposure = True
+
+ def exposure_callback(self, path, args, types, src):
+ for a, t in zip(args, types):
+ value = a
+ if self.exposure:
+ exposure_value = self.exposure_range[0] + (self.exposure_range[1] - self.exposure_range[0]) * value
+ self.set_param(self.exposure_param, str(int(exposure_value)))
+
+ def run(self):
+ self.osc.start()
+
+
+if __name__ == '__main__':
+ controller = V4L2Controller(video_id=1)
+ controller.run()
+
--- /dev/null
+#!/bin/sh
+
+# Start TeleCaster video channel
+
+#WIDTH=640
+#HEIGHT=360
+WIDTH=864
+HEIGHT=480
+#WIDTH=1280
+#HEIGHT=720
+
+# gst-launch-1.0 tcpclientsrc host=$1 port=$2 \
+# ! gdpdepay ! rtph264depay ! avdec_h264 \
+# ! videoconvert \
+# ! queue ! vp8enc threads=4 ! queue ! muxout. \
+# jackaudiosrc connect=2 ! audio/x-raw, format=F32LE, channels=2 \
+# ! audioconvert ! audioresample ! audio/x-raw, rate=48000 ! vorbisenc quality=0.3 ! queue ! muxout. \
+# webmmux streamable=true name=muxout \
+# ! tcpserversink host=127.0.0.1 port=10001
+
+
+# gst-launch-1.0 tcpclientsrc host=$1 port=$2 \
+# ! queue ! gdpdepay ! rtph264depay ! avdec_h264 \
+# ! vp8enc threads=4 target-bitrate=1000000 auto-alt-ref=true \
+# ! webmmux streamable=true name=muxout \
+# ! tcpserversink host=127.0.0.1 port=10001
+
+
+gst-launch-0.10 tcpclientsrc host=$1 port=$2 \
+ ! queue ! gdpdepay ! rtph264depay ! ffdec_h264 \
+ ! queue ! vp8enc speed=2 threads=4 quality=5.0 \
+ ! queue ! webmmux streamable=true name=muxout \
+ ! tcpserversink host=127.0.0.1 port=10001 sync-method=1
+
+
# Start TeleCaster video channel
-WIDTH=640
+#WIDTH=640
+#HEIGHT=360
+WIDTH=864
HEIGHT=480
+#WIDTH=1280
+#HEIGHT=720
-gst-launch v4l2src device=/dev/video0 ! video/x-raw-yuv, width=$WIDTH, height=$HEIGHT, framerate={30/1} \
- ! queue ! ffmpegcolorspace \
- ! queue ! vp8enc speed=2 threads=4 quality=7.0 max-latency=2 max-keyframe-distance=3 auto-alt-ref-frames=true ! queue ! muxout. \
- jackaudiosrc connect=2 client-name=webmenc ! audio/x-raw-float, channels=2 \
- ! queue ! audioconvert ! queue ! vorbisenc quality=0.3 ! queue ! muxout. \
- webmmux streamable=true name=muxout \
- ! queue ! tcpserversink host=127.0.0.1 port=9000 protocol=none blocksize=65536 sync-method=1
+v4l2-ctl -d $1 -c power_line_frequency=1 -c zoom_absolute=$2
+v4l2-ctl -d $1 -c focus_auto=0
+v4l2-ctl -d $1 -c focus_absolute=1
+gst-launch v4l2src device=/dev/video$1 ! video/x-raw-rgb, width=$WIDTH, height=$HEIGHT, framerate={30/1} \
+ ! queue ! videoflip method=rotate-180 \
+ ! queue ! ffmpegcolorspace \
+ ! queue ! vp8enc speed=2 threads=4 quality=10.0 max-latency=25 max-keyframe-distance=30 auto-alt-ref-frames=true ! queue ! muxout. \
+ jackaudiosrc connect=2 ! audio/x-raw-float, channels=2 \
+ ! queue ! audioconvert ! queue ! vorbisenc quality=0.3 ! queue ! muxout. \
+ webmmux streamable=true name=muxout \
+ ! queue ! tcpserversink host=127.0.0.1 port=9000 sync-method=1 \
+ > /dev/null