修改Twisted的FileSender()以支持字节范围头
我在做一个视频流应用,使用了twisted这个库。HTML5的视频流很依赖于字节范围(byte-range)来实现快进快退的功能,但FileSender似乎不支持字节范围,这就导致了一些问题。
之前我只是把所有请求都交给Static.File.render_GET处理,这个方法应该是支持字节范围的,但由于最近的一些变化,这种做法现在已经不行了。
request.setHeader('Content-Type','video/octet-stream')
print request.getAllHeaders()
self.isLeaf = False
#return static.File.render_GET(self,request)
f = open('.path/to/file.mp4','rb')
def cbFinished(ignored):
f.close()
request.finish()
d = FileSender().beginFileTransfer(f,request)
d.addErrback(err).addCallback(cbFinished)
return NOT_DONE_YET
这段代码是用来处理请求的,当请求的文件类型是'mp4'时,我遇到了一些错误,比如:
<GET /file.mp4 HTTP/1.1>
{'range': 'bytes=66673263716-', 'host': '192.168.1.64:8000', 'accept': '*/*', 'user-agent': 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/2.1.0.8.23 NintendoBrowser/1.1.0.7579.EU'}
Unhandled Error
Traceback (most recent call last):
Failure: exceptions.Exception: Consumer asked us to stop producing
Unhandled Error
Traceback (most recent call last):
Failure: exceptions.RuntimeError: Producer was not unregistered for file.mp4
<GET /file.mp4 HTTP/1.1>
{'range': 'bytes=69839914264-', 'host': '192.168.1.64:8000', 'accept': '*/*', 'user-agent': 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/2.1.0.8.23 NintendoBrowser/1.1.0.7579.EU'}
这些错误显示WiiU在请求不同的字节范围,这让我觉得这可能就是问题所在。希望能得到一些帮助,谢谢。
1 个回答
2
没关系,结果发现 static.File
正是我需要的东西。
我之前一直认为它只能在设置为目录时才有效,但其实作为单个文件也能正常工作。
现在的代码是:
rangedFile = static.File('/path/to/file.mp4',
defaultType='video/octet-stream')
return rangedFile.render_GET(request)