Python-下载的视频文件出现编解码器问题

问题描述

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

python脚本似乎可以很好地下载文件,但是当我打开视频时,它将引发此错误

Formik

我尝试使用其他选项(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)

解决方法

下一个可能的问题:

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

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

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

如果您执行res.raise_for_status(),则如果状态代码不是200,则requests会抛出错误,从而使您免于可能出现的问题。

但是状态码为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)