python - 使用 cherrypy 流式传输文件

标签 python video stream cherrypy

我正在尝试使用 cherrypy 流式传输视频文件。当我转到 localhost:8080/stream?video=video.avi 时,它开始下载,但几秒钟后,无论文件有多大,它都会“完成”下载。我对此很陌生,无法找出为什么要这样做。另外,如果文件是 Matroska (.mkv),为什么它甚至不能识别文件?

这是我的 Stream 类:

class Stream(object):

    @cherrypy.expose
    def default(self, video=None):
        BASE_PATH = ".."
        video = os.path.join(BASE_PATH, video)
        if video == None:
            return "no file specified!"
        if not os.path.exists(video):
            return "file not found!"
        f = open(video)
        size = os.path.getsize(video)
        mime = mimetypes.guess_type(video)[0]
        print(mime)
        cherrypy.response.headers["Content-Type"] = mime
        cherrypy.response.headers["Content-Disposition"] = 'attachment; filename="%s"' % os.path.basename(video)
        cherrypy.response.headers["Content-Length"] = size

        BUF_SIZE = 1024 * 5

        def stream():
            data = f.read(BUF_SIZE)
            while len(data) > 0:
                yield data
                data = f.read(BUF_SIZE)

        return stream()
    default._cp_config = {'response.stream': True}

最佳答案

我意识到我需要做的就是将 open(video) 更改为 open(video, 'rb') 以便它以二进制模式读取文件。之后文件完全下载并运行。

关于python - 使用 cherrypy 流式传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470931/

相关文章:

python - 删除 Pandas Dataframe 列范围内每列总和小于 10 的列

swift - 如何从 Swift 中的本地视频文件中获取帧?

python - 使用带有 sys.stdout 的 Python 'with' 语句

C++ 重载 ostream 和 istream 运算符

python - 如何在 Python 中打印日期滚动条

Python 字典 - 读取键时出错

python - GitPython - 获取未跟踪的文件

javascript - youtube 如何在 Safari 上自动播放带音频的视频?

api - YouTube Autosuggest API - 在哪里可以找到示例或文档?

dictionary - 在流中使用 map 时出现Dart问题