TheLegace

video

May 17th, 2012
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.30 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 fsink_handoff_handle(self, element, buff, pad):
  121.         ''''''
  122.         self.buffer = buff.copy_on_write()
  123.  
  124.     def on_message(self, bus, message):
  125.        
  126.         t = message.type
  127.         if t == gst.MESSAGE_EOS:
  128.             self.pipeline.set_state(gst.STATE_NULL)
  129.             print "end of message"
  130.         elif t == gst.MESSAGE_ERROR:
  131.             err, debug = message.parse_error()
  132.             print "Error: %s" % err, debug
  133.             self.pipeline.set_state(gst.STATE_NULL)
  134.  
  135.     def on_sync_message(self, bus, message):
  136.         if message.structure is None:
  137.             return
  138.         message_name = message.structure.get_name()
  139.         if message_name == "prepare-xwindow-id":
  140.             win_id = self.windowId
  141.             assert win_id
  142.             imagesink = message.src
  143.             imagesink.set_xwindow_id(win_id)
  144.  
  145.     def start_preview(self):
  146.         self.pipeline.set_state(gst.STATE_PLAYING)
  147.         print "should be playing"
  148.        
  149.     def stop_preview(self):
  150.         """
  151.         Stop the preview from the camera
  152.         """
  153.         if self.pipeline:
  154.             self.pipe.set_state(gst.STATE_NULL)
  155.             print "should be stopped"  
  156.    
  157.     def capture_frame(self):
  158.         success, state, pending = self.pipeline.get_state(1)
  159.         lcl = time.localtime(time.time())
  160.         fmta = '%A' #week day
  161.         fmtd = '%d' #day in numbers
  162.         fmtb = '%b' #month with letters
  163.         fmty = '%Y' #year
  164.         fmth = '%H.%M.%S'
  165.        
  166.         self.stria = time.strftime(fmta,lcl)
  167.         self.strid = time.strftime(fmtd,lcl)
  168.         self.strib = time.strftime(fmtb,lcl)
  169.         self.striy = time.strftime(fmty,lcl)
  170.         self.strih = time.strftime(fmth,lcl)
  171.        
  172.         pixmap = QtGui.QPixmap()
  173.        
  174.         if not pending:
  175.             if state == gst.STATE_PLAYING:
  176.                 if len(self.buffer) > 0:
  177.                     print len(self.buffer)
  178.                     print self.width(), self.height()
  179.                     #~ pic = gtk.gdk.pixbuf_loader_new_with_mime_type("image/jpeg")
  180.                     #~ pic.write(self.buffer)
  181.                     #~ pic.close()
  182.                     #~ pixBuf = pic.get_pixbuf( )
  183.                     #~ print type(pixBuf.get_pixels_array())
  184.                     print pixmap.loadFromData(self.buffer)
  185.                     pixmap = pixmap.scaled(800,600)
  186.                     pixmap.save(self.strid + '-' +self.strib+ '-' + self.striy + '-' +self.strih + '.png')
  187.                    
  188.                    
  189.                     #~ print image.loadFromData(pixBuf)
  190.                     #~ print pixmap.loadFromData(self.buffer.tostring())
  191.                     #~ print self.buffer
  192.                     #~ print image.loadFromData(QtCore.QByteArray(str(self.buffer)))
  193.                     #~ cv_im = cv.CreateImageHeader((self.width(), self.height()), cv.IPL_DEPTH_16U, 3)
  194.                     #~ cv.SetData(cv_im, self.buffer.data)
  195.                     #~ cv.CvtColor(cv_im, cv_im, cv.CV_BGR2RGB)
  196.                     #~ cv.SaveImage("foo.jpg", cv_im)
  197.                     #~ cv.WaitKey()
  198.                 else:
  199.                     print "Image failed"
  200.         #~ print self.buffer.data
  201.         #~ pixmap = QtGui.QPixmap(self.buffer.data)
  202.         return pixmap
  203. if __name__ == "__main__":
  204.     gobject.threads_init()
  205.     app = QtGui.QApplication(sys.argv)
  206.     video = Video()
  207.    
  208.     #~ video.setupUSBCam()
  209.     video.setupRTSPCam()
  210.     video.setupStream()
  211.     #~ video.capture_frame()
  212.     #~ video.start_preview()
  213.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment