Advertisement
Guest User

poorly written Python script to record webcam

a guest
Feb 3rd, 2012
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.74 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3.  
  4. import sys, os, time
  5. import subprocess, pygtk, gtk, gobject
  6. from subprocess import *
  7. from dbus.mainloop.glib import DBusGMainLoop
  8. from PIL import Image
  9. import dbus.service
  10. import dbus.glib
  11. import pygst
  12. pygst.require("0.10")
  13. import gst
  14.  
  15. try:
  16.     import dl
  17.     libc = dl.open('/lib/libc.so.6')
  18.     libc.call('prctl', 15, 'video-recorder\0', 0, 0, 0) # 15 is PR_SET_NAME
  19. except:
  20.     print "FUCK!"
  21.     pass
  22.  
  23. #Window default behavior, if you care to modify it
  24. WINDOW_STICK=False
  25. WINDOW_KEEPABOVE=False
  26. WINDOW_DECORATED=True
  27.  
  28. #Default size and position for the main viewing window
  29. WIDTH=760
  30. HEIGHT=480
  31. TOP=0
  32. LEFT=0
  33. #Default size and position for the UVC controls window
  34. CTLWIDTH=800
  35. CTLHEIGHT=580
  36. CTLTOP=0
  37. CTLLEFT=0
  38.  
  39. #File browser executable, directory you would like to launch the file browser to,
  40. #and full path to the uvcdynctrl execuable
  41. EXECCMD="thunar"
  42. EXECARGS='/mediadrive/video/recordings/'
  43. UVCDYNCTRLEXEC="/usr/bin/uvcdynctrl"
  44.  
  45. timeElapsed = 0
  46. #Device node for your webcam
  47. #videoDevice="/dev/video0"
  48. videoDevice="/dev/v4l/by-id/usb-Philips_CE_Philips_SPC_1300NC_Webcam-video-index0"
  49. #gstreamer v4l2 properties for your webcam
  50. #videoProperties="image/jpeg,width=640,height=480,framerate=30/1"
  51. #videoProperties="video/x-raw-yuv,width=640,height=480,framerate=30/1"
  52. VIDEOPROPSLOWRES="image/jpeg,width=640,height=480,framerate=30/1"
  53. VIDEOPROPSLOWRESRAW="video/x-raw-yuv,width=640,height=480,framerate=30/1"
  54. VIDEOPROPSHIRES="video/x-raw-yuv,width=1280,height=1024,framerate=9/1"
  55. VIDEOPROPSHIRESRAW="image/jpeg,width=1280,height=1024,framerate=15/1"
  56. videoProperties = VIDEOPROPSLOWRES
  57. videoPropertiesRaw = VIDEOPROPSLOWRESRAW
  58. #video effects
  59. videoEffects=" ffmpegcolorspace ! videoflip method=2 ! "
  60. #videoEffects=""
  61.  
  62. #audio device for recording from your webcam (or other source)
  63. audioDevice="hw:1,0"
  64. #format for audio recording (many webcams use a rate of 16000 with 1 channel)
  65. audioProperties="audio/x-raw-int,rate=48000,channels=2,depth=16"
  66. #video sink
  67. videoSink="xvimagesink"
  68. #Directory where you would like to save the videos
  69. filePath='/mediadrive/video/recordings/'
  70. #Additional gstreamer properties for mpeg 4
  71. mpeg4Properties=" bitrate=4194304"
  72.  
  73.  
  74. class GTK_Main:
  75.  
  76.     def __init__(self):
  77.         global filePath, videoDevice, videoProperties, videoSink
  78.         window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  79.         window.set_title("Video-Recorder")
  80.         window.set_size_request(WIDTH, HEIGHT)
  81.         window.set_decorated(WINDOW_DECORATED)
  82.         window.connect("destroy", gtk.main_quit, "WM destroy")
  83.         window.move(LEFT, TOP)
  84.         mainBox = gtk.HBox()
  85.         window.add(mainBox)
  86.         vbox = gtk.VBox()
  87.         mainBox.add(vbox)
  88.         self.movie_window = gtk.DrawingArea()
  89.         vbox.add(self.movie_window)
  90.         controlBox = gtk.VBox()
  91.         mainBox.pack_start(controlBox, False)
  92.         controlBox.set_size_request(120,480)
  93.         controlBox.set_border_width(0)
  94.         controlBox.pack_start(gtk.Label())
  95.         self.recHQBtn = gtk.Button("Rec(HQ)")
  96.         self.recHQBtn.connect("clicked", self.start_stop_recordHQ)
  97.         controlBox.pack_start(self.recHQBtn, True, True, 0)
  98.  
  99.         self.recLQBtn = gtk.Button("Rec(LQ)")
  100.         self.recLQBtn.connect("clicked", self.start_stop_recordLQ)
  101.         controlBox.pack_start(self.recLQBtn, True, True, 0)
  102.  
  103.         self.viewCamBtn = gtk.Button("Watch")
  104.         self.viewCamBtn.connect("clicked", self.start)
  105.         controlBox.pack_start(self.viewCamBtn, False)
  106.  
  107.         self.setAutoOff = gtk.Button("A.E Off")
  108.         self.setAutoOff.connect("clicked", self.SetAutoExposure, "off")
  109.         controlBox.pack_start(self.setAutoOff, False)
  110.  
  111.         self.setAutoOn = gtk.Button("A.E On")
  112.         self.setAutoOn.connect("clicked", self.SetAutoExposure, "on")
  113.         controlBox.pack_start(self.setAutoOn, False)
  114.  
  115.         self.controls = gtk.Button("Controls")
  116.         self.controls.connect("clicked", self.OpenControlsWindow)
  117.         controlBox.pack_start(self.controls, False)
  118.  
  119.         self.viewBtn = gtk.Button("Browse...")
  120.         self.viewBtn.connect("clicked", self.ViewVideos, "view")
  121.         controlBox.pack_start(self.viewBtn, True, True, 0)
  122.  
  123.         self.quitBtn = gtk.Button("Quit")
  124.         self.quitBtn.connect("clicked", self.exit)
  125.         controlBox.pack_start(self.quitBtn, False)
  126.  
  127.         controlBox.add(gtk.Label())
  128.         self.ET = gtk.Label()
  129.         self.ET.set_line_wrap(True)
  130.         controlBox.pack_start(self.ET, False)
  131.         window.show_all()
  132.  
  133.         #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)
  134.         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)
  135.         bus = self.player.get_bus()
  136.         bus.add_signal_watch()
  137.         bus.enable_sync_message_emission()
  138.         bus.connect('message', self.on_message)
  139.         bus.connect('sync-message::element', self.on_sync_message)
  140.         self.start(firstRun = True)
  141.         self.recorderLQ = None
  142.         self.recorderHQ = None
  143.  
  144.     def DestroyWin(self, widget, win):
  145.         win.destroy()
  146.  
  147.     def OpenControlsWindow(self, widget):
  148.         self.ctrlWindow = gtk.Window(gtk.WINDOW_TOPLEVEL)
  149.         self.ctrlWindow.set_title("UVC Dynctrl Preferences")
  150.         self.ctrlWindow.set_size_request(CTLWIDTH, CTLHEIGHT)
  151.         self.ctrlWindow.set_decorated(WINDOW_DECORATED)
  152.         self.ctrlWindow.connect("destroy", self.DestroyWin, self.ctrlWindow)
  153.         self.ctrlWindow.move(CTLLEFT, CTLTOP)
  154.         mainBox = gtk.HBox()
  155.         self.ctrlWindow.add(mainBox)
  156.         hbox = gtk.HBox()
  157.         controlBox = gtk.VBox()
  158.         mainBox.pack_start(controlBox, False)
  159.         controlBox.set_size_request(150,480)
  160.         controlBox.set_border_width(10)
  161.         controlBox.pack_start(gtk.Label())
  162.         Controls=self.getControls(self)
  163.         self.ctrlVBoxes = []
  164.         self.ctrlHBoxes = []
  165.         self.ctrlBtnPlus = []
  166.         self.ctrlBtnMinus = []
  167.         self.ctrlValue = []
  168.         for control in Controls:
  169.             indx = Controls.index(control)
  170.  
  171.             if not(indx % 4) or indx == 0:
  172.                 tmpHBox = gtk.HBox()
  173.                 self.ctrlHBoxes.append(tmpHBox)
  174.                 controlBox.pack_start(tmpHBox, False)
  175.             tmpVBox = gtk.VBox()
  176.             tmpBtnPlus = gtk.Button(control[0]+ " +")
  177.             tmpBtnMinus = gtk.Button(control[0]+ " -")
  178.             tmpValue = gtk.Label()
  179.             self.ctrlVBoxes.append(tmpVBox)
  180.             self.ctrlHBoxes[(int(indx / 4))].pack_start(self.ctrlVBoxes[indx], False)
  181.             self.ctrlVBoxes[indx].add(gtk.Label())
  182.             self.ctrlValue.append(tmpValue)
  183.             self.ctrlValue[indx].set_label(control[1])
  184.             self.ctrlVBoxes[indx].pack_start(self.ctrlValue[indx], False)
  185.             self.ctrlBtnPlus.append(tmpBtnPlus)
  186.             self.ctrlBtnPlus[indx].connect("clicked", self.setControls, self.ctrlValue[indx])
  187.             self.ctrlVBoxes[indx].pack_start(self.ctrlBtnPlus[indx], False)
  188.             self.ctrlBtnMinus.append(tmpBtnMinus)
  189.             self.ctrlBtnMinus[indx].connect("clicked", self.setControls, self.ctrlValue[indx])
  190.             self.ctrlVBoxes[indx].pack_start(self.ctrlBtnMinus[indx], False)
  191.  
  192.  
  193.         self.quitBtn = gtk.Button("Close")
  194.         self.quitBtn.connect("clicked", self.DestroyWin, self.ctrlWindow)
  195.         controlBox.pack_start(self.quitBtn, False)
  196.         self.ctrlWindow.show_all()
  197.  
  198.  
  199.     def getControls(self, widget, what="all"):
  200.         if what == "all":
  201.             Controls = []
  202.             lines = subprocess.Popen([UVCDYNCTRLEXEC, "-d",  "video1", "-c"], stdout = PIPE)
  203.             lines = lines.stdout.readlines()
  204.             for line in lines:
  205.                 if line[0:7] != "Listing":
  206.                     Controls.append([line.strip()])
  207.             for control in Controls:
  208.                 lines = subprocess.Popen([UVCDYNCTRLEXEC, "-d",  "video1", "-g", control[0]], stdout = PIPE)
  209.                 lines = lines.stdout.readlines()
  210.                 for line in lines:
  211.                     if line[0:7] != "Listing":
  212.                         Controls[Controls.index(control)].append(line.strip())
  213.             return Controls
  214.         elif what != "all":
  215.             lines = subprocess.Popen([UVCDYNCTRLEXEC,"-d",  "video1", "-g", what], stdout = PIPE)
  216.             lines = lines.stdout.readlines()
  217.             for line in lines:
  218.                 if line != "Listing available controls for device video0:\n":
  219.                     return line.strip()
  220.  
  221.  
  222.     def setControls(self, widget, label):
  223.         controlToSet = widget.get_label()
  224.         control = controlToSet[0:(len(controlToSet)-2)]
  225.         if controlToSet[(len(controlToSet)-1):len(controlToSet)] == "+":
  226.             value = str(int(label.get_label()) + 1)
  227.         elif controlToSet[(len(controlToSet)-1):len(controlToSet)] == "-":
  228.             value = str(int(label.get_label()) - 1)
  229.         lines = subprocess.Popen([UVCDYNCTRLEXEC, "-d",  "video1", "-s", control, value], stdout = PIPE)
  230.         lines = lines.stdout.readlines()
  231.         if len(lines):
  232.             for line in lines:
  233.                 print line
  234.         label.set_label(self.getControls(None,control))
  235.         return True
  236.  
  237.     def SetPipelines(self, Type):
  238.         global filePath, videoDevice, videoPropertiesRaw, videoProperties, videoSink, audioDevice, audioProperties, mpeg4Properties
  239.         if Type == "LQ":
  240.         #'''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)
  241.             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)
  242.             busrecLQ = self.recorderLQ.get_bus()
  243.             busrecLQ.add_signal_watch()
  244.             busrecLQ.enable_sync_message_emission()
  245.             busrecLQ.connect('message', self.on_message)
  246.             busrecLQ.connect('sync-message::element', self.on_sync_message)
  247.             self.recorderHQ = None
  248.         elif Type == "HQ":
  249.         #'''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)
  250.             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)
  251.             busrecHQ = self.recorderHQ.get_bus()
  252.             busrecHQ.add_signal_watch()
  253.             busrecHQ.enable_sync_message_emission()
  254.             busrecHQ.connect('message', self.on_message)
  255.             busrecHQ.connect('sync-message::element', self.on_sync_message)
  256.             self.busrecLQ = None
  257.  
  258.     def start(self, firstRun = False):
  259.         if (firstRun == True):
  260.             time.sleep(1)
  261.         self.player.set_state(gst.STATE_PLAYING)
  262.     def start_stop_recordHQ(self, w):
  263.         global timeElapsed
  264.         if self.recHQBtn.get_label() == "Rec(HQ)":
  265.             self.SetPipelines("HQ")
  266.             timeElapsed = 0
  267.             self.recHQBtn.set_label("Stop Recording")
  268.             self.player.set_state(gst.STATE_NULL)
  269.             if self.recorderLQ != None:
  270.                 self.recorderLQ.set_state(gst.STATE_NULL)
  271.             time.sleep(1)
  272.             self.recorderHQ.set_state(gst.STATE_PLAYING)
  273.             self.recHQBtn.set_sensitive(True)
  274.             self.recLQBtn.set_sensitive(False)
  275.             self.viewCamBtn.set_sensitive(False)
  276.             self.updateET()
  277.         else:
  278.             self.recorderHQ.set_state(gst.STATE_NULL)
  279.             time.sleep(1)
  280.             if self.recorderLQ != None:
  281.                 self.recorderLQ.set_state(gst.STATE_NULL)
  282.             self.player.set_state(gst.STATE_PLAYING)
  283.             self.recHQBtn.set_label("Rec(HQ)")
  284.             self.recHQBtn.set_sensitive(True)
  285.             self.recLQBtn.set_sensitive(True)
  286.             self.viewCamBtn.set_sensitive(True)
  287.             self.ET.set_label("")
  288.     def start_stop_recordLQ(self, w):
  289.         global timeElapsed
  290.         if self.recLQBtn.get_label() == "Rec(LQ)":
  291.             self.SetPipelines("LQ")
  292.             timeElapsed = 0
  293.             self.recLQBtn.set_label("Stop Recording")
  294.             self.player.set_state(gst.STATE_NULL)
  295.             if self.recorderHQ != None:
  296.                 self.recorderHQ.set_state(gst.STATE_NULL)
  297.             time.sleep(1)
  298.             self.recorderLQ.set_state(gst.STATE_PLAYING)
  299.             self.recLQBtn.set_sensitive(True)
  300.             self.recHQBtn.set_sensitive(False)
  301.             self.viewCamBtn.set_sensitive(False)
  302.             self.updateET()
  303.         else:
  304.             self.recorderLQ.set_state(gst.STATE_NULL)
  305.             time.sleep(1)
  306.             if self.recorderHQ != None:
  307.                 self.recorderHQ.set_state(gst.STATE_NULL)
  308.             self.player.set_state(gst.STATE_PLAYING)
  309.             self.recLQBtn.set_label("Rec(LQ)")
  310.             self.recHQBtn.set_sensitive(True)
  311.             self.recLQBtn.set_sensitive(True)
  312.             self.viewCamBtn.set_sensitive(True)
  313.             self.ET.set_label("")
  314.     def updateET(self):
  315.         global timeElapsed
  316.         self.ET.set_label(str(timeElapsed)+" sec.")
  317.         print str(timeElapsed)+" sec."
  318.         timeElapsed = timeElapsed + 1
  319.         if self.recHQBtn.get_label() == "Stop Recording" or self.recLQBtn.get_label() == "Stop Recording":
  320.             gobject.timeout_add(1000, self.updateET)
  321.         else:
  322.             self.ET.set_label("")
  323.  
  324.     def ViewVideos(self, widget, action):
  325.         subprocess.Popen([EXECCMD, EXECARGS], stdout = -1, stderr=-1)
  326.  
  327.     def SetAutoExposure(self,  widget, action):
  328.         if action == "off":
  329.             subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto", "0"], stdout = 1, stderr= 1)
  330.             time.sleep(.1)
  331.             subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto Priority", "0"], stdout = 1, stderr= 1)
  332.             subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto", "3"], stdout = 1, stderr= 1)
  333.  
  334.         elif action == "on":
  335.             subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto", "3"], stdout = 1, stderr= 1)
  336.             subprocess.Popen([UVCDYNCTRLEXEC, "-s", "Exposure, Auto Priority", "1"], stdout = 1, stderr= 1)
  337.  
  338.     def ViewVideos(self, widget, action):
  339.         subprocess.Popen([EXECCMD, EXECARGS], stdout = -1, stderr=-1)
  340.  
  341.     def exit(self, widget, data=None):
  342.         gtk.main_quit()
  343.  
  344.     def on_message(self, bus, message):
  345.         t = message.type
  346.         if t == gst.MESSAGE_EOS:
  347.             self.player.set_state(gst.STATE_NULL)
  348.             if self.recorderHQ != None:
  349.                 self.recorderHQ.set_state(gst.STATE_NULL)
  350.             if self.recorderLQ != None:
  351.                 self.recorderLQ.set_state(gst.STATE_NULL)
  352.             self.recHQBtn.set_label("Rec(HQ)")
  353.             self.recLQBtn.set_label("Rec(LQ)")
  354.             self.recHQBtn.set_sensitive(True)
  355.             self.recLQBtn.set_sensitive(True)
  356.             self.viewCamBtn.set_sensitive(True)
  357.         elif t == gst.MESSAGE_ERROR:
  358.             err, debug = message.parse_error()
  359.             print "Error: %s" % err, debug
  360.             gobject.timeout_add(1000, self.ET.set_label, "Error: %s" % err)
  361.             self.player.set_state(gst.STATE_NULL)
  362.             if self.recorderHQ != None:
  363.                 self.recorderHQ.set_state(gst.STATE_NULL)
  364.             if self.recorderLQ != None:
  365.                 self.recorderLQ.set_state(gst.STATE_NULL)
  366.             self.recHQBtn.set_label("Rec(HQ)")
  367.             self.recLQBtn.set_label("Rec(LQ)")
  368.             self.recHQBtn.set_sensitive(True)
  369.             self.recLQBtn.set_sensitive(True)
  370.             self.viewCamBtn.set_sensitive(True)
  371.     def on_sync_message(self, bus, message):
  372.         if message.structure is None:
  373.             return
  374.         message_name = message.structure.get_name()
  375.         if message_name == 'prepare-xwindow-id':
  376.             # Assign the viewport
  377.             imagesink = message.src
  378.             imagesink.set_property('force-aspect-ratio', True)
  379.             imagesink.set_xwindow_id(self.movie_window.window.xid)
  380.  
  381. GTK_Main()
  382. gtk.gdk.threads_init()
  383. gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement