Python Gstreamer, Webcam, and Pil

Jason (spot) Brower encompass at gmail.com
Sat Aug 24 09:31:30 PDT 2013


It sounds like Open CV may be better for this.  I have done it before for
that. just thought if I was using gstreamer for everyting else, I could use
it here too. Bummer,
Jason


On Sat, Aug 24, 2013 at 12:15 PM, Andrey Nechypurenko <
andreynech at googlemail.com> wrote:

> On 24 August 2013 10:14, Jason (spot) Brower <encompass at gmail.com> wrote:
> > I can take the picture and save the image to a file using just Gstreamer.
> > But I need to work with the image before I save it anyway, so how can I
> > convert it to PIL after I take the picture.
> > A code example would be handy. I have googled and no found it as far as I
> > have searched.
>
> One possible way would be to create the pipeline which ends with
> fakesink element and use it's handoff mechanism to get access to raw
> frame. For example:
>
> videotestsrc is-live=true !
> video/x-raw-yuv,width=640,height=480,framerate=30/1 ! ffmpegcolorspace
> ! video/x-raw-rgb, bpp=32, depth=32 ! fakesink sync=1
>
> The following code illustrates how to update OpenGL texture with it.
> Here on_gst_buffer(self, fakesink, buff, pad, data=None) will be
> invoked by gstreamer for each new frame and data contains raw decoded
> frame in format specified by the caps filter in front of fakesink.
>
> import ctypes
>
> import gobject
> import gst
>
> class Receiver(object):
>
>     def __init__(self, video_tex_id, pipeline_string):
>         self.tex_updated = True
>         self.texdata = (ctypes.c_ubyte * 640 * 480 * 4)()
>         self.video_tex_id = video_tex_id
>
>         # Create GStreamer pipeline
>         self.pipeline = gst.parse_launch(pipeline_string)
>
>         # Create bus to get events from GStreamer pipeline
>         self.bus = self.pipeline.get_bus()
>         self.bus.add_signal_watch()
>         self.bus.connect('message::eos', self.on_eos)
>         self.bus.connect('message::error', self.on_error)
>
>         self.fakesink = self.pipeline.get_by_name('fakesink0')
>         self.fakesink.props.signal_handoffs = True
>         self.fakesink.connect("handoff", self.on_gst_buffer)
>
>         self.pipeline.set_state(gst.STATE_PLAYING)
>
>
>     def on_gst_buffer(self, fakesink, buff, pad, data=None):
>         self.tex_updated = False
>         ctypes.memmove(self.texdata, buff.data, buff.size)
>         return gst.FLOW_OK
>
>
>     def updateTexture(self):
>         if not self.tex_updated and not self.texdata == None:
>             glBindTexture(GL_TEXTURE_2D, self.video_tex_id)
>             glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 640, 480, GL_RGBA,
> GL_UNSIGNED_BYTE, self.texdata)
>             self.tex_updated = True
>
>
>     def on_eos(self, bus, msg):
>         print('on_eos(): seeking to start of video')
>         self.pipeline.seek_simple(
>             gst.FORMAT_TIME,
>             gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,
>             0L
>         )
>
>
>     def on_error(self, bus, msg):
>         print('on_error():', msg.parse_error())
>
>
> HTH,
> Andrey.
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20130824/167c76a1/attachment.html>


More information about the gstreamer-devel mailing list