我正在使用Python的Twisted.web通过回调ffmpeg来构建一个视频流。
我想知道,既然我使用'return file.read()‘发送文件,那么发送转码后的输出会不会有问题,因为它不能被完整地读取?我是不是想多了,这一切都是由Twisted.web的低级管理代码管理的,还是我必须重新考虑我的方法?
此外,我如何支持人们跳转到视频中没有为他们缓冲的部分?我希望它会非常复杂,但以防万一它不是。
谢谢
发布于 2012-12-02 11:21:08
1)我可以在twisted中使用file.read()吗?
简短的回答是“不”。
除非您已经完成了一系列其他相对复杂的操作,例如在fd上设置O_NONBLOCK,或者显式地将此请求委托给单独的线程,否则file.read()是一个阻塞调用,它会在返回之前将整个文件读取到内存中。
当从磁盘同步读取这些数据时,Twisted的reactor将无法调用任何回调,也无法读取或写入任何fds上的任何可用数据,从而导致任何其他挂起的请求或流传输在将文件读取到内存时完全停止。
此外,如果文件的源卷负载过重和/或存在大量文件,则即使是获取文件对象的open()调用也可能阻塞很长一段时间。没有非阻塞的打开,所以如果你需要一个文件对象,如果你需要一个普通的文件对象,你应该使用reactor.deferToThread()。
所以这是你应该做的:
要使用twisted直接从文件系统读取文件,您应该查看twisted.web.server.Site和twisted.web.static.File。在他们的here上有一个有趣的教程。这些调用不仅将从磁盘流式传输文件内容,而且还将支持静态文件的其他HTTP特性,例如HTTP范围请求。
2)我如何支持人们跳转到视频中没有缓冲的部分?
这通常被称为清理,基本上有两种清理: HTML5清理和基于时间的清理。
前者(HTML5清理)只是"HTTP Range request“的一种花哨的说法,并且受到本地浏览器和插件的支持,例如Safari Mobile、Quicktime、mplayer和所有实现html5标记的浏览器。我在回答第一个问题时提到的twisted.web.static.File支持这一点。
后者(基于时间的清理)是支持清理的遗留方式。它本质上是一个自定义播放器(如jwplayer或OSMF)和服务器之间的协议,允许播放器请求从某个查询参数指定的时间偏移开始的视频。
这可以通过在子流程中启动ffmpeg (从所需的查询参数中提取-itsoffset参数)、使用磁盘中的一些输入文件或使用a module in your favorite webserver来轻松完成。无论哪种方式,都需要一个能够理解要发送的查询参数的播放器。
https://stackoverflow.com/questions/13648192
复制相似问题