【问题标题】:How do I send video files that are being transcoded live with Python's Twisted.web?如何发送使用 Python 的 Twisted.web 实时转码的视频文件?
【发布时间】:2012-11-30 15:30:33
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 当您说return file.read() 时,file 是文件对象还是 Popen 对象或其他什么?如果它是一个Popen 对象,你应该考虑使用twisted 的reactor.spawnProcess() 来获得一个协议,你可以连接到http 处理程序来进行流式读取。
  • File 是一个文件对象,不过我会研究 Popen 和 spawnProcess。谢谢

标签: python video-streaming twisted twisted.web


【解决方案1】:

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

简短的回答是“不”。

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

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

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

你应该这样做:

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

2) 我如何支持人们跳到没有为他们缓冲的视频部分?

这就是通常所说的擦洗,基本上有两种擦洗:HTML5擦洗和基于时间的擦洗。

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

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

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

【讨论】:

  • 太棒了,谢谢。我不会遇到任何阻塞,因为它是 1 个服务器对 1 个客户端的事情,但我很确定这无论如何都是一种可怕的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多