Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- import sys, os, time
- import subprocess, pygtk, gtk, gobject
- from subprocess import *
- from dbus.mainloop.glib import DBusGMainLoop
- from PIL import Image
- import dbus.service
- import dbus.glib
- import pygst
- pygst.require("0.10")
- import gst
- try:
- import dl
- libc = dl.open('/lib/libc.so.6')
- libc.call('prctl', 15, 'video-recorder\0', 0, 0, 0) # 15 is PR_SET_NAME
- except:
- print "FUCK!"
- pass
- #Window default behavior, if you care to modify it
- WINDOW_STICK=False
- WINDOW_KEEPABOVE=False
- WINDOW_DECORATED=True
- #Default size and position for the main viewing window
- WIDTH=760
- HEIGHT=480
- TOP=0
- LEFT=0
- #Default size and position for the UVC controls window
- CTLWIDTH=800
- CTLHEIGHT=580
- CTLTOP=0
- CTLLEFT=0
- #File browser executable, directory you would like to launch the file browser to,
- #and full path to the uvcdynctrl execuable
- EXECCMD="thunar"
- EXECARGS='/mediadrive/video/recordings/'
- UVCDYNCTRLEXEC="/usr/bin/uvcdynctrl"
- timeElapsed = 0
- #Device node for your webcam
- #videoDevice="/dev/video0"
- videoDevice="/dev/v4l/by-id/usb-Philips_CE_Philips_SPC_1300NC_Webcam-video-index0"
- #gstreamer v4l2 properties for your webcam
- #videoProperties="image/jpeg,width=640,height=480,framerate=30/1"
- #videoProperties="video/x-raw-yuv,width=640,height=480,framerate=30/1"
- VIDEOPROPSLOWRES="image/jpeg,width=640,height=480,framerate=30/1"
- VIDEOPROPSLOWRESRAW="video/x-raw-yuv,width=640,height=480,framerate=30/1"
- VIDEOPROPSHIRES="video/x-raw-yuv,width=1280,height=1024,framerate=9/1"
- VIDEOPROPSHIRESRAW="image/jpeg,width=1280,height=1024,framerate=15/1"
- videoProperties = VIDEOPROPSLOWRES
- videoPropertiesRaw = VIDEOPROPSLOWRESRAW
- #video effects
- videoEffects=" ffmpegcolorspace ! videoflip method=2 ! "
- #videoEffects=""
- #audio device for recording from your webcam (or other source)
- audioDevice="hw:1,0"
- #format for audio recording (many webcams use a rate of 16000 with 1 channel)
- audioProperties="audio/x-raw-int,rate=48000,channels=2,depth=16"
- #video sink
- videoSink="xvimagesink"
- #Directory where you would like to save the videos
- filePath='/mediadrive/video/recordings/'
- #Additional gstreamer properties for mpeg 4
- mpeg4Properties=" bitrate=4194304"
- class GTK_Main:
- def __init__(self):
- global filePath, videoDevice, videoProperties, videoSink
- window = gtk.Window(gtk.WINDOW_TOPLEVEL)
- window.set_title("Video-Recorder")
- window.set_size_request(WIDTH, HEIGHT)
- window.set_decorated(WINDOW_DECORATED)
- window.connect("destroy", gtk.main_quit, "WM destroy")
- window.move(LEFT, TOP)
- mainBox = gtk.HBox()
- window.add(mainBox)
- vbox = gtk.VBox()
- mainBox.add(vbox)
- self.movie_window = gtk.DrawingArea()
- vbox.add(self.movie_window)
- controlBox = gtk.VBox()
- mainBox.pack_start(controlBox, False)
- controlBox.set_size_request(120,480)
- controlBox.set_border_width(0)
- controlBox.pack_start(gtk.Label())
- self.recHQBtn = gtk.Button("Rec(HQ)")
- self.recHQBtn.connect("clicked", self.start_stop_recordHQ)
- controlBox.pack_start(self.recHQBtn, True, True, 0)
- self.recLQBtn = gtk.Button("Rec(LQ)")
- self.recLQBtn.connect("clicked", self.start_stop_recordLQ)
- controlBox.pack_start(self.recLQBtn, True, True, 0)
- self.viewCamBtn = gtk.Button("Watch")
- self.viewCamBtn.connect("clicked", self.start)
- controlBox.pack_start(self.viewCamBtn, False)
- self.setAutoOff = gtk.Button("A.E Off")
- self.setAutoOff.connect("clicked", self.SetAutoExposure, "off")
- controlBox.pack_start(self.setAutoOff, False)
- self.setAutoOn = gtk.Button("A.E On")
- self.setAutoOn.connect("clicked", self.SetAutoExposure, "on")
- controlBox.pack_start(self.setAutoOn, False)
- self.controls = gtk.Button("Controls")
- self.controls.connect("clicked", self.OpenControlsWindow)
- controlBox.pack_start(self.controls, False)
- self.viewBtn = gtk.Button("Browse...")
- self.viewBtn.connect("clicked", self.ViewVideos, "view")
- controlBox.pack_start(self.viewBtn, True, True, 0)
- self.quitBtn = gtk.Button("Quit")
- self.quitBtn.connect("clicked", self.exit)
- controlBox.pack_start(self.quitBtn, False)
- controlBox.add(gtk.Label())
- self.ET = gtk.Label()
- self.ET.set_line_wrap(True)
- controlBox.pack_start(self.ET, False)
- window.show_all()
- #self.player = gst.parse_launch ("v4l2src device="+videoDevice+" queue-size=16 ! "+videoProperties+" ! queue2 max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! "+ videoEffects +" ffmpegcolorspace ! "+videoSink)
- self.player = gst.parse_launch ("v4l2src device="+videoDevice+" queue-size=16 ! "+videoProperties+" ! ffdec_mjpeg ! queue2 max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! ffmpegcolorspace ! "+ videoEffects + " " +videoSink)
- bus = self.player.get_bus()
- bus.add_signal_watch()
- bus.enable_sync_message_emission()
- bus.connect('message', self.on_message)
- bus.connect('sync-message::element', self.on_sync_message)
- self.start(firstRun = True)
- self.recorderLQ = None
- self.recorderHQ = None
- def DestroyWin(self, widget, win):
- win.destroy()
- def OpenControlsWindow(self, widget):
- self.ctrlWindow = gtk.Window(gtk.WINDOW_TOPLEVEL)
- self.ctrlWindow.set_title("UVC Dynctrl Preferences")
- self.ctrlWindow.set_size_request(CTLWIDTH, CTLHEIGHT)
- self.ctrlWindow.set_decorated(WINDOW_DECORATED)
- self.ctrlWindow.connect("destroy", self.DestroyWin, self.ctrlWindow)
- self.ctrlWindow.move(CTLLEFT, CTLTOP)
- mainBox = gtk.HBox()
- self.ctrlWindow.add(mainBox)
- hbox = gtk.HBox()
- controlBox = gtk.VBox()
- mainBox.pack_start(controlBox, False)
- controlBox.set_size_request(150,480)
- controlBox.set_border_width(10)
- controlBox.pack_start(gtk.Label())
- Controls=self.getControls(self)
- self.ctrlVBoxes = []
- self.ctrlHBoxes = []
- self.ctrlBtnPlus = []
- self.ctrlBtnMinus = []
- self.ctrlValue = []
- for control in Controls:
- indx = Controls.index(control)
- if not(indx % 4) or indx == 0:
- tmpHBox = gtk.HBox()
- self.ctrlHBoxes.append(tmpHBox)
- controlBox.pack_start(tmpHBox, False)
- tmpVBox = gtk.VBox()
- tmpBtnPlus = gtk.Button(control[0]+ " +")
- tmpBtnMinus = gtk.Button(control[0]+ " -")
- tmpValue = gtk.Label()
- self.ctrlVBoxes.append(tmpVBox)
- self.ctrlHBoxes[(int(indx / 4))].pack_start(self.ctrlVBoxes[indx], False)
- self.ctrlVBoxes[indx].add(gtk.Label())
- self.ctrlValue.append(tmpValue)
- self.ctrlValue[indx].set_label(control[1])
- self.ctrlVBoxes[indx].pack_start(self.ctrlValue[indx], False)
- self.ctrlBtnPlus.append(tmpBtnPlus)
- self.ctrlBtnPlus[indx].connect("clicked", self.setControls, self.ctrlValue[indx])
- self.ctrlVBoxes[indx].pack_start(self.ctrlBtnPlus[indx], False)
- self.ctrlBtnMinus.append(tmpBtnMinus)
- self.ctrlBtnMinus[indx].connect("clicked", self.setControls, self.ctrlValue[indx])
- self.ctrlVBoxes[indx].pack_start(self.ctrlBtnMinus[indx], False)
- self.quitBtn = gtk.Button("Close")
- self.quitBtn.connect("clicked", self.DestroyWin, self.ctrlWindow)
- controlBox.pack_start(self.quitBtn, False)
- self.ctrlWindow.show_all()
- def getControls(self, widget, what="all"):
- if what == "all":
- Controls = []
- lines = subprocess.Popen([UVCDYNCTRLEXEC, "-d", "video1", "-c"], stdout = PIPE)
- lines = lines.stdout.readlines()
- for line in lines:
- if line[0:7] != "Listing":
- Controls.append([line.strip()])
- for control in Controls:
- lines = subprocess.Popen([UVCDYNCTRLEXEC, "-d", "video1", "-g", control[0]], stdout = PIPE)
- lines = lines.stdout.readlines()
- for line in lines:
- if line[0:7] != "Listing":
- Controls[Controls.index(control)].append(line.strip())
- return Controls
- elif what != "all":
- lines = subprocess.Popen([UVCDYNCTRLEXEC,"-d", "video1", "-g", what], stdout = PIPE)
- lines = lines.stdout.readlines()
- for line in lines:
- if line != "Listing available controls for device video0:\n":
- return line.strip()
- def setControls(self, widget, label):
- controlToSet = widget.get_label()
- control = controlToSet[0:(len(controlToSet)-2)]
- if controlToSet[(len(controlToSet)-1):len(controlToSet)] == "+":
- value = str(int(label.get_label()) + 1)
- elif controlToSet[(len(controlToSet)-1):len(controlToSet)] == "-":
- value = str(int(label.get_label()) - 1)
- lines = subprocess.Popen([UVCDYNCTRLEXEC, "-d", "video1", "-s", control, value], stdout = PIPE)
- lines = lines.stdout.readlines()
- if len(lines):
- for line in lines:
- print line
- label.set_label(self.getControls(None,control))
- return True
- def SetPipelines(self, Type):
- global filePath, videoDevice, videoPropertiesRaw, videoProperties, videoSink, audioDevice, audioProperties, mpeg4Properties
- if Type == "LQ":
- #'''mjpeg''' self.recorderLQ = gst.parse_launch ("v4l2src device="+videoDevice+" queue-size=16 ! "+videoProperties+" ! ffdec_mjpeg ! queue max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! queue ! tee name=tee tee. ! "+ videoEffects +" ffmpegcolorspace ! queue ! ffenc_mpeg4 ! queue ! mux. matroskamux name=mux alsasrc device="+audioDevice+" ! audiorate ! "+audioProperties+" ! queue ! audioconvert ! lame ! mux. mux. ! queue ! filesink location="+filePath+time.strftime("%Y%m%d%H%M%S", time.localtime()) +".mkv tee. ! ffmpegcolorspace ! queue ! "+videoSink)
- self.recorderLQ = gst.parse_launch ("v4l2src device="+videoDevice+" queue-size=16 ! "+videoPropertiesRaw+" ! queue max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! queue ! tee name=tee tee. ! "+ videoEffects +" ffmpegcolorspace ! queue ! ffenc_mpeg4 " + mpeg4Properties +" ! queue ! mux. matroskamux name=mux alsasrc device="+audioDevice+" ! audiorate ! "+audioProperties+" ! queue ! audioconvert ! lame ! mux. mux. ! queue ! filesink location="+filePath+time.strftime("%Y%m%d%H%M%S", time.localtime()) +".mkv tee. ! ffmpegcolorspace ! queue ! "+videoSink)
- busrecLQ = self.recorderLQ.get_bus()
- busrecLQ.add_signal_watch()
- busrecLQ.enable_sync_message_emission()
- busrecLQ.connect('message', self.on_message)
- busrecLQ.connect('sync-message::element', self.on_sync_message)
- self.recorderHQ = None
- elif Type == "HQ":
- #'''yuv''' self.recorderHQ = gst.parse_launch ("v4l2src device="+videoDevice+" queue-size=16 ! "+videoProperties+" ! queue max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! queue ! tee name=tee tee. ! "+ videoEffects +" ffmpegcolorspace ! queue ! x264enc ! queue ! mux. matroskamux name=mux alsasrc device="+audioDevice+" ! audiorate ! "+audioProperties+" ! queue ! audioconvert ! lame ! mux. mux. ! queue ! filesink location="+filePath+time.strftime("%Y%m%d%H%M%S", time.localtime()) +".mkv tee. ! ffmpegcolorspace ! queue ! "+videoSink)
- self.recorderHQ = gst.parse_launch ("v4l2src device="+videoDevice+" queue-size=16 ! "+videoProperties+" ! tee name=tee tee. ! queue ! mux. matroskamux name=mux alsasrc device="+audioDevice+" ! audiorate ! "+audioProperties+" ! queue ! audioconvert ! lame ! mux. mux. ! queue ! filesink location="+filePath+time.strftime("%Y%m%d%H%M%S", time.localtime()) +".mkv tee. ! ffdec_mjpeg ! queue max-size-buffers=10000 max-size-bytes=0 max-size-time=0 ! queue ! "+ videoEffects +" ffmpegcolorspace ! "+videoSink)
- busrecHQ = self.recorderHQ.get_bus()
- busrecHQ.add_signal_watch()
- busrecHQ.enable_sync_message_emission()
- busrecHQ.connect('message', self.on_message)
- busrecHQ.connect('sync-message::element', self.on_sync_message)
- self.busrecLQ = None
- def start(self, firstRun = False):
- if (firstRun == True):
- time.sleep(1)
- self.player.set_state(gst.STATE_PLAYING)
- def start_stop_recordHQ(self, w):
- global timeElapsed
- if self.recHQBtn.get_label() == "Rec(HQ)":
- self.SetPipelines("HQ")
- timeElapsed = 0
- self.recHQBtn.set_label("Stop Recording")
- self.player.set_state(gst.STATE_NULL)
- if self.recorderLQ != None:
- self.recorderLQ.set_state(gst.STATE_NULL)
- time.sleep(1)
- self.recorderHQ.set_state(gst.STATE_PLAYING)
- self.recHQBtn.set_sensitive(True)
- self.recLQBtn.set_sensitive(False)
- self.viewCamBtn.set_sensitive(False)
- self.updateET()
- else:
- self.recorderHQ.set_state(gst.STATE_NULL)
- time.sleep(1)
- if self.recorderLQ != None:
- self.recorderLQ.set_state(gst.STATE_NULL)
- self.player.set_state(gst.STATE_PLAYING)
- self.recHQBtn.set_label("Rec(HQ)")
- self.recHQBtn.set_sensitive(True)
- self.recLQBtn.set_sensitive(True)
- self.viewCamBtn.set_sensitive(True)
- self.ET.set_label("")
- def start_stop_recordLQ(self, w):
- global timeElapsed
- if self.recLQBtn.get_label() == "Rec(LQ)":
- self.SetPipelines("LQ")
- timeElapsed = 0
- self.recLQBtn.set_label("Stop Recording")
- self.player.set_state(gst.STATE_NULL)
- if self.recorderHQ != None:
- self.recorderHQ.set_state(gst.STATE_NULL)
- time.sleep(1)
- self.recorderLQ.set_state(gst.STATE_PLAYING)
- self.recLQBtn.set_sensitive(True)
- self.recHQBtn.set_sensitive(False)
- self.viewCamBtn.set_sensitive(False)
- self.updateET()
- else:
- self.recorderLQ.set_state(gst.STATE_NULL)
- time.sleep(1)
- if self.recorderHQ != None:
- self.recorderHQ.set_state(gst.STATE_NULL)
- self.player.set_state(gst.STATE_PLAYING)
- self.recLQBtn.set_label("Rec(LQ)")
- self.recHQBtn.set_sensitive(True)
- self.recLQBtn.set_sensitive(True)
- self.viewCamBtn.set_sensitive(True)
- self.ET.set_label("")
- def updateET(self):
- global timeElapsed
- self.ET.set_label(str(timeElapsed)+" sec.")
- print str(timeElapsed)+" sec."
- timeElapsed = timeElapsed + 1
- if self.recHQBtn.get_label() == "Stop Recording" or self.recLQBtn.get_label() == "Stop Recording":
- gobject.timeout_add(1000, self.updateET)
- else:
- self.ET.set_label("")
- def ViewVideos(self, widget, action):
- subprocess.Popen([EXECCMD, EXECARGS], stdout = -1, stderr=-1)
- def SetAutoExposure(self, widget, action):
- if action == "off":
- subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto", "0"], stdout = 1, stderr= 1)
- time.sleep(.1)
- subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto Priority", "0"], stdout = 1, stderr= 1)
- subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto", "3"], stdout = 1, stderr= 1)
- elif action == "on":
- subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto", "3"], stdout = 1, stderr= 1)
- subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto Priority", "1"], stdout = 1, stderr= 1)
- def ViewVideos(self, widget, action):
- subprocess.Popen([EXECCMD, EXECARGS], stdout = -1, stderr=-1)
- def exit(self, widget, data=None):
- gtk.main_quit()
- def on_message(self, bus, message):
- t = message.type
- if t == gst.MESSAGE_EOS:
- self.player.set_state(gst.STATE_NULL)
- if self.recorderHQ != None:
- self.recorderHQ.set_state(gst.STATE_NULL)
- if self.recorderLQ != None:
- self.recorderLQ.set_state(gst.STATE_NULL)
- self.recHQBtn.set_label("Rec(HQ)")
- self.recLQBtn.set_label("Rec(LQ)")
- self.recHQBtn.set_sensitive(True)
- self.recLQBtn.set_sensitive(True)
- self.viewCamBtn.set_sensitive(True)
- elif t == gst.MESSAGE_ERROR:
- err, debug = message.parse_error()
- print "Error: %s" % err, debug
- gobject.timeout_add(1000, self.ET.set_label, "Error: %s" % err)
- self.player.set_state(gst.STATE_NULL)
- if self.recorderHQ != None:
- self.recorderHQ.set_state(gst.STATE_NULL)
- if self.recorderLQ != None:
- self.recorderLQ.set_state(gst.STATE_NULL)
- self.recHQBtn.set_label("Rec(HQ)")
- self.recLQBtn.set_label("Rec(LQ)")
- self.recHQBtn.set_sensitive(True)
- self.recLQBtn.set_sensitive(True)
- self.viewCamBtn.set_sensitive(True)
- def on_sync_message(self, bus, message):
- if message.structure is None:
- return
- message_name = message.structure.get_name()
- if message_name == 'prepare-xwindow-id':
- # Assign the viewport
- imagesink = message.src
- imagesink.set_property('force-aspect-ratio', True)
- imagesink.set_xwindow_id(self.movie_window.window.xid)
- GTK_Main()
- gtk.gdk.threads_init()
- gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement