Я использую Python2.7, django==1.7
и uwsgi
для потокового видео/mp4-файла до iPhone
.Python - Django: потоковое видео/mp4-файл с использованием HttpResponse
Мой код, как показано ниже:
def stream(request):
with open('/path/video.mp4', 'r') as video_file:
response = HttpResponse(video_file.read(), content_type='video/mp4')
response['Content-Disposition'] = 'inline; filename=%s' % 'video.mp4'
return response
video_file.close
Когда я использую некоторые небольшие видео (менее 1 Мб), то потоки в браузере, но в iPhone плеере у меня есть эта ошибка:
[uwsgi-http key: 127.0.0.1:8008 client_addr: 192.168.0.172 client_port: 14563] hr_write(): Broken pipe [plugins/http/http.c line 564]
И когда размер видео больше 5 МБ, он не передает в обоих (означает браузер и iPhone-плеер) с той же ошибкой.
Я пытался сделать это с помощью куска кусок возвращения с использованием StreamHttpRespose, как показано ниже:
def read(chunksize=8192):
with open('/path/video.mp4', 'rb') as video_file:
byte = video_file.read(chunksize)
while byte:
yield byte
return StreamingHttpResponse(read(), content_type='video/mp4')
Но есть та же ошибка: Broken pipe
.
fyi Я могу передавать файлы PDF и изображений. Эта проблема связана только с файлами mp4. А также я изменил content_type на 'video-mpeg', браузер загрузил это, в то время как я хочу предотвратить загрузку файлов.
Что вы думаете? Любое решение !!?
Для того, чтобы поток вам нужен другой поток для записи данных в ответ. Потому что так, как вы это делаете, просто подождите, пока вы не прочитаете весь файл и не отправите его вместе. –
@BogdanIulianBursuc Спасибо за ваш комментарий, но во втором решении (StreamHttpResponse) я читаю видеофайл в виде байта и возвращаю его в каждом фрагменте с помощью команды yield. это означает, что не нужно ждать получения всего файла. –
Да. Вы правы –