2011-02-08 6 views
3

誰かが私がpython内からvideosink/pipelineの出力としてtkinterウィンドウを使う方法を知っていますか?これは、Windows 32ビット上で私の作品のxTkinterのビデオ出力GStreamerから?

+0

関連:[?Tkinterではビデオファイルを再生するための方法](http://stackoverflow.com/q/7227162/4279) – jfs

答えて

2

XXX一緒に事前のおかげで、私は他のGUIシステムの多くのための方法を発見した、しかし、私はTkinterのと何か他のものを使用する必要がありますする必要はいけません。 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

関連する問題