Python - 下载的视频文件存在编解码器问题
Python - Codec Issue with the video file downloaded
我正在尝试下载已上传到云端的视频,我正在使用 API 来提取数据。
python 脚本似乎可以很好地下载文件,但是当我打开视频时它会抛出此错误:
我试过使用不同的选项(VLC、Windows 媒体播放器等)来播放视频,但没有成功。有人可以帮忙吗?
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
可能是无效响应 body。
如果您执行 res.raise_for_status()
,那么如果状态代码不是 200,requests
将抛出错误,从而避免可能出现的问题。
但是状态码为 200 并不一定意味着没有错误。一些服务器以 [=58=] 响应,其中包含错误描述和状态代码 200。
另一个可能的问题是下载 url 中缺少授权令牌,那么您需要通过 headers 提供它。因此,而不是上一个 requests.get(...)
放下一个代码:
res = requests.get(download_url, headers = {
**sess_headers, 'Authorization': 'Bearer ' + token})
您还需要检查结果响应的内容类型,所以在上一个 res = response.get(...)
之后,执行下一步:
print('headers:', res.headers)
并检查里面有什么。具体看字段 Content-Type
,它应该有一些二进制类型,如 application/octet-stream
或 video/mp4
。但绝对不是像application/json
或text/html
这样的文本格式,文本格式的文件绝对不是视频文件。如果它是 text/html
然后尝试将文件重命名为 test.html
并在浏览器中打开它以查看那里有什么,可能服务器在 HTML.
中响应了一些错误
也只是在一些查看器中直观地比较两个文件的内容——通过脚本下载和通过某些下载器(例如浏览器)下载。也许有一些肉眼可见的明显问题。
此外,视频的文件大小应该很大。如果它像 50KB
那么可能里面有一些坏数据。
更新:
终于完成了下一个解决方案,将最后一个 requests.get(...)
替换为行:
res = requests.get(download_url + '?access_token=' + token, headers=sess_headers)
我正在尝试下载已上传到云端的视频,我正在使用 API 来提取数据。
python 脚本似乎可以很好地下载文件,但是当我打开视频时它会抛出此错误:
我试过使用不同的选项(VLC、Windows 媒体播放器等)来播放视频,但没有成功。有人可以帮忙吗?
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
可能是无效响应 body。
如果您执行 res.raise_for_status()
,那么如果状态代码不是 200,requests
将抛出错误,从而避免可能出现的问题。
但是状态码为 200 并不一定意味着没有错误。一些服务器以 [=58=] 响应,其中包含错误描述和状态代码 200。
另一个可能的问题是下载 url 中缺少授权令牌,那么您需要通过 headers 提供它。因此,而不是上一个 requests.get(...)
放下一个代码:
res = requests.get(download_url, headers = {
**sess_headers, 'Authorization': 'Bearer ' + token})
您还需要检查结果响应的内容类型,所以在上一个 res = response.get(...)
之后,执行下一步:
print('headers:', res.headers)
并检查里面有什么。具体看字段 Content-Type
,它应该有一些二进制类型,如 application/octet-stream
或 video/mp4
。但绝对不是像application/json
或text/html
这样的文本格式,文本格式的文件绝对不是视频文件。如果它是 text/html
然后尝试将文件重命名为 test.html
并在浏览器中打开它以查看那里有什么,可能服务器在 HTML.
也只是在一些查看器中直观地比较两个文件的内容——通过脚本下载和通过某些下载器(例如浏览器)下载。也许有一些肉眼可见的明显问题。
此外,视频的文件大小应该很大。如果它像 50KB
那么可能里面有一些坏数据。
更新:
终于完成了下一个解决方案,将最后一个 requests.get(...)
替换为行:
res = requests.get(download_url + '?access_token=' + token, headers=sess_headers)