Django, потоковое видео H.264 с FileWrapper (HTML5) - PullRequest
2 голосов
/ 05 декабря 2010

У меня странная проблема при попытке потокового видео 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 с помощью итератора.Данные есть, их можно сохранить с помощью Сохранить видео как ... , так почему бы не воспроизвести?

Спасибо!

...