Я столкнулся с той же проблемой и в итоге обнаружил, что реальная проблема заключается в том, что клиент видеопроигрывателя (по крайней мере, в iOS для Objective C) использует заголовок «range» в ответе (вы можете распечатать Flask request.headers
для проверки ). Другими словами, потоковая передача действительно реализована с использованием поддержки «диапазона» в HTTP.
Я следовал за примерами на https://codeburst.io/the-taste-of-media-streaming-with-flask-cdce35908a50, Код сервера Flask должен создавать ответ с использованием «частичного содержимого» (код состояния HTTP 206) и обрабатывать заголовок «range» в запросе. Связанный код выглядит так:
- добавить «Accept-Ranges» в приложение Flask after_request, чтобы клиент знал, что «range» поддерживается:
@app.after_request
def after_request(response):
response.headers.add('Accept-Ranges', 'bytes')
return response
- в вашей функции, которая обслуживает файл mp4, предположим, что путь к файлу "full_path":
file_size = os.stat(full_path).st_size
start = 0
length = 10240 # can be any default length you want
range_header = request.headers.get('Range', None)
if range_header:
m = re.search('([0-9]+)-([0-9]*)', range_header) # example: 0-1000 or 1250-
g = m.groups()
byte1, byte2 = 0, None
if g[0]:
byte1 = int(g[0])
if g[1]:
byte2 = int(g[1])
if byte1 < file_size:
start = byte1
if byte2:
length = byte2 + 1 - byte1
else:
length = file_size - start
with open(full_path, 'rb') as f:
f.seek(start)
chunk = f.read(length)
rv = Response(chunk, 206, mimetype='video/mp4', content_type='video/mp4', direct_passthrough=True)
rv.headers.add('Content-Range', 'bytes {0}-{1}/{2}'.format(start, start + length - 1, file_size))
return rv
В моем тестировании приведенный выше код Flask работает с клиентом iOS Objective-C, а также браузерами Chrome и Firefox для файлов .mp4.