【问题标题】:How to serve Video response without downloading the whole video on browser如何在不在浏览器上下载整个视频的情况下提供视频响应
【发布时间】: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 的建议,我已经尝试过了,但没有成功。

标签: python pyramid zodb


【解决方案1】:

您正在询问如何获得分块/流式响应,其详细信息完全取决于您的 wsgi 服务器以及 wsgi 服务器和客户端浏览器之间的任何其他服务器/代理。例如,默认情况下,nginx 会在将响应发送到客户端之前缓冲来自上游的整个响应。许多 WSGI 服务器在一定程度上也会这样做,您需要查看它们的设置以了解如何调整缓冲。

【讨论】:

  • 你有什么可以参考的链接吗?
猜你喜欢
  • 2021-05-22
  • 2015-01-14
  • 2018-03-05
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多