TheLegace

Untitled

May 17th, 2012
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.67 KB | None | 0 0
  1. import gobject, pygst
  2. pygst.require('0.10')
  3. import gst
  4. from PyQt4 import QtCore, QtGui
  5. import sys, random, cv, gtk, time
  6.  
  7. class Video(QtGui.QMainWindow):
  8.     def __init__(self):
  9.         QtGui.QMainWindow.__init__(self)
  10.         container = QtGui.QWidget()
  11.         self.setCentralWidget(container)
  12.         self.windowId = container.winId()
  13.        
  14.         self.windowId = container.winId()
  15.         self.setGeometry(300,300, 800, 600)
  16.        
  17.         self.show()
  18.        
  19.         self.pipeline = gst.Pipeline("pipeline")
  20.    
  21.     def setupUSBCam(self):
  22.        
  23.         self.source = gst.element_factory_make("v4l2src", "source")
  24.         self.source.set_property("device", "/dev/video0")
  25.         self.pipeline.add(self.source)
  26.        
  27.         fvidscale_cap = gst.element_factory_make("capsfilter", "fvidscale_cap")
  28.         fvidscale = gst.element_factory_make("videoscale", "fvidscale")
  29.         caps = gst.caps_from_string('video/x-raw-rgb,width=800,height=600')
  30.         fvidscale_cap.set_property('caps', caps)
  31.         self.pipeline.add(fvidscale)
  32.         self.pipeline.add(fvidscale_cap)
  33.        
  34.     def setupRTSPCam(self):
  35.        
  36.         self.source = gst.element_factory_make("rtspsrc", "source")
  37.         self.source.set_property("location", "rtsp://localhost:9400/stream")
  38.         self.source.connect('pad-added', self.on_new_stream)
  39.         #add the rtpsource to the pipeline
  40.         self.pipeline.add(self.source)
  41.        
  42.         self.decode = gst.element_factory_make("decodebin", "decode")
  43.         self.decode.connect('new-decoded-pad', self.on_new_decoded)
  44.        
  45.        
  46.         self.pipeline.add(self.decode)
  47.        
  48.        
  49.  
  50.     def on_new_stream(self, element, pad):
  51.        
  52.         decode = self.pipeline.get_by_name('decode').get_pad("sink")
  53.         pad.link(decode.get_pad('sink'))
  54.        
  55.        
  56.     def on_new_decoded(self, dbin, pad):
  57.         decode = pad.get_parent()
  58.         pipeline = decode.get_parent()
  59.         convert = pipeline.get_by_name('conv1')
  60.         decode.link(convert)
  61.         pipeline.set_state(gst.STATE_PLAYING)
  62.         print "linked!"
  63.        
  64.     def setupStream(self):     
  65.         conv1 = gst.element_factory_make('ffmpegcolorspace', 'conv1')
  66.         self.pipeline.add(conv1)
  67.         conv2 = gst.element_factory_make('ffmpegcolorspace', 'conv2')
  68.         self.pipeline.add(conv2)
  69.         tee = gst.element_factory_make("tee", "tee")
  70.         self.pipeline.add(tee)
  71.        
  72.         screen_queue = gst.element_factory_make("queue", "screen_queue")
  73.         self.pipeline.add(screen_queue)
  74.  
  75. #       /* Creates separate thread for the stream from which the image
  76. #        * is captured */
  77.        
  78.         image_queue = gst.element_factory_make("queue", "image_queue")
  79.         self.pipeline.add(image_queue)
  80.        
  81.         screen_sink = gst.element_factory_make ("xvimagesink", "screen_sink")
  82.        
  83.         fake_jpeg = gst.element_factory_make( "jpegenc", "jpegenc" )
  84.        
  85.        
  86.         image_sink = gst.element_factory_make('fakesink', 'image_sink')
  87.         image_sink.set_property("signal-handoffs", True)
  88.         image_sink.connect('handoff', self.fsink_handoff_handle)
  89.        
  90.        
  91.         screen_sink.set_property('sync', 'false')
  92.         image_sink.set_property('sync', 'false')
  93.         self.pipeline.add(screen_sink)
  94.         self.pipeline.add(image_sink)
  95.         self.pipeline.add(fake_jpeg)
  96.        
  97.         caps_yuv = gst.caps_from_string("video/x-raw-rgb")
  98.         self.caps_rgb = gst.caps_from_string("video/x-raw-rgb")
  99.        
  100.         #~ self.decode.link(conv1, caps_rgb)
  101.         conv1.link(tee)
  102.         tee.link(screen_queue)
  103.         screen_queue.link(conv2)
  104.         conv2.link(screen_sink)
  105.  
  106.         tee.link(image_queue)
  107.        
  108.         image_queue.link(fake_jpeg)
  109.         fake_jpeg.link(image_sink)
  110.  
  111.        
  112.         bus = self.pipeline.get_bus()
  113.         bus.add_signal_watch()
  114.         bus.enable_sync_message_emission()
  115.         bus.connect("sync-message::element", self.on_sync_message)
  116.         bus.connect("message", self.on_message)
  117.        
  118.         self.start_preview()
  119.        
  120.     #~ def bus_message(self, bus, message):
  121.         #~ if message.src.get_name() == "filesink":
  122.             #~ if message.parse_state_changed()[1] == gst.STATE_PLAYING:
  123.                 #~ print "FILESINK PLAYING"
  124.                 #~ self.jpegenc.unlink(self.filesink)
  125.                 #~ self.jpegcaps.unlink(self.jpegenc)
  126.                 #~ self.filesink.set_state(gst.STATE_PAUSED)
  127.                 #~ self.jpegenc.set_state(gst.STATE_PAUSED)
  128.    
  129.     def capture_frame(self):
  130.         success, state, pending = self.pipeline.get_state(1)
  131.         lcl = time.localtime(time.time())
  132.         fmta = '%A' #week day
  133.         fmtd = '%d' #day in numbers
  134.         fmtb = '%b' #month with letters
  135.         fmty = '%Y' #year
  136.         fmth = '%H.%M.%S'
  137.        
  138.         self.stria = time.strftime(fmta,lcl)
  139.         self.strid = time.strftime(fmtd,lcl)
  140.         self.strib = time.strftime(fmtb,lcl)
  141.         self.striy = time.strftime(fmty,lcl)
  142.         self.strih = time.strftime(fmth,lcl)
  143.        
  144.         pixmap = QtGui.QPixmap()
  145.        
  146.         if not pending:
  147.             if state == gst.STATE_PLAYING:
  148.                 if len(self.buffer) > 0:
  149.                     print len(self.buffer)
  150.                     print self.width(), self.height()
  151.                     #~ pic = gtk.gdk.pixbuf_loader_new_with_mime_type("image/jpeg")
  152.                     #~ pic.write(self.buffer)
  153.                     #~ pic.close()
  154.                     #~ pixBuf = pic.get_pixbuf( )
  155.                     #~ print type(pixBuf.get_pixels_array())
  156.                     print pixmap.loadFromData(self.buffer)
  157.                     pixmap = pixmap.scaled(800,600)
  158.                     pixmap.save(self.strid + '-' +self.strib+ '-' + self.striy + '-' +self.strih + '.png')
  159.                    
  160.                    
  161.                     #~ print image.loadFromData(pixBuf)
  162.                     #~ print pixmap.loadFromData(self.buffer.tostring())
  163.                     #~ print self.buffer
  164.                     #~ print image.loadFromData(QtCore.QByteArray(str(self.buffer)))
  165.                     #~ cv_im = cv.CreateImageHeader((self.width(), self.height()), cv.IPL_DEPTH_16U, 3)
  166.                     #~ cv.SetData(cv_im, self.buffer.data)
  167.                     #~ cv.CvtColor(cv_im, cv_im, cv.CV_BGR2RGB)
  168.                     #~ cv.SaveImage("foo.jpg", cv_im)
  169.                     #~ cv.WaitKey()
  170.                 else:
  171.                     print "Image failed"
  172.         #~ print self.buffer.data
  173.         #~ pixmap = QtGui.QPixmap(self.buffer.data)
  174.         return pixmap
  175.    
  176.     def fsink_handoff_handle(self, element, buff, pad):
  177.         ''''''
  178.         self.buffer = buff.copy_on_write()
  179.  
  180.     def on_message(self, bus, message):
  181.        
  182.         t = message.type
  183.         if t == gst.MESSAGE_EOS:
  184.             self.pipeline.set_state(gst.STATE_NULL)
  185.             print "end of message"
  186.         elif t == gst.MESSAGE_ERROR:
  187.             err, debug = message.parse_error()
  188.             print "Error: %s" % err, debug
  189.             self.pipeline.set_state(gst.STATE_NULL)
  190.  
  191.     def on_sync_message(self, bus, message):
  192.         if message.structure is None:
  193.             return
  194.         message_name = message.structure.get_name()
  195.         if message_name == "prepare-xwindow-id":
  196.             win_id = self.windowId
  197.             assert win_id
  198.             imagesink = message.src
  199.             imagesink.set_xwindow_id(win_id)
  200.  
  201.     def start_preview(self):
  202.         self.pipeline.set_state(gst.STATE_PLAYING)
  203.         print "should be playing"
  204.        
  205.     def stop_preview(self):
  206.         """
  207.         Stop the preview from the camera
  208.         """
  209.         if self.pipeline:
  210.             self.pipe.set_state(gst.STATE_NULL)
  211.             print "should be stopped"  
  212.  
  213. if __name__ == "__main__":
  214.     gobject.threads_init()
  215.     app = QtGui.QApplication(sys.argv)
  216.     video = Video()
  217.    
  218.     #~ video.setupUSBCam()
  219.     video.setupRTSPCam()
  220.     video.setupStream()
  221.     #~ video.capture_frame()
  222.     #~ video.start_preview()
  223.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment