2011-02-08 30 views
3

沒有人知道我會如何使用tkinter窗口作爲python內的videosink/pipeline輸出嗎?我已經找到了很多其他GUI系統的方法,但我不想要使用tkinter和別的東西在一起xxx 在此先感謝x從GStreamer的Tkinter視頻輸出?

+0

相關:[?方式Tkinter的播放視頻文件(http://stackoverflow.com/q/7227162/4279) – jfs 2015-02-21 05:33:14

回答

2

這適用於Windows 32位上的我。我在Linux或Windows 64位上遇到seg錯誤。對不起,我不知道Mac。

你必須使用bus.connect( 「同步消息::元素」,on_sync_message)並傳遞Tk的窗口小部件ID(winfo_id),你可以在下面的代碼中看到。該容器可以是任何Tk小部件,但純黑色的框架似乎對我來說最適合。

import sys, os 
from Tkinter import * 
import pygst 
pygst.require("0.10") 
import gst 


def start(): 
     player.set_property('video-sink', None) 
     player.set_property("uri", "file:///" + sys.argv[1]) 
     player.set_state(gst.STATE_PLAYING) 

def on_sync_message(bus, message): 
     if message.structure is None: 
       return 
     message_name = message.structure.get_name() 
     if message_name == "prepare-xwindow-id": 
       imagesink = message.src 
       imagesink.set_property("force-aspect-ratio", True) 
       imagesink.set_xwindow_id(mwin_id) 

window = Tk() 
window.geometry("500x400") 
movie_window = Frame(window,bg='#000000') 
movie_window.pack(side=BOTTOM,anchor=S,expand=YES,fill=BOTH) 

mwin_id = movie_window.winfo_id() 

player = gst.element_factory_make("playbin2", "player") 
fakesink = gst.element_factory_make('fakesink', 'novideo') 
player.set_property('video-sink', fakesink) 

bus = player.get_bus() 
bus.add_signal_watch() 
bus.enable_sync_message_emission() 
bus.connect("sync-message::element", on_sync_message) 

start() 
window.mainloop() 
+0

我得到在Linux上段錯誤 – erjoalgo 2013-08-25 12:38:20