2013-05-29 15 views
6

Mam projekt z Django Pracuję nad tym, gdzie chcę przesyłać strumieniowo niektóre pliki mp3.Uszkodzona rura podczas przesyłania strumieniowego

mam ten sam problem: Streaming mp3 files with django, read from a page with <audio>

Pozwól mi wyjaśnić: Chcę Stream ogg z Django, iz <audio> tagu w mojej stronie html

Mam url podobny domain.tld/song/show/X/, gdzie X jest id mojej piosenki. Mogę przesyłać strumieniowo z VLC (bezpośrednio ze ścieżką pliku), mogę przesyłać strumieniowo podczas testu (piszę to, co otrzymuję i odczytuję za pomocą VLC).

Ale kiedy otworzyć przeglądarkę i załadować stronę główną domain.tld gdzie mam i <\audio\> balisy url domain.tld/song/show/1/, mam dużą złamaną fajkę, jakby mój klient zamknął połączenie.

Czytam na innych postach, że niektóre problemy zostały rozwiązane, gdy wprowadzają serwer do produkcji. Przesyłam więc moją aplikację na serwer, używam apache, z django.wgsi jak na djangoproject.com.

Używam Pythona 2.7.3 na Debianie 7 z Django w wersji 1.5. tam mój kod:

utworu/views.py

def playAudioFile(request, pk): 
    f = get_stream_song(pk)# return a pipe from pipes.Template 
    l = f.read() # the file is an ogg get by pydub.com 
    f.close() 
    size_read = 550000 
    sr = size_read 
    while sr == size_read: 
     print "rep" 
     r = l[:size_read] 
     l=l[size_read:] 
     sr = len(r) 
     yield r 
    time.sleep(0.1) 

#url : ~/song/show/X/ 
#@login_required 
def show_song(request, pk): 
     return StreamingHttpResponse(playAudioFile(request, pk), mimetype='audio/ogg',) 

W moim HTML, po prostu muszę, że:

<audio controls height="100" width="100" preload="auto"> 
    <source src="/.../song/show/1/" type="audio/ogg"> 
    <embed height="50" width="100" src="/.../song/show/1/"> 
    </audio> 

Błąd wygląda następująco:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run 
    self.finish_response() 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 127, in finish_response 
    self.write(data) 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 215, in write 
    self._write(data) 
    File "/usr/lib/python2.7/socket.py", line 324, in write 
    self.flush() 
    File "/usr/lib/python2.7/socket.py", line 303, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 104] Connection reset by peer 
---------------------------------------- 
Exception happened during processing of request from ('127.0.0.1', 46392) 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/home/lumy/SPhoque/SonoPhoque/SoPhoque/local/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 150, in __init__ 
    super(WSGIRequestHandler, self).__init__(*args, **kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 651, in __init__ 
    self.finish() 
    File "/usr/lib/python2.7/SocketServer.py", line 704, in finish 
    self.wfile.flush() 
    File "/usr/lib/python2.7/socket.py", line 303, in flush 
    self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 32] Broken pipe 

I otrzymałem to dwa razy za każdym razem, gdy próbuję przesyłać strumieniowo.


Edit 15h 29/05:

Zrobiłem co Rahan zasugerował: Patrząc na Firebug Firefox i debugger:

Klient robi:

GET 1 200 OK localhost:8000 537.1KB 4.71s 

Headers 
Response Headersview source 
Date Wed, 29 May 2013 13:08:54 GMT 
Server WSGIServer/0.1 Python/2.7.3 
Content-Type audio/ogg 
Request Headersview source 
Host localhost:8000 
User-Agent Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20100101 Firefox/10.0.12 Iceweasel/10.0.12 
Accept audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5 
Accept-Language en-us,en;q=0.5 
Connection keep-alive 
Range bytes=0- 
Referer http://localhost:8000/ 

i powiedzieć, że dane całkowity rozmiar wszystkich dokumentów wynosi 1 MB (526 KB z pamięci podręcznej)

+0

Twój klient/przeglądarka kończy połączenie. Musisz to sprawdzić. – Rohan

+0

@Rohan z wireshark? na deborze firefox uzyska odpowiedź 200 dla adresu url /.../song/show/1/ – Lumy

+0

Może użyć Wiresharka lub też sprawdzić debugger FF, jeśli coś jest. – Rohan

Odpowiedz

0

Może jestem przekraczania istniejącego rozwiązania, mam sugestię, mp3 streamingu używać nginx/apache serwera, te dni nie jest rozwiązanie znane jako sendfile, na przykład w przypadku, w widoku django

def send_file_header(server_type): 
    header = "X-Sendfile" if server_type == "apache" else "X-Accel-Redirect" 
    return header 

@login_required 
def show_song(request, pk): 
    res = HttpResponse() 
    path = "/path/to/secret/x.mp3" 
    response[send_file_header('nginx')] = path 
    response['Content-Type']= "application/octet-stream" 
    response['Content-Disposition'] = "attachment; filename=\"x.mp3\"" 
    return response