为什么我的 pyqt pygst (python gstreamer) 代码呈现不可靠?
Why does my pyqt pygst (python gstreamer) code render unreliably?
TLDR:我正在使用 PyQt 并将 pygst 渲染嵌入 window。当我将所有系统移动到 Ubuntu 16.04(我认为是从 14 开始?)时,Qt 应用程序中的 pygst 渲染不再可靠地工作。根据系统的不同,我得到一个空白 window 或看起来像未初始化的内存缓冲区渲染。
例如,代码在我的 carbon X1(使用 nvidia 驱动程序)上更经常地工作以呈现测试源,但如果我使用 nouveau 视频驱动程序,则只能在我的 T61P 上工作,而且不是很可靠。 T61P 不支持 nvidia 驱动。
我的 original test code is for pygst 0.1. I tried porting to pygst 1.0 but it doesn't seem to make a difference. This thread 建议添加队列。我尝试添加一些,但没有发现任何明显的差异。但是帖子也没有给出非常具体(或自信)的建议,所以我不会打折我不知道在哪里添加它们。
如链接示例中所述,一个有趣的实验是延迟 player.set_state(PLAYING) 或交换 QMainWindow.show() 与 player.set_state(PLAYING) 效果的顺序可靠性。
编辑:我想我已经解决了!或者至少一切都像以前一样运作良好。观察:在我的一个系统上,在 ssh -X'ing 到我的 beagle bone black (BBB) 和 运行 LinuxCNC GUI(使用 OpenGL 通过 ssh 呈现)之后,问题变得更加严重。回想起来,记得我测试的 T61 BBB 有 libgl1-mesa-swx11(软件 OpenGL 渲染)来尝试解决 Ubuntu 16.04 nvidia 驱动程序的渲染问题。但是,似乎 BBB 软件 OpenGL 以某种方式弄乱了 T61 上的 gstreamer,直到 T61 重新启动。在这一点上,我没有一个明确的解决方案,但我确实对导致回归的原因有深刻的理解。 T61 现在似乎可以在 Ubuntu 16.04 和 Ubuntu 12.04 上使用。我将尝试接受以下答案,因为虽然它没有解决问题,但它确实提供了一些有用的信息。谢谢!
我认为 'unreliable' 完全不正确 - 将叠加视频绘制到隐藏的 window 最好的情况下是行不通的,最坏的情况下可能会导致接收器中的错误停止管道。如果它确实起作用,那是因为竞争条件对您有利。
您根本不需要同步消息处理程序;只需显示()您的 window 并在启动管道之前在接收器上设置 window 句柄。
至于在一个平台上的故障,请尝试使用 0 作为 window 句柄(以便接收器创建自己的句柄)来平分问题。如果它不起作用,那么叠加视频可能根本无法与该驱动程序一起使用。试试 qwidgetvideosink。
TLDR:我正在使用 PyQt 并将 pygst 渲染嵌入 window。当我将所有系统移动到 Ubuntu 16.04(我认为是从 14 开始?)时,Qt 应用程序中的 pygst 渲染不再可靠地工作。根据系统的不同,我得到一个空白 window 或看起来像未初始化的内存缓冲区渲染。
例如,代码在我的 carbon X1(使用 nvidia 驱动程序)上更经常地工作以呈现测试源,但如果我使用 nouveau 视频驱动程序,则只能在我的 T61P 上工作,而且不是很可靠。 T61P 不支持 nvidia 驱动。
我的 original test code is for pygst 0.1. I tried porting to pygst 1.0 but it doesn't seem to make a difference. This thread 建议添加队列。我尝试添加一些,但没有发现任何明显的差异。但是帖子也没有给出非常具体(或自信)的建议,所以我不会打折我不知道在哪里添加它们。
如链接示例中所述,一个有趣的实验是延迟 player.set_state(PLAYING) 或交换 QMainWindow.show() 与 player.set_state(PLAYING) 效果的顺序可靠性。
编辑:我想我已经解决了!或者至少一切都像以前一样运作良好。观察:在我的一个系统上,在 ssh -X'ing 到我的 beagle bone black (BBB) 和 运行 LinuxCNC GUI(使用 OpenGL 通过 ssh 呈现)之后,问题变得更加严重。回想起来,记得我测试的 T61 BBB 有 libgl1-mesa-swx11(软件 OpenGL 渲染)来尝试解决 Ubuntu 16.04 nvidia 驱动程序的渲染问题。但是,似乎 BBB 软件 OpenGL 以某种方式弄乱了 T61 上的 gstreamer,直到 T61 重新启动。在这一点上,我没有一个明确的解决方案,但我确实对导致回归的原因有深刻的理解。 T61 现在似乎可以在 Ubuntu 16.04 和 Ubuntu 12.04 上使用。我将尝试接受以下答案,因为虽然它没有解决问题,但它确实提供了一些有用的信息。谢谢!
我认为 'unreliable' 完全不正确 - 将叠加视频绘制到隐藏的 window 最好的情况下是行不通的,最坏的情况下可能会导致接收器中的错误停止管道。如果它确实起作用,那是因为竞争条件对您有利。
您根本不需要同步消息处理程序;只需显示()您的 window 并在启动管道之前在接收器上设置 window 句柄。
至于在一个平台上的故障,请尝试使用 0 作为 window 句柄(以便接收器创建自己的句柄)来平分问题。如果它不起作用,那么叠加视频可能根本无法与该驱动程序一起使用。试试 qwidgetvideosink。