【发布时间】:2017-08-22 09:22:47
【问题描述】:
我正在使用带有 ZODB 的 Pyramid 作为数据库存储。我想返回视频响应,我可以,但唯一的问题是浏览器下载整个视频然后播放它,我不希望这种情况发生。我想流式传输视频,但找不到任何合适的解决方案。 这是我的代码
返回视频响应的函数是:
@view_config(context=Content, name='getcontentplay')
def getContentImage(context,request):
blob = context.blobdata
resp = Response(content_disposition="inline; filename=\""+blob.filename.encode('utf-8')+"\"",content_type=blob.contentType,)
resp.app_iter = blob.data
resp.content_length = blob.size
return resp
而 Blob 存储类是:
from ZODB.blob import Blob
from persistent import Persistent
class BlobWrapper(Persistent):
def __init__(self, filedata,contentType,filename):
self.contentType = contentType
self._blob = Blob(filedata)
self.filename = filename
def _getData(self):
fp = self._blob.open('r')
data = fp.read()
fp.close()
return data
def retFile(self):
return self._blob.open('r')
data = property(_getData)
@property
def size(self):
if 'size' in self.__dict__:
return self.__dict__['size']
reader = self._blob.open()
reader.seek(0,2)
size = int(reader.tell())
reader.seek(0)
reader.close()
self.__dict__['size'] = size
return size
def getSize(self):
return self.size
而我的 HTML 模板代码是
<video poster="/static/images/kid.png" controls controlsList="nodownload" preload="none">
<source src="${urltovideo}" />
</video>
【问题讨论】:
-
我遇到了在文件末尾而不是开头记录“这是如何加载此视频”信息的编码问题。这些都是单一格式的自定义视频吗?如果可能是这种情况,请尝试从另一个站点下载通用工作视频并尝试它。我只发表评论,因为我对细节模糊不清,我认为需要更多信息。 blob 的事情可能是一个问题,但它也可能与实际问题无关,希望这是有道理的。那么......视频是如何编码的?您是否尝试过其他来源的视频?
-
另外,为了让你知道,我使用金字塔将电影请求传递给带有“X-Accel-Redirect”标头的 Nginix,主要是 mp4 格式。我嵌入了一个处理视频跨浏览器显示的 jwplayer(专有但对我有用)。
-
@plantian 我无法理解您的代码工作正常,唯一的问题是浏览器首先加载整个视频然后播放它。假设如果我上传一个 20MB 的视频,我必须等待浏览器加载 20MB 才能看到视频播放。而且我刚刚编辑了这个问题以便更好地理解。谢谢
-
至少,我认为您需要在响应中设置 HTTP Accept-Ranges 标头,例如 resp.accept_ranges = 'bytes'。这可能是必要的,但我不清楚是否足够。
-
感谢@sdupton 的建议,我已经尝试过了,但没有成功。