Частичный видеопоток Flask не работает на Ipad и Iphone ⇐ Python
-
Anonymous
Частичный видеопоток Flask не работает на Ipad и Iphone
Я пытаюсь написать веб-страницу flask, которая передает клиенту определенный диапазон байтов, чтобы вы могли смотреть большие видеофайлы (mp4) с сетевого диска без необходимости загружать все видео. Он уже работает на моем ноутбуке и на моем компьютере, на котором размещена веб-страница, но я постоянно сталкиваюсь с проблемой, когда пытаюсь использовать веб-страницу на мобильном устройстве Apple. Видео просто не загружается. Видеоплеер остается пустым, не показывает продолжительность видео и невозможно запустить и просмотреть видео.
Я уже пробовал использовать другой браузер. Я пробовал Safari, Google и Firefox, но ничего не помогло.
Это HTML-код страницы потоковой передачи:
{{title}} а это связанный файл колбы:
импортировать mime-типы ответ на импорт из колбы, render_template, запрос, Blueprint импортировать ОС из вспомогательного импорта getMovieById, getMovieList поток = Blueprint("поток", __name__) защита RemoveNonDigit(строка): окончательный = "" для меня в ул: если я в "0123456789": окончательный += я возвращение финала @stream.route("/movie//", методы=['GET']) защита getMovie(id, версия): диапазон = request.headers.get("диапазон") если не диапазон: return Response("Требуется заголовок диапазона",status=400) videoPath: str = getMovieById(id).get("версии")[int(ver)][1] videoSize: байты = os.stat(videoPath).st_size # диапазон анализа # "байт=3323-" CHUNK_SIZE = (10**6)*1# около 1 МБ x = диапазон[:range.find("-")] начало = int(removeNonDigit(x)) конец = мин (начало + CHUNK_SIZE, videoSize-1) # читаем данные с open(videoPath, "rb") как v: v.seek(начало) данные = v.read(CHUNK_SIZE) длина_контента = конец - начало + 1 заголовки = { "Content-Range": f'bytes {start}-{end}/{videoSize}', «Accept-Ranges»: «байты», «Длина контента»: content_length, «Тип контента»: «видео/mp4», } вернуть ответ (данные, статус = 206, заголовки = заголовки, mimetype = mimetypes.guess_type (videoPath) [0],direct_passthrough = True) @stream.route("/watch//") def player(id, версия): return render_template("movie.html", title=getMovieById(id).get("name"), version=version, id=id) @stream.route("/banner/") Защитный баннер (идентификатор): img = getMovieById(id).get("img") с open(img, "rb") как f: данные = f.read() вернуть ответ (данные, статус = 202) это может быть немного беспорядочно, я уже давно пытаюсь
Вот результат, который я получаю из консоли Flask, когда подключаюсь со своего ПК и не запускаю видео:
127.0.0.1 - - [13.11.2023 20:14:02] "GET /watch/1/1 HTTP/1.1" 200 - 127.0.0.1 - - [13.11.2023 20:14:04] "GET /movie/1/1 HTTP/1.1" 206 - 127.0.0.1 - - [13.11.2023 20:14:04] "GET /movie/1/1 HTTP/1.1" 206 - Но при подключении с моего iPad я получаю только такой результат:
192.xxx.xxx.xxx - - [13 ноября 2023 20:15:36] "GET /watch/1/0 HTTP/1.1" 200 - 192.xxx.xxx.xxx - - [13.11.2023 20:15:38] "GET /movie/1/0 HTTP/1.1" 206 - Я также обнаружил, что заголовки в запросе от IPad имеют диапазон байтов «bytes=0-1», с ПК диапазон байтов — «bytes=0-»
Я не эксперт в вопросах запросов, но, возможно, это поможет...
Если вам нужна дополнительная информация или фрагменты кода, дайте мне знать.
Заранее спасибо :3
Я пытаюсь написать веб-страницу flask, которая передает клиенту определенный диапазон байтов, чтобы вы могли смотреть большие видеофайлы (mp4) с сетевого диска без необходимости загружать все видео. Он уже работает на моем ноутбуке и на моем компьютере, на котором размещена веб-страница, но я постоянно сталкиваюсь с проблемой, когда пытаюсь использовать веб-страницу на мобильном устройстве Apple. Видео просто не загружается. Видеоплеер остается пустым, не показывает продолжительность видео и невозможно запустить и просмотреть видео.
Я уже пробовал использовать другой браузер. Я пробовал Safari, Google и Firefox, но ничего не помогло.
Это HTML-код страницы потоковой передачи:
{{title}} а это связанный файл колбы:
импортировать mime-типы ответ на импорт из колбы, render_template, запрос, Blueprint импортировать ОС из вспомогательного импорта getMovieById, getMovieList поток = Blueprint("поток", __name__) защита RemoveNonDigit(строка): окончательный = "" для меня в ул: если я в "0123456789": окончательный += я возвращение финала @stream.route("/movie//", методы=['GET']) защита getMovie(id, версия): диапазон = request.headers.get("диапазон") если не диапазон: return Response("Требуется заголовок диапазона",status=400) videoPath: str = getMovieById(id).get("версии")[int(ver)][1] videoSize: байты = os.stat(videoPath).st_size # диапазон анализа # "байт=3323-" CHUNK_SIZE = (10**6)*1# около 1 МБ x = диапазон[:range.find("-")] начало = int(removeNonDigit(x)) конец = мин (начало + CHUNK_SIZE, videoSize-1) # читаем данные с open(videoPath, "rb") как v: v.seek(начало) данные = v.read(CHUNK_SIZE) длина_контента = конец - начало + 1 заголовки = { "Content-Range": f'bytes {start}-{end}/{videoSize}', «Accept-Ranges»: «байты», «Длина контента»: content_length, «Тип контента»: «видео/mp4», } вернуть ответ (данные, статус = 206, заголовки = заголовки, mimetype = mimetypes.guess_type (videoPath) [0],direct_passthrough = True) @stream.route("/watch//") def player(id, версия): return render_template("movie.html", title=getMovieById(id).get("name"), version=version, id=id) @stream.route("/banner/") Защитный баннер (идентификатор): img = getMovieById(id).get("img") с open(img, "rb") как f: данные = f.read() вернуть ответ (данные, статус = 202) это может быть немного беспорядочно, я уже давно пытаюсь
Вот результат, который я получаю из консоли Flask, когда подключаюсь со своего ПК и не запускаю видео:
127.0.0.1 - - [13.11.2023 20:14:02] "GET /watch/1/1 HTTP/1.1" 200 - 127.0.0.1 - - [13.11.2023 20:14:04] "GET /movie/1/1 HTTP/1.1" 206 - 127.0.0.1 - - [13.11.2023 20:14:04] "GET /movie/1/1 HTTP/1.1" 206 - Но при подключении с моего iPad я получаю только такой результат:
192.xxx.xxx.xxx - - [13 ноября 2023 20:15:36] "GET /watch/1/0 HTTP/1.1" 200 - 192.xxx.xxx.xxx - - [13.11.2023 20:15:38] "GET /movie/1/0 HTTP/1.1" 206 - Я также обнаружил, что заголовки в запросе от IPad имеют диапазон байтов «bytes=0-1», с ПК диапазон байтов — «bytes=0-»
Я не эксперт в вопросах запросов, но, возможно, это поможет...
Если вам нужна дополнительная информация или фрагменты кода, дайте мне знать.
Заранее спасибо :3
Мобильная версия