Python — проблема с кодеком при загрузке видеофайла

#python #python-3.x #api #codec

#python #python-3.x #API #кодек

Вопрос:

Я пытаюсь загрузить видео, которое было загружено в облако, и я использую API для извлечения данных.

Кажется, что скрипт python загружает файл нормально, но когда я открываю видео, он выдает эту ошибку:

введите описание изображения здесь

Я пытался использовать различные опции (VLC, проигрыватель Windows Media и т. Д.) Для воспроизведения видео, Но безуспешно. Может кто-нибудь, пожалуйста, помочь?

 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)
  

Комментарии:

1. Вы пробовали загружать какие-либо из этих URL-адресов напрямую с помощью какого-либо загрузчика? Не с помощью скрипта python. Также не воспроизводится?

2. Прямая загрузка работает нормально. В ответе JSON есть ссылка, и когда я пытаюсь открыть эту ссылку в браузере, файл автоматически загружается.

3. Может быть так, что requests.get() функция получает какие-то странные Content-Type и преобразует содержимое в некоторый недвоичный формат.

4. можете ли вы распечатать значение res.status_code после выполнения последнего requests.get запроса?

5. Если у вас есть curl инструмент, сделайте следующее — curl -I https://google.com/ но замените вместо URL-адреса Google URL-адрес загрузки. Эта команда выведет HTTP-заголовки, проверьте, какая Content-Type строка там есть.

Ответ №1:

Одна из возможных проблем заключается в следующем:

После выполнения каждого res = requests.get(...) из них вам нужно вставить строку res.raise_for_status() .

Это необходимо для проверки того, что код состояния равен 200.

По умолчанию requests ничего не выдает, если код состояния не равен 200. Следовательно, ваш res.content может быть недопустимым телом ответа в случае неправильного кода состояния.

Если вы это сделаете res.raise_for_status() , то requests выдаст ошибку, если код состояния не равен 200, что избавит вас от возможных проблем.

Но наличие кода состояния 200 определенно не означает, что ошибки не было. Некоторые серверы отвечают HTML, содержащим описание ошибки и код состояния 200.

Другая возможная проблема может заключаться в том, что в 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-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)