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)
Twój klient/przeglądarka kończy połączenie. Musisz to sprawdzić. – Rohan
@Rohan z wireshark? na deborze firefox uzyska odpowiedź 200 dla adresu url /.../song/show/1/ – Lumy
Może użyć Wiresharka lub też sprawdzić debugger FF, jeśli coś jest. – Rohan