0

我已经按照此处的说明在 gstreamer 中编写了一个视频播放器: https ://github.com/dschreij/media_player_gst/blob/master/media_player_gst.py

在 Windows 中,它在“正常”和多处理模式下工作正常(即所有 Gstreamer 部件和播放器对象都是在单独的进程中创建的)。然而,在 Ubuntu 13.10 中,当播放器在自己的进程中运行时,调用

self.bus.peek()  # Reference to the playbin2 player's bus

导致以下错误并使整个程序(也是父进程)崩溃:

python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.
python: Fatal IO error 4 (Interrupted system call) on X server :0.

否则,播放器在新进程中运行良好。只有调用 self.bus.peek() 才会让它崩溃。我需要检查总线队列本身的事件,因为将总线连接到处理其消息的函数似乎也不起作用(再次仅在 Ubuntu 中!)

基本上我只使用总线来查看是否已经到达流的结尾(gst.MESSAGE_EOS),所以如果可以在不使用 playbin2 总线的情况下确定这一点,我也可以使用这样的解决方案。有没有人可以帮助我解决这个问题?

4

1 回答 1

0

同时我主要在这个线程中找到了答案:

http://gstreamer-devel.966125.n4.nabble.com/fork-and-then-use-gstreamer-functions-td972935.html

在分叉的进程中使用 gstreamer 是一件麻烦事,因为在 gst 主循环和所涉及的资源方面可能存在访问冲突。但是,gst.Bus.pop() 不与内部 gst 循环结构交互(peek() 和 poll() 显然都这样做)并且通过使用 gst.Bus.pop() 我能够从总线检索消息没有什么问题!

于 2013-12-16T14:01:55.443 回答