2013-05-29 3 views
6

J'ai un projet avec Django Je travaille sur où je veux diffuser des fichiers mp3.Pipe brisée pendant le flux

J'ai cette même question: Streaming mp3 files with django, read from a page with <audio>

Permettez-moi d'expliquer: Je veux flux un ogg avec Django, et avec une étiquette <audio> dans ma page html

j'ai une URL comme domain.tld/song/show/X/, où X est l'id de ma chanson. Je peux streamer avec VLC (directement avec le chemin du fichier), je peux diffuser pendant le test, (j'écris ce que je reçois et je le lis avec VLC).

Mais quand j'ouvrir mon navigateur et charger ma page d'accueil domain.tld où j'ai et <\audio\> avec url domain.tld/song/show/1/ balise, je reçois un gros tuyau cassé, comme si mon client a fermé la connexion.

J'ai lu sur d'autres post que certains problèmes ont été résolus lorsqu'ils ont mis le serveur en production. Donc, je pousse mon application sur le serveur, utilisez Apache, avec le django.wgsi comme sur djangoproject.com. Je lance python 2.7.3 sur Debian 7 avec Django version 1.5. il mon code:

Song/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',) 

Dans mon HTML, je dois juste que:

<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> 

L'erreur ressemble:

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 J'ai deux fois chaque fois que j'essaie de diffuser.


Modifier 15h 29/05:

J'ai fait ce Rahan suggéré: regardant Firebug et débogueur Firefox:

Le client fait:

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/ 

et les détails disent que la taille totale pour tous les documents est de 1 Mo (526 Ko à partir du cache)

+0

Votre client/le navigateur met fin à la connexion. Vous devez vérifier cela. – Rohan

+0

@Rohan avec wireshark? sur le débogueur firefox une réponse get 200 pour l'url /.../song/show/1/ – Lumy

+0

Peut utiliser wireshark ou aussi vérifier dans le débogueur FF s'il y a quelque chose. – Rohan

Répondre

0

Peut être je traversais votre solution existante, j'ai une suggestion, pour par exemple streaming mp3 utiliser nginx/apache serveur, ces jours-ci il y a une solution connue sous le nom sendfile, dans votre cas sur la vue 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 
Questions connexes