【问题标题】:Python - Codec Issue with the video file downloadedPython - 下载的视频文件的编解码器问题
【发布时间】:2020-10-14 13:53:42
【问题描述】:

我正在尝试下载已上传到云端的视频,并且我正在使用 API 来提取数据。

python 脚本似乎可以正常下载文件,但是当我打开视频时,它会抛出此错误:

我尝试使用不同的选项(VLC、Windows Media Player 等)来播放视频,但没有任何运气。有人可以帮忙吗?

if res.status_code == 200:
    body = res.json()
    for meeting in body["meetings"]:
        try:
            password = requests.get(
                f"{root}meetings/{meeting['uuid']}/recordings/settings?access_token={token}").json()["password"]
            url = f"https://api.zoom.us/v2/meetings/{meeting['uuid']}/recordings/settings?access_token={token}"
            res = requests.patch(
                url,
                data=json.dumps({"password": ""}),
                headers=sess_headers)
        except:
            pass

        topic = meeting["topic"]

        try:
            os.makedirs("downloads")
        except:
            pass
        for i, recording in enumerate(meeting["recording_files"]):
            #os.makedirs(topic)
            download_url = recording["download_url"]
            name = recording["recording_start"] + \
                "-" + meeting["topic"]
            ext = recording["file_type"]
            filename = f"{name}.{ext}"
            path = f'./downloads/{filename}'.replace(":", ".")
            res = requests.get(download_url, headers=sess_headers)

            with open(Path(path), 'wb') as f:
                f.write(res.content)
else:
    print(res.text)

【问题讨论】:

  • 您是否尝试过通过某些下载器直接下载这些 URL?不是通过python脚本。也无法播放?
  • 直接下载就可以了。 JSON 响应有一个链接,当我尝试在浏览器中打开该链接时,文件会自动下载。
  • 可能是requests.get() 函数接收到一些奇怪的Content-Type 并将内容转换为某种非二进制格式。
  • 在完成最后一个requests.get 请求后,能否打印 res.status_code 的值?
  • 如果你有curl 工具然后做下一件事 - curl -I https://google.com/ 但用你的下载网址代替谷歌网址。此命令将转储 HTTP 标头,检查 Content-Type 字符串。

标签: python python-3.x api codec


【解决方案1】:

接下来是一个可能的问题:

在完成每个res = requests.get(...) 之后,您需要插入行res.raise_for_status()

这是检查状态码是否为 200 所必需的。

默认情况下,如果状态码不是 200,requests 不会抛出任何内容。因此,如果状态码错误,您的 res.content 可能是无效的响应正文。

如果您执行res.raise_for_status(),那么requests 将在状态码不是 200 时抛出错误,从而避免可能出现的问题。

但状态码为 200 并不一定意味着没有错误。一些服务器以包含错误描述和状态代码 200 的 HTML 响应。

另一个可能的问题是下载 url 中缺少授权令牌,那么您需要通过标头提供它。所以代替最后一个requests.get(...) 放下一个代码:

res = requests.get(download_url, headers = {
    **sess_headers, 'Authorization': 'Bearer ' + token})

您还需要检查结果响应的内容类型,所以在最后一个res = response.get(...) 之后,执行下一步:

print('headers:', res.headers)

并检查里面有什么。具体查看字段Content-Type,它应该有一些二进制类型,如application/octet-streamvideo/mp4。但绝对不是像application/jsontext/html这样的文本格式,文本格式的文件绝对不是视频文件。如果是text/html,请尝试将文件重命名为test.html 并在浏览器中打开它以查看其中的内容,可能服务器响应此HTML 中的一些错误。

也只是直观地比较两个文件的某些查看器内容 - 通过脚本下载并由某些下载器(例如浏览器)下载。也许有一些肉眼可见的明显问题。

视频的文件大小也应该很大。如果是50KB,那么里面可能有一些坏数据。

更新

终于找到下一个解决方案,将最后一个 requests.get(...) 替换为以下行:

res = requests.get(download_url + '?access_token=' + token, headers=sess_headers)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 2011-01-23
    • 2020-11-28
    • 2021-07-09
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多