У меня странная проблема при попытке потокового видео H.264 с Django с использованием класса FileWrapper.Я использую следующую функцию просмотра:
def mp4(request, path):
wrapper = FileWrapper(open(path, 'rb'))
content_type = mimetypes.guess_type(path)[0]
response = HttpResponse(wrapper, content_type=content_type)
response['Content-Length'] = os.path.getsize(path)
return response
Функция сопоставлена с этим URL:
(r'^/mp4/(.*)$', 'mp4'),
И я ссылаюсь на URL внутри тега видео HTML5:
<video width="560" height="340" controls>
<source src='/video/mp4//tmp/test.mp4' type='video/mp4 codecs="avc1.42E01E, mp4a.40.2"'>
</video>
Однако, когда я открываю страницу, содержащую видео, видео НЕ воспроизводится, и сервер разработки Django выдает следующие ошибки:
Traceback (most recent call last):
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 280, in run
self.finish_response()
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 320, in finish_response
self.write(data)
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 416, in write
self._write(data)
File "/usr/lib/python2.6/socket.py", line 300, in write
self.flush()
File "/usr/lib/python2.6/socket.py", line 286, in flush
self._sock.sendall(buffer)
error: [Errno 104] Connection reset by peer
[05/Dec/2010 13:08:00] "GET /video/mp4//tmp/test.mp4 HTTP/1.1" 200 384329753
Traceback (most recent call last):
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 280, in run
self.finish_response()
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 320, in finish_response
self.write(data)
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 416, in write
self._write(data)
File "/usr/lib/python2.6/socket.py", line 300, in write
self.flush()
File "/usr/lib/python2.6/socket.py", line 286, in flush
self._sock.sendall(buffer)
error: [Errno 104] Connection reset by peer
Traceback (most recent call last):
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 280, in run
self.finish_response()
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 320, in finish_response
self.write(data)
File "/usr/lib/pymodules/python2.6/django/core/servers/basehttp.py", line 416, in write
self._write(data)
File "/usr/lib/python2.6/socket.py", line 300, in write
self.flush()
File "/usr/lib/python2.6/socket.py", line 286, in flush
self._sock.sendall(buffer)
error: [Errno 32] Broken pipe
Появляется браузер Google Chromeпопытайтесь получить видео несколько раз, первые два раза сбросьте соединение и в последний раз сбросьте соединение.Обратите внимание, что Django возвращает ответ 200 OK вместе с правильным размером видео.
Вот странная часть: даже если видео не воспроизводится, я могу щелкнуть правой кнопкой мыши элемент управления плеером, выберите СохранитьВидео как ... и Google Chrome с радостью загрузит все видео и сохранит его локально.Затем я все еще в Google Chrome могу воспроизвести сохраненное видео, открыв его с помощью файла: // URL.
Я также попытался поместить видеофайл на локальный веб-сервер и сослаться на него в видео.тег, и это тоже работает.
Так что я думаю, что проблема связана с FileWrapper и / или с тем, как Django обрабатывает HttpResponse с помощью итератора.Данные есть, их можно сохранить с помощью Сохранить видео как ... , так почему бы не воспроизвести?
Спасибо!