视频奇怪的间歇性错误(GStreamer)

时间:2011-09-10 04:54:58

标签: python gstreamer

我有一个运行Python 2.7,PyGTK 2.24以及最新版PyGST的项目。

我在以下代码中遇到了一个奇怪的间歇性错误。使用第一个较长的错误,视频将播放得很好,只有在我关闭视频窗口后才会出现错误。第二个阻止窗口打开。

import pygtk
pygtk.require('2.0')
import gtk, pango
import pygst
pygst.require('0.10')
import gst
import Trailcrest
import os, sys

class Video:

    def __init__(self):

        def on_message(bus, message): 
            if message.type == gst.MESSAGE_EOS: 
                # End of Stream 
                player.set_state(gst.STATE_NULL) 
            elif message.type == gst.MESSAGE_ERROR: 
                player.set_state(gst.STATE_NULL) 
                (err, debug) = message.parse_error() 
                print "Error: %s" % err, debug

        def on_sync_message(bus, message):
            if message.structure is None: 
                return False 
            if message.structure.get_name() == "prepare-xwindow-id":
                if sys.platform == "win32":
                    win_id = videowidget.window.handle
                else:
                    win_id = videowidget.window.xid
                assert win_id
                imagesink = message.src 
                imagesink.set_property("force-aspect-ratio", True)
                imagesink.set_xwindow_id(win_id) 

        win = gtk.Window()
        win.set_resizable(False)
        win.set_has_frame(False)
        win.set_position(gtk.WIN_POS_CENTER)

        fixed = gtk.Fixed()
        win.add(fixed)
        fixed.show()

        videowidget = gtk.DrawingArea()
        fixed.put(videowidget, 0, 0)
        videowidget.set_size_request(640, 480)
        videowidget.show()

        # Setup GStreamer 
        player = gst.element_factory_make("playbin", "MultimediaPlayer")
        bus = player.get_bus() 
        bus.add_signal_watch() 
        bus.enable_sync_message_emission() 
        #used to get messages that GStreamer emits 
        bus.connect("message", on_message) 
        #used for connecting video to your application 
        bus.connect("sync-message::element", on_sync_message)
        player.set_property("uri", "file://" + os.getcwd() + "/VID/SEQ-GAME-OPEN.ogv") 
        player.set_state(gst.STATE_PLAYING)

        win.show()

def main():
    gtk.gdk.threads_init()
    gtk.main()
    return 0

if __name__ == "__main__":
    Video()
    main()
  

程序'Video.py'收到X Window System错误。这个   可能反映了程序中的一个错误。错误是'BadIDChoice   (为此连接选择的资源ID无效)'。 (详情:连载   373 er​​ror_code 14 request_code 1 minor_code 0)(注意程序员:   通常,X错误是异步报告的;也就是说,你会的   在引发错误一段时间后收到错误。要调试你的程序,   使用--sync命令行选项运行它以更改此行为。   如果您可以从调试器中获得有意义的回溯   打破gdk_x_error()函数。)

关于这一点的快速说明......我按照说明在命令行中运行“python Video.py --sync”(我在Kubuntu上),然后我收到了该消息。

这是另一个错误 - 完全阻止播放的错误。

  

python:../../ src / xcb_io.c:221:poll_for_event:断言`(((长)   (event_sequence) - (long)(dpy-> request))< = 0)'失败。中止

这些将完全交替,但不完美。我可以得到第一个中的三个,第二个中的两个,第一个,第二个,第一个,等等。它总是不同的。

魔鬼在这里发生了什么?

1 个答案:

答案 0 :(得分:3)

您需要与X服务器同步以获取窗口xid。

以下是:

    def on_sync_message(bus, message):
        if message.structure is None:
            return False
        if message.structure.get_name() == "prepare-xwindow-id":
            gtk.gdk.threads_enter()
            gtk.gdk.display_get_default().sync()
            win_id = videowidget.window.xid
            imagesink = message.src
            imagesink.set_property("force-aspect-ratio", True)
            imagesink.set_xwindow_id(win_id)
            gtk.gdk.threads_leave()