# Gstreamer : how to put video in a gtk widget on windows?

**URL:** <https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111>\
**Category:** Ruby-Gnome 2\
**Created:** [September 2, 2013, 8:01pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111 "2013-09-02T20:01:19Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Sadaf\_N](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/858c86/32.png) [@Sadaf\_N](https://www.ruby-forum.com/u/Sadaf_N)\
**Post date:** [September 2, 2013, 8:01pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/1 "2013-09-02T20:01:19Z")

</div>

Hello,

On windows with old gst version, we use to put video in a  
gtk window with xwindow\_id:

view = Gst::ElementFactory.make(‘playbin’)  
view.video\_sink = Gst::ElementFactory.make(‘directdrawsink’)  
handle = Win32API.new(‘user32’, ‘GetForegroundWindow’, [], ‘N’).call  
view.video\_sink.xwindow\_id=handle

but it’s seem that from now ‘xwindow\_id’ do not exist.

NOTA:  
(view.video\_sink.methods - Object.methods) give :

copy,gtype,type,value  
(class GLib::Value)

---

<div class="post-metadata">

**Author:** ![raubarede](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/d07c76/32.png) [@raubarede](https://www.ruby-forum.com/u/raubarede)\
**Post date:** [September 15, 2013, 6:09pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/2 "2013-09-15T18:09:05Z")

</div>

Hi,

2013/9/3 Regis d’Aubarede [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> NOTA:  
> (view.video\_sink.methods - Object.methods) give :
> 
> copy,gtype,type,value  
> (class GLib::Value)

Please let me identify the problem.  
I tried the following codes on Windows.

In GStreamer 0.10 (Ruby/GStreamer 1.2.6 or earlier), “directdrawsink”  
exist.

```
gem "glib2", "1.2.6"
gem "gstreamer", "1.2.6"
require "gst"
p Gst::ElementFactory.make('directdrawsink')
#=> #<Gst::ElementDirectDrawSink:02BC1670 ptr=02C3D918>

```

In GStreamer 1.0 (Ruby/GStreamer 2.0.0 or later), “directdrawsink”  
does not seem to exist.

```
gem "glib2", "2.0.2"
gem "gstreamer", "2.0.2"
require "gst"
p Gst::ElementFactory.make('directdrawsink')
#=> nil

```

I’m looking for a list of elements.

–  
Masafumi Y.  
GitHub: myokoym

---

<div class="post-metadata">

**Author:** ![raubarede](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/d07c76/32.png) [@raubarede](https://www.ruby-forum.com/u/raubarede)\
**Post date:** [September 17, 2013, 4:03pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/3 "2013-09-17T16:03:18Z")

</div>

> I’m looking for a list of elements.

here the code (i try to use d3dvideosink) :  
require “gtk3”  
require “gst”

```
Gem.loaded_specs.map {|n,g| puts " | %10s %6s " %

```

[g.name,g.version] }

```
window = Gtk::Window.new
wid=Gtk::DrawingArea.new()
wid.set_size_request(200,100)
v =Gst::ElementFactory.make('playbin')
v.video_sink = Gst::ElementFactory.make('d3dvideosink')

require('win32api');
handle = Win32API.new('user32', 'GetForegroundWindow', [], 'N').call
p window.window.methods
v.video_sink.xwindow_id(handle) # !!!!scratch!!!!

v.uri = "file:///d:/usr/local/video/avi/film3.avi"

wid.events |= ( ::Gdk::Event::Mask::BUTTON_PRESS_MASK |

```

::Gdk::Event:😷:POINTER\_MOTION\_MASK |  
::Gdk::Event:😷:BUTTON\_RELEASE\_MASK)  
wid.signal\_connect(‘draw’) do |w1,e| end

```
window.signal_connect("destroy") {Gtk.main_quit}
window.add(wid)
window.show_all
Gtk.main

```

And the execution:

d:\usr\Ruby\local\Ruiby\samples\>ruby v.rb  
| pkg-config 1.1.4  
| glib2 2.0.2  
| gio2 2.0.2  
| atk 2.0.2  
| cairo 1.12.6  
| pango 2.0.2  
| gdk\_pixbuf2 2.0.2  
| gdk3 2.0.2  
| gtk3 2.0.2  
| gobject-introspection 2.0.2  
| gstreamer 2.0.2  
DL is deprecated, please use Fiddle  
[:to\_i, :to\_f, :to\_s, :to\_a, :to\_h, :inspect, :&, :|, :^, :nil?, :to\_r,  
:rationalize, :to\_c, :===, :=~, :!~, :eql?, :hash, :\<=\>, :class,  
:singleton\_class, :clone, :dup, :taint, :tainted?, :untaint, :untrust,  
:untrusted?, :trust, :freeze, :frozen?, :methods, :singleton\_methods,  
:protected\_methods, :private\_methods, :public\_methods,  
:instance\_variables, :instance\_variable\_get, :instance\_variable\_set,  
:instance\_variable\_defined?, :remove\_instance\_variable, :instance\_of?,  
:kind\_of?, :is\_a?, :tap, :send, :public\_send, :respond\_to?, :extend,  
:display, :method, :public\_method, :define\_singleton\_method, :object\_id,  
:to\_enum, :enum\_for, :==, :equal?, :!, :!=, :instance\_eval,  
:instance\_exec, : **send** , : **id** ]

(ruby.exe:7228): GStreamer-CRITICAL \*\*: gst\_child\_proxy\_get\_property:  
assertion `G_IS_VALUE (value)' failed v.rb:15:in `‘: undefined method `xwindow\_id’ for  
#\<GLib::Value:0692E3B0 ptr=06902908 own=true\> (NoMethodError)

---

<div class="post-metadata">

**Author:** ![raubarede](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/d07c76/32.png) [@raubarede](https://www.ruby-forum.com/u/raubarede)\
**Post date:** [September 17, 2013, 9:28pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/4 "2013-09-17T21:28:52Z")

</div>

That’s work !  
Thank you.

Discovering Clutter, it’s seem very mysterious, no tutorials…

bye

---

<div class="post-metadata">

**Author:** ![raubarede](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/d07c76/32.png) [@raubarede](https://www.ruby-forum.com/u/raubarede)\
**Post date:** [September 19, 2013, 6:03pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/5 "2013-09-19T18:03:38Z")

</div>

Good evening.

2013/9/18 Regis d’Aubarede [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Discovering Clutter, it’s seem very mysterious, no tutorials…

I started to write Ruby/Clutter tutorial.

[http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-clutter](http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-clutter)

Tell me if it is difficult to understand.

–  
Masafumi Y.  
GitHub: myokoym

---

<div class="post-metadata">

**Author:** ![raubarede](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/d07c76/32.png) [@raubarede](https://www.ruby-forum.com/u/raubarede)\
**Post date:** [September 17, 2013, 7:16pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/6 "2013-09-17T19:16:40Z")

</div>

Hi,

2013/9/17 Regis d’Aubarede [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> ```
> window = Gtk::Window.new
> v.uri = "file:///d:/usr/local/video/avi/film3.avi"
> 
> ```
> 
> | cairo 1.12.6  
> :untrusted?, :trust, :freeze, :frozen?, :methods, :singleton\_methods,  
> v.rb:15:in `<main>': undefined method `xwindow\_id’ for  
> #\<GLib::Value:0692E3B0 ptr=06902908 own=true\> (NoMethodError)
> 
> Attachments:  
> [http://www.ruby-forum.com/attachment/8729/v.rb](http://www.ruby-forum.com/attachment/8729/v.rb)

Umm… The API seemed to change.

Now, there is also the following way:

require “clutter-gtk” # gem install clutter-gtk (It uses gtk3)  
require “clutter-gst” # gem install clutter-gstreamer

clutter = ClutterGtk::Embed.new  
stage = clutter.stage

# For Clutter-GStreamer 2.0.2. This API will change.

video\_texture = ClutterGst::VideoTexture.new  
stage.add\_child(video\_texture)  
video\_texture.uri = “file:///d:/usr/local/video/avi/film3.avi”  
video\_texture.playing = true

window = Gtk::Window.new  
window.signal\_connect(“destroy”) {Gtk.main\_quit}  
window.add(clutter)  
window.show\_all  
Gtk.main

–  
Masafumi Y.  
GitHub: myokoym

---

<div class="post-metadata">

**Author:** ![raubarede](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/d07c76/32.png) [@raubarede](https://www.ruby-forum.com/u/raubarede)\
**Post date:** [September 20, 2013, 6:21pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/7 "2013-09-20T18:21:55Z")

</div>

Hi,

Regis d’Aubarede wrote in post #1121938:

> Found that on wikipedia:  
> "  
> Clutter is an open source graphics library for creating  
> hardware-accelerated user interfaces. It relies upon OpenGL (1.4+) or  
> OpenGL ES (1.1 or 2.0) for rendering, can be compiled on different  
> platforms (X11, Wayland, Darwin and Win32) and has multiple bindings to  
> other languages (including Mono, Perl, Python, Ruby and Vala). It also  
> supports media playback using GStreamer and 2D graphics rendering using  
> Cairo.[4]  
> "
> 
> If Clutter is done for performence, its usage via Ruby is it relevant ?

Umm, I don’t know much about it…

> I use Gosu for graphics (smooth) animations (sprites,vectors for  
> games…),  
> Is Clutter better for that ?

Oh, Gosu is looking good. But I think that uses are different.  
Gosu is for game application, and Clutter is for general desktop  
application.

Clutter is able to make game application, but it will be some hard work.  
If not making game application, I think that Clutter may be better than  
Gosu.

–  
Masafumi Y.  
GitHub: myokoym

---

<div class="post-metadata">

**Author:** ![raubarede](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/d07c76/32.png) [@raubarede](https://www.ruby-forum.com/u/raubarede)\
**Post date:** [September 19, 2013, 10:24pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/8 "2013-09-19T22:24:19Z")

</div>

> [http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-clutter](http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-clutter)
> 
> Tell me if it is difficult to understand.

Nice start !

Found that on wikipedia:  
"  
Clutter is an open source graphics library for creating  
hardware-accelerated user interfaces. It relies upon OpenGL (1.4+) or  
OpenGL ES (1.1 or 2.0) for rendering, can be compiled on different  
platforms (X11, Wayland, Darwin and Win32) and has multiple bindings to  
other languages (including Mono, Perl, Python, Ruby and Vala). It also  
supports media playback using GStreamer and 2D graphics rendering using  
Cairo.[4]  
"

If Clutter is done for performence, its usage via Ruby is it relevant ?  
I use Gosu for graphics (smooth) animations (sprites,vectors for  
games…),  
Is Clutter better for that ?

---

<div class="post-metadata">

**Author:** ![raubarede](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/d07c76/32.png) [@raubarede](https://www.ruby-forum.com/u/raubarede)\
**Post date:** [September 23, 2013, 10:13pm UTC](https://www.ruby-forum.com/t/gstreamer-how-to-put-video-in-a-gtk-widget-on-windows/246111/9 "2013-09-23T22:13:16Z")

</div>

Video in Ruiby dsl done!

require “gtk3”  
require ‘Ruiby’  
require “gst”  
require “clutter-gtk” # gem install clutter-gtk  
require “clutter-gst” # gem install clutter-gstreamer

module Ruiby\_dsl

def video(url=nil,w=300,h=200)  
clutter = ClutterGtk::Embed.new  
video=ClutterGst::VideoTexture.new  
clutter.stage.add\_child(video)  
video.width=w  
video.height=h  
video.uri = url if url  
video.playing = false  
isNotify=false  
clutter.define\_singleton\_method(:url=) { |u| video.url = url }  
clutter.define\_singleton\_method(:play) { video.playing = true }  
clutter.define\_singleton\_method(:stop) { video.playing = false }  
clutter.define\_singleton\_method(:progress=) { |pp|  
video.progress=(pp) unless isNotify  
}  
if block\_given?  
video.signal\_connect(“notify”) { |o,v,param|  
isNotify=true ;  
yield(video.progress()) rescue p $! ;  
isNotify=false  
}  
end  
attribs(clutter,{})  
end  
end

Ruiby.app width: 600,height: 400 do  
video\_file= ARGV[0] || “d:/usr/XT.avi”  
unless File.exists?(video\_file)  
error(“File video does not exists : ‘#{video\_file}’”)  
exit!(0)  
end  
video\_url=“file:///#{video\_file}”  
stack do  
@video=video(video\_url,600,400-40) {|progress|  
@prog && @prog.progress=progress\*100  
}  
flowi do  
buttoni(" Start “) { @video.play }  
buttoni(” Stop “) { @video.stop }  
@prog=slider(0,0,100.0) { |pos| @video.progress= pos/100.0}  
buttoni(” Exit ") { exit!(0) }  
end  
end  
end

Screen copy at :  
[http://raubarede.tumblr.com/post/62084710192/new-video-tag-for-ruiby-works-on-windows](http://raubarede.tumblr.com/post/62084710192/new-video-tag-for-ruiby-works-on-windows)
