如何通过输出到多个屏幕来编写视频播放脚本?

时间:2014-02-13 00:41:15

标签: python video fullscreen libvlc multiple-monitors

背景

我正在尝试为小型影院制作简单的视频播放脚本,以自动播放视频并控制投影仪,声音和照明系统。我有两个视频输出,一个到投影室的监视器,另一个直接到投影仪。我希望在监视器上放置控件和小(~1 / 4屏幕)预览时,将全屏视频(并且仅视频)播放到投影仪。这将允许放映员观看正在输出的视频,并从展位中的监视器控制播放,而所有观众都看到的是视频输出。

问题

我目前正在使用Python来控制VLC播放器(使用libvlc Python绑定)来播放视频。我的一切工作正常,除了我无法弄清楚如何在投影机输出上全屏播放的视频预览(直接复制)到我的GUI中。

我尝试过使用克隆过滤器,但我无法让克隆窗口自动显示全屏,也不能在我的GUI中显示。克隆过滤器似乎是合乎逻辑的选择,但在指定目标屏幕,全屏等时似乎非常不灵活。我必须能够在投影仪显示器上全屏打开视频窗口。职业化是关键,如果放映员不得不拖动一个窗口并在电影开始时双击它,那将会很糟糕。

目前正在使用:

  • Debian Linux
  • Python 2.7
  • 的wxPython
  • libvlc

我想继续使用Python,因为我已经拥有控制投影仪,声音处理器,照明和窗帘编写和测试的代码。我之所以选择VLC是因为它在视频播放方面确实看起来很防弹,但我还没有继续使用它。由于过去的经验,我还为我的GUI选择了wxWidgets,但我也没有坚持。

1 个答案:

答案 0 :(得分:3)

这描述了直接的解决方案,并不专注于应用程序的任何替代方案或整体设计。

由于您的应用程序和VLC媒体播放器是独立的进程,因此您将无法直接获得所需的内容,因为这两个应用程序之间没有“共享内存”。从VLC“复制”解码帧的最佳镜头将是例如。发送RAW Video .mts流(ts通常用于这种用例)并发送例如到udp:// localhost:1234。

在您的应用程序中,您将需要能够接收ts流,对其进行“解码”并显示在感兴趣的地方。

首先,如果您能够使用您手动控制的2个vlc播放器来执行此操作,我会尝试。当您确定第一个VLC同时流向udp并在主显示器上输出时,另一个VLC播放器接收并播放udp流时,您可以继续:

找到一个可以直接在wxpython应用程序中使用的播放器库,并检查它是否也可以接收udp流。

https://wxpython.org/Phoenix/docs/html/wx.media.MediaCtrl.html

例如,此播放器库需要gstreamer作为基础。

因此,主显示屏和应用程序中的图片可能会有几秒钟的延迟。为了解决这种延迟,我目前所知道的最好方法是使用WebRTC,但这比上面的设置要复杂得多。

https://www.sipwise.org/news/technical/tv-over-webrt/

如果要对WebRTC甚至对UDP做一些“编码”,则肯定需要使用一些硬件编码器,例如Nvidia NVENC为了能够保证所需的资源始终存在。