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

2024-06-06 10:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python的扭曲的.web对ffmpeg的回调。在

我想知道,因为我用'return'发送文件文件.read()'发送转码输出时会出现问题,因为无法完整读取? 我是不是想得太多了,一切都由扭曲的.web的低级管理代码还是我必须重新考虑我的方法?在

另外,我如何支持人们跳过视频中没有为他们缓冲的部分?我想这会很复杂,但万一不是

谢谢


Tags: 文件方法代码webread视频return转码
1条回答
网友
1楼 · 发布于 2024-06-06 10:33:50

1)我能用吗文件.read()在扭曲?在

简短的回答是“不”。在

除非您已经完成了一系列其他相对复杂的事情,例如fd上的seto\unblock,或者显式地将此请求委托给单独的线程,file.read()是一个阻塞调用,它将在文件返回之前将整个文件读入内存。在

当这些数据从磁盘同步读取时,Twisted的reactor将无法调用任何回调或读写任何FD上的任何可用数据,导致任何其他挂起的请求或流传输在您的文件被读入内存时完全停止。在

此外,如果文件的源卷负载过重和/或有很多文件,甚至用于获取文件对象的open()调用也可能会阻塞相当长的时间。没有非阻塞打开,所以如果您需要一个file对象,如果您需要一个普通的文件对象,那么应该使用reactor.deferToThread()。在

所以你应该这样做:

对于使用twisted直接从文件系统读取文件,您应该查看twisted.web.server.现场和twisted.web.static.File文件。有一个关于它们的有趣教程here。这些调用不仅将从磁盘流式传输文件内容,而且还将支持静态文件的附加HTTP特性,例如HTTP范围请求。在

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

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

前者(html5scrubling)只是表示“HTTP范围请求”的一种花哨的方式,并且受到本地浏览器和插件的支持,比如safarimobile、Quicktime、mplayer和所有实现HTML5标记的浏览器。这得到了我在回答第一个问题时提到的twisted.web.static.File的支持。在

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

这可以通过在一个子进程中使用从所需查询参数中提取的-itsoffset参数启动ffmpeg,使用来自磁盘的一些输入文件,或使用a module in your favorite webserver。无论哪种方式都需要一个知道要发送什么查询参数的播放器。在

相关问题 更多 >