使用Python管理多平台视频流的最佳方法是什么?
我心里这个问题已经想了一年多了。我想你们可能有答案。
在某个Python图形界面应用中,我需要显示一个视频流。并且我需要录制这个视频流的一部分,以便以后再观看。
此外,我还想让这个Python应用可以在多个平台上运行(比如OSX、GNU和Windows)。
我对很多解决方案都持开放态度:
- 把摄像头连接到一个流上,然后用Python应用读取这个流。(RTP加上VLC可能可以实现)
- 使用Phonon来读取摄像头。
- 创建一个抽象类来定义不同的读取方式,根据操作系统使用Quicktime、Win32或GStreamer。
你们有什么经验?你们会用什么方法来实现这个呢?
2 个回答
很遗憾,这个事情并不简单。我写了一个大部分完成的程序,可以在三大桌面操作系统上进行视频录制和播放。不过,视频播放和录制在跨平台上还是有很多问题,除了用HTML嵌入的方式。这主要是因为以下几点:
- 视频编码格式是专有的
- 操作系统不支持常见的编码格式
- 像ffmpeg这样的项目有一些许可证要求,如果你以某种方式使用它们,就必须公开你的源代码
- 现有的视频播放软件大多是手动重写的,每个软件都要处理每一帧、缓冲、流媒体、音频同步等问题。
所以你可以选择使用HTML,或者忍受以下编程库带来的跨平台问题:
- Python mplayer
- Python vlc
- Python opencv
- Python pyaudio
- Python pyside/pyqt phonon 或 qtmultimedia
一旦你在一个开发机器上搞定了,准备好在用户的机器上安装时可能会出问题(可以通过:pyinstaller / appdmg / apt / chocolatey / Inno Setup 来分发)
在OSX上,brew还是有很多问题,但macports表现得更好(我还是做了很多补丁)
Linux是最简单的。
Windows的难度在两者之间。
我很想知道iOS / Android / Windows RT / Kindle的情况如何。
这个问题并不是独特的,甚至Netflix也还没有一个跨平台的视频应用:https://www.quora.com/Is-Netflix-building-an-app-for-the-Mac-App-Store?share=1
我也时不时关注这个问题,发现这个任务本身的复杂性太高了,没法用简单的库来解决你提到的问题。不过,我建议你可以试试pyopencv,这个库专门处理你说的任务。它有一个可以处理网络摄像头输入的类,适用于各种平台,而且在Python社区里有不少用户分享了例子。最新版本是2.3.1,更新得还挺及时的。你可以在一个非常有用的网站上找到Windows版本(这不是我自己的网站,只是推荐一下):
http://www.lfd.uci.edu/~gohlke/pythonlibs/
你提到想了解一些库的使用经验,我可以告诉你:gstreamer在Linux上对我来说很好用,但在Windows上设置起来非常麻烦,最后也没能成功。这是很久之前的事了,也许现在情况有所改善。vlc.py是一个简单的库,可以用来测试一下vlc是否适合你。不过,目前它在64位Windows平台上不太好用,原因不太清楚,但似乎很多人都遇到过类似的问题,所以这就要看你需要多少跨平台的支持了。