【问题标题】:Python cant serve mp4 to browserPython 无法将 mp4 保存到浏览器
【发布时间】:2017-11-21 03:02:19
【问题描述】:

我试图从我的家庭 WAMP 服务器(Windows 8)向浏览器提供视频文件,但浏览器不断给出错误 500,并且 apache 日志显示来自脚本 's.py' 的标头格式错误:标头错误: G@

“s.py”是我的python 3.4版脚本

n="\\wamp\\www\\r.mp4"
print ("Last-Modified: Fri, 24 Apr 2015 22:09:52 GMT")
print ("Accept-Ranges: bytes")
print ("Content-Length:", os.path.getsize(n))
print ("Content-type: video/mp4\r\n\r\n")

f=open(n, 'rb')
d=f.read()
sys.stdout.buffer.write(d)
sys.stdout.flush()
f.close()

我可以使用浏览器在服务器上运行其他简单的 python 脚本,所以我知道这是可行的,但由于某种原因,它不会提供这个 mp4 文件。

在浏览器中,我使用 URL“localhost/s.py”调用它,然后它只给出错误 500,并且服务器日志显示格式错误的标头。

我整天都在研究它,任何人都知道如何解决它,

谢谢

【问题讨论】:

  • 你打算做什么?
  • 找到您服务器的根目录并将您的 mp4 粘贴到那里。您可以通过localhost/filename.mp4直接访问它
  • 我可以直接访问它,但是如果我使用 python 脚本,我可以通过使用脚本来控制哪些文件在浏览器中可见,但不知何故脚本不起作用

标签: python apache wamp mp4


【解决方案1】:

我刚刚遇到了完全相同的问题(使用 pdf 而不是 mp4)。您的原始代码很接近。问题是 sys.stdout.flush 需要在 sys.stdout.buffer.write 之前,以确保标题首先出现。编辑后的代码如下,对我有用。

n="\\wamp\\www\\r.mp4"
print ("Last-Modified: Fri, 24 Apr 2015 22:09:52 GMT")
print ("Accept-Ranges: bytes")
print ("Content-Length:", os.path.getsize(n))
print ("Content-type: video/mp4\r\n\r\n")
sys.stdout.flush()

f=open(n, 'rb')
d=f.read()
sys.stdout.buffer.write(d)
f.close()

【讨论】:

    【解决方案2】:

    Python 可用于为您的浏览器提供 MP4。但是你不能把 Python 脚本扔到 WAMP 服务器上,就像它是 PHP 脚本一样。

    如果您打算让 Python Web 应用程序通过 Apache 服务器提供视频,那么您必须构建一个 WSGI 应用程序并查看 mod_wsgi 才能使用 Apache 为 Python 应用程序提供服务。您也可以在没有 Apache 的情况下运行 WSGI 应用程序。

    从目录提供 mp4 视频的过度简化的 WSGI 应用程序可能是:

    import os
    from flask import Flask, send_file, make_response
    
    
    APP = Flask(__name__)
    MEDIA_PATH = '/path/to/your/media/directory'
    
    
    @APP.route('/<vid_name>')
    def serve_video(vid_name):
        vid_path = os.path.join(MEDIA_PATH, vid_name)
        resp = make_response(send_file(vid_path, 'video/mp4'))
        resp.headers['Content-Disposition'] = 'inline'
        return resp
    
    
    if __name__ == '__main__':
        APP.run()
    
    1. 使用包含视频的目录的完整路径编辑 MEDIA_PATH。

    2. 将此脚本另存为 video_server.py(例如)。

    3. 运行此脚本python video_server.py

    4. 通过浏览器访问 localhost:5000/some_video.mp4(其中 some_vdeo.mp4 是现有视频的名称)

    注意:您可以使用关键字参数端口和/或主机编辑APP.run()

    • 端口:能够监听不同的端口。 APP.run(port=8000)
    • 主机:监听来自您计算机外部的请求。 APP.run(host='0.0.0.0)

    编辑:flask 是需要安装的外部库。在网站上查找安装说明。简单版:pip install flask

    【讨论】:

    • 哇,很棒的评论,感谢一百万。实际上我需要浏览器来访问像 /localhost/video_server.py?video_id=2 这样的视频文件,然后 python 脚本会在数据库中查找视频 2,并提供服务,这可能吗?
    • 或者我可以编写一个运行 python 脚本的 php 脚本,并让 python 脚本流式传输视频吗?比如 /localhost/video.php?video_id=2 其中 video.php 会调用 python 脚本并且它会完成工作?
    • 我需要 python 工作的原因是我使用了一个特殊的视频库,它只包含在 python 中
    • 您能提供图书馆的链接吗?无论如何,我建议你完全抛弃 PHP 以支持 Python。
    • 库是streamlink github.com/streamlink/streamlink 我尝试转储php,但python 无法正常工作,如您所见,我想知道我上面的python 脚本中的标题是否正确?
    猜你喜欢
    • 2019-09-07
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多