python - 如何发送正在使用 Python 的 Twisted.web 实时转码的视频文件?

标签 python video-streaming twisted twisted.web

我正在使用 Python 的 Twisted.web 构建一个视频流媒体,并回调 ffmpeg。

我想知道,由于我通过使用“return file.read()”发送文件,因此发送转码输出会出现问题,因为它无法完整读取? 我是否想得太多了,这一切都是由 Twisted.web 的低级管理代码管理的,还是我必须重新考虑我的方法?

此外,我如何支持人们跳到视频中尚未缓冲的部分?我预计它会非常复杂,但以防万一。

谢谢

最佳答案

1) 我可以在twisted中使用file.read()吗?

简短的回答是“不”。

除非你做了一堆其他相对复杂的事情,例如在 fd 上设置 O_NONBLOCK,或者显式将此请求委托(delegate)给单独的线程,否则 file.read() 是一个阻塞调用,它会在返回之前将整个文件读入内存。

当从磁盘同步读取此数据时,Twisted 的 react 器将无法调用任何回调或读取或写入任何 fd 上的任何可用数据,从而导致任何其他挂起的请求或流式传输在您的文件处理时完全停止正在被读入内存。

此外,如果文件的源卷负载很重和/或有很多文件,即使是获取文件对象的 open() 调用也可能会阻塞很长一段时间。没有非阻塞打开,所以如果你需要一个文件对象,如果你需要在twisted中获取一个常规文件对象,你应该使用reactor.deferToThread()

所以你应该这样做:

要使用twisted直接从文件系统读取文件,您应该查看twisted.web.server.Site和twisted.web.static.File。有一个关于它们的有趣教程 here 。这些调用不仅会从磁盘传输文件内容,而且还将支持静态文件的其他 HTTP 功能,例如 HTTP Range 请求。

2) 我如何支持人们跳到视频中尚未缓冲的部分?

这通常称为清理,基本上有两种清理:HTML5 清理和基于时间的清理。

前者(HTML5 清理)只是“HTTP 范围请求”的一种奇特方式,并且受 native 浏览器和插件支持,例如 Safari Mobile、Quicktime、mplayer 以及所有实现 html5 标记的浏览器。我在回答第一个问题时提到的 twisted.web.static.File 支持这一点。

后者(基于时间的清理)是支持清理的传统方式。它基本上是自定义播放器(例如 jwplayer 或 OSMF)与服务器之间的协议(protocol),允许播放器请求从某个查询参数指定的时间偏移开始的视频。

这可以通过在子进程中启动 ffmpeg 并使用从所需查询参数中提取的 -itsoffset 参数、使用磁盘中的某些输入文件或使用 a module in your favorite webserver 来轻松完成。 。无论哪种方式都需要玩家了解要发送的查询参数。

关于python - 如何发送正在使用 Python 的 Twisted.web 实时转码的视频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13648192/

相关文章:

python - Dask 延迟性能问题

video - 如何生成具有高性能(最少 I/O)的 "moov before mdat"MP4 视频文件?

ios - 来自 Web 服务器的音频和视频流

android - 无法在 WebView 上从 vimeo 流式传输视频

python - 扭曲的检修孔 : how to access servers in application?

python - reactor.connectTCP 可以在 twisted python 中的 reactor.run 之后发生吗?

python - 如何使用美丽汤选择一类单词

python - Pandas ,按计数过滤

python - jinja2 模板的多个渲染?

python - 在 Twistd 中无阻塞地压缩文件。