TheLegace

video.py

May 5th, 2012
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.41 KB | None | 0 0
  1. import gobject, pygst
  2. pygst.require('0.10')
  3. import gst
  4. from PyQt4.QtGui import QMainWindow, QWidget, QApplication
  5. import sys
  6.  
  7. class Video(QMainWindow):
  8.     def __init__(self):
  9.         QMainWindow.__init__(self)
  10.         container = QWidget()
  11.         self.setCentralWidget(container)
  12.         self.windowId = container.winId()
  13.         self.setGeometry(300,300,800,600)
  14.         self.show()
  15.        
  16.         self.pipeline = gst.Pipeline("player")
  17.         #~ sel
  18.    
  19.     def setupLocal(self):
  20.        
  21.         self.source = gst.element_factory_make("v4l2src", "source")
  22.        
  23.         self.vidcolorspace = gst.element_factory_make("ffmpegcolorspace","vidcolorspace")
  24.         self.imgcolorspace = gst.element_factory_make("ffmpegcolorspace","imgcolorspace")
  25.         self.tee = gst.element_factory_make("tee", "tee")
  26.        
  27.         self.vidqueue = gst.element_factory_make("queue", "videoqueue")
  28.         self.imgqueue = gst.element_factory_make("queue", "imgqueue")
  29.        
  30.         self.sink = gst.element_factory_make("xvimagesink", "sink")
  31.         self.fvidscale_cap = gst.element_factory_make("capsfilter", "fvidscale_cap")
  32.         self.fvidscale = gst.element_factory_make("videoscale", "fvidscale")
  33.         self.caps = gst.caps_from_string('video/x-raw-yuv')
  34.         self.fvidscale_cap.set_property('caps', caps)
  35.         self.source.set_property("device", "/dev/video1")
  36.        
  37.         self.imagesink = gst.element_factory_make("fakesink", "image_sink");
  38.        
  39.         self.pipeline.add(self.source, self.fvidscale, self.fvidscale_cap, self.colorspace, self.tee,\
  40.             self.vidqueue, self.sink, self.imgqueue, self.imgsink)
  41.         gst.element_link_many(self.source, self.fvidscale, self.fvidscale_cap, self.colorspace, self.tee,\
  42.             self.vidqueue, self.sink)
  43.         gst.element_link_many(self.source, self.fvidscale, self.fvidscale_cap, self.colorspace, self.tee,\
  44.             self.imgqueue, self.imgsink)
  45.        
  46.         self.imgsink.set_property("signal-handoffs", True)
  47.         fakesink.connect("handoff", buffer_cb)
  48.        
  49.         self.bus = self.pipeline.get_bus()
  50.         self.bus.add_signal_watch()
  51.         self.bus.enable_sync_message_emission()
  52.         self.bus.connect("message", self.on_message)
  53.         self.bus.connect("sync-message::element", self.on_sync_message)
  54.        
  55.         self.start_preview()
  56.        
  57.     #~ def setupRTSP(self, loc):
  58.         #~ pipeline = gst.parse_launch("rtspsrc location=rtsp://localhost:9400/test name=source latency=0 ! decodebin2 ! autovideosink")
  59.         #~ source = pipeline.get_by_name("source")
  60.         #~ source.props.location =  loc
  61.         #~
  62.         #~ source = gst.element_factory_make("rtspsrc", "source")
  63.         #~ source.set_property("location", loc)
  64.         #~
  65.         #~ decode = gst.element_factory_make("decodebin2", "decoder")
  66.         #~ decode.connect("new-decoded-pad", self.OnDynamicPad)
  67.         #~
  68.         #~ self.sink = gst.element_factory_make("xvimagesink", "sink")
  69.         #~ fvidscale_cap = gst.element_factory_make("capsfilter", "fvidscale_cap")
  70.         #~ fvidscale = gst.element_factory_make("videoscale", "fvidscale")
  71.         #~ caps = gst.caps_from_string('video/x-raw-yuv, width=800,height=600')
  72.         #~ fvidscale_cap.set_property('caps', caps)
  73.         #~
  74.         #~ self.convert = gst.element_factory_make("autovideoconvert", "sink")
  75.         #~
  76.         #~ self.pipeline.add(source)
  77.         #~ self.pipeline.add(decode)
  78.         #~ self.pipeline.add(fvidscale)
  79.         #~ self.pipeline.add(fvidscale_cap)
  80.         #~ self.pipeline.add(self.convert)
  81.         #~ self.pipeline.add(sink)
  82.        
  83.     #~ def getImage(self):
  84.         #~
  85.         #~ self.stop_preview(fileloc)
  86.         #~
  87.         #~ self.pipeline.remove(self.sink)
  88.         #~ pngenc = gst.element_factory_make("pngenc","pngencoder")
  89.         #~ pngenc.set_property("snapshot","true")
  90.         #~
  91.         #~ filesink = gst.element_factory_make("filesink")
  92.         #~ filesink.set_property("location", fileloc)
  93.         #~
  94.         #~ self.pipeline.add(pngeng, filesink)
  95.         #~ gst.element_link_many(self.source, self.fvidscale, self.fvidscale_cap, self.colorspace, pngenc, filesink)
  96.         #~
  97.         #~ self.bus = self.pipeline.get_bus()
  98.         #~ self.bus.add_signal_watch()
  99.         #~ self.bus.enable_sync_message_emission()
  100.         #~ self.bus.connect("message", self.on_message)
  101.         #~ self.bus.connect("sync-message::element", self.on_sync_message)
  102.         #~
  103.         #~
  104.         #~ self.start_preview()
  105.         #~
  106.         #~ # Wait for a picture to finish
  107.         #~ msg = bus.poll(gst.MESSAGE_EOS|gst.MESSAGE_ERROR, -1)
  108.         #~ if msg.type == gst.MESSAGE_ERROR:
  109.             #~ err,debug = msg.parse_error()
  110.             #~ raise Exception(debug)
  111. #~
  112.         #~ self.stop_preview()
  113.         #~
  114.         #~ self.pipeline.remove(filesink)
  115.  
  116.     def OnDynamicPad(self, dbin, pad, islast):
  117.         print "OnDynamicPad Called!"
  118.         pad.link(self.convert.get_pad("sink"))
  119.    
  120.     def on_message(self, bus, message):
  121.        
  122.         t = message.type
  123.         if t == gst.MESSAGE_EOS:
  124.             self.pipeline.set_state(gst.STATE_NULL)
  125.             print "end of message"
  126.         elif t == gst.MESSAGE_ERROR:
  127.             err, debug = message.parse_error()
  128.             print "Error: %s" % err, debug
  129.             self.pipeline.set_state(gst.STATE_NULL)
  130.  
  131.     def on_sync_message(self, bus, message):
  132.         if message.structure is None:
  133.             return
  134.         message_name = message.structure.get_name()
  135.         if message_name == "prepare-xwindow-id":
  136.             win_id = self.windowId
  137.             assert win_id
  138.             imagesink = message.src
  139.             imagesink.set_xwindow_id(win_id)
  140.  
  141.     def start_preview(self):
  142.         self.pipeline.set_state(gst.STATE_PLAYING)
  143.         print "should be playing"
  144.        
  145.     def stop_preview(self):
  146.         """
  147.         Stop the preview from the camera
  148.         """
  149.         if self.pipeline:
  150.             self.pipe.set_state(gst.STATE_NULL)
  151.             print "should be stopped"  
  152.  
  153. #~ if __name__ == "__main__":
  154.     #~ gobject.threads_init()
  155.     #~ app = QApplication(sys.argv)
  156.     #~ video = Video()
  157.     #~ video.setUpGst()
  158.     #~ video.startPrev()
  159.     #~ sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment