来自GStreamer的Tkinter视频输出? [英] Video Output In Tkinter From GStreamer?
问题描述
有谁知道我将如何使用tkinter窗口作为python中videoink/pipeline的输出?我已经找到了许多其他GUI系统的方法,但我不想必须同时使用tkinter和其他功能xxx 预先感谢x
does anyone know how i would go about using a tkinter window as an output from a videosink/pipeline from within python? i have found methods for lots of other GUI systems, but i dont want to have to use tkinter and something else together xxx thanks in advance x
推荐答案
这在Windows 32位版本上适用于我.我在Linux或Windows 64位上遇到段错误.抱歉,我不了解Mac.
This works for me on Windows 32-bit. I get a seg fault on Linux or Windows 64-bit. Sorry, I don't know about Mac.
您必须使用 bus.connect("sync-message :: element",on_sync_message)并传递一个Tk小部件ID( winfo_id ),如您所见在以下代码中.容器可以是任何Tk小部件,但黑色的实心框似乎最适合我.
You have to use bus.connect("sync-message::element", on_sync_message) and pass a Tk widget ID (winfo_id), as you can see in the following code. The container can be any Tk widget, but a solid black frame seems to work best for me.
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()
这篇关于来自GStreamer的Tkinter视频输出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!