繁体   English   中英

Tkinter中的Gstreamer网络摄像头视频提要

[英]Gstreamer webcam video feed in tkinter

我正在编写一个程序,以从网络摄像头获取视频供稿,并将其显示在Tkinter窗口中。 我编写了以下在Ubuntu 12.04上运行的代码。

#!/usr/bin/env python

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

# Goto GUI Class
class Prototype(Frame):
    def __init__(self, parent):
        gobject.threads_init()
        Frame.__init__(self, parent)    

        # Parent Object
        self.parent = parent
        self.parent.title("WebCam")
        self.parent.geometry("640x560+0+0")
        self.parent.resizable(width=FALSE, height=FALSE)

        # Video Box
        self.movie_window = Canvas(self, width=640, height=480, bg="black")
        self.movie_window.pack(side=TOP, expand=YES, fill=BOTH)

        # Buttons Box
        self.ButtonBox = Frame(self, relief=RAISED, borderwidth=1)
        self.ButtonBox.pack(side=BOTTOM, expand=YES, fill=BOTH)

        self.closeButton = Button(self.ButtonBox, text="Close", command=self.quit)
        self.closeButton.pack(side=RIGHT, padx=5, pady=5)

        gotoButton = Button(self.ButtonBox, text="Start", command=self.start_stop)
        gotoButton.pack(side=RIGHT, padx=5, pady=5)

        # Set up the gstreamer pipeline
        self.player = gst.parse_launch ("v4l2src ! video/x-raw-yuv,width=640,height=480 ! ffmpegcolorspace ! xvimagesink")

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

    def start_stop(self):
        if self.gotoButton["text"] == "Start":
            self.gotoButton["text"] = "Stop"
            self.player.set_state(gst.STATE_PLAYING)
        else:
            self.player.set_state(gst.STATE_NULL)
            self.gotoButton["text"] = "Start"

    def on_message(self, bus, message):
        t = message.type
        if t == gst.MESSAGE_EOS:
            self.player.set_state(gst.STATE_NULL)
            self.button.set_label("Start")
        elif t == gst.MESSAGE_ERROR:
            err, debug = message.parse_error()
            print "Error: %s" % err, debug
            self.player.set_state(gst.STATE_NULL)
            self.button.set_label("Start")

    def on_sync_message(self, bus, message):
        if message.structure is None:
            return
        message_name = message.structure.get_name()
        if message_name == "prepare-xwindow-id":
            # Assign the viewport
            imagesink = message.src
            imagesink.set_property("force-aspect-ratio", True)
            imagesink.set_xwindow_id(self.movie_window.window.xid)

def main():
    root = Tk()
    app = Prototype(root)
    app.pack(expand=YES, fill=BOTH)
    root.mainloop()  


if __name__ == '__main__':
     main()

我的问题是,程序运行时,ButtonBox和VideoBox都不会显示在输出窗口中。 我怎样才能解决这个问题? 我确实在其他站点上找到了可能的解决方案(例如http://pygstdocs.berlios.de/#projects在Tkinter中播放视频文件的方式? ),但是它们关于其代码含义的信息非常有限。

进行建议的更改和其他一些操作以使按钮起作用之后,我意识到运行程序时显示窗口与主窗口不同。 使用tkinter时,是否有办法使视频显示在主窗口中?

看起来您的Prototype类是Tkinter框架,但您似乎没有将其包装/放置在任何地方。

...
app = Prototype(root)
app.pack(expand=YES, fill=BOTH)
root.mainloop()

我终于想出了解决这个问题的方法。 我意识到错误出在imagesink.set_xwindow_id(self.movi​​e_window.window.xid)行中

我将其更改为imagesink.set_xwindow_id(self.movi​​e_window.winfo_id())

错误是我使用过window.xid,它是gtk小部件的属性。 在tkinter中,winfo_id()返回tkinter小部件的窗口标识符。 有关更多信息,请访问http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.winfo_id-method

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM