2013-05-29 39 views
6

Tôi có một dự án với Django Tôi đang làm việc trên nơi tôi muốn truyền một số tệp mp3.Ống bị hỏng trong luồng

Tôi có cùng vấn đề này: Streaming mp3 files with django, read from a page with <audio>

Hãy để tôi giải thích: Tôi muốn dòng một ogg với Django, và với một thẻ <audio> trong trang html của tôi

Tôi có một url như domain.tld/song/show/X/, trong đó X là id của bài hát của tôi. Tôi có thể phát trực tiếp bằng VLC (trực tiếp với đường dẫn tệp), tôi có thể phát trực tuyến trong khi kiểm tra, (Tôi viết những gì tôi nhận và đọc nó với VLC).

Nhưng khi tôi mở trình duyệt và tải trang chủ của mình domain.tld nơi tôi có và <\audio\> cân bằng với url domain.tld/song/show/1/, tôi nhận được một đường ống bị hỏng lớn, như thể khách hàng của tôi đã đóng kết nối.

Tôi đọc trên những người khác đăng rằng một số vấn đề đã được giải quyết khi đưa máy chủ vào sản xuất. Vì vậy, tôi đẩy ứng dụng của tôi lên máy chủ, sử dụng apache, với số django.wgsi như trên djangoproject.com.

Tôi đang chạy python 2.7.3 trên Debian 7 với phiên bản Django 1.5. có mã của tôi:

Sông/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',) 

Trong HTML của tôi, tôi chỉ có mà:

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

Các lỗi trông giống như:

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 

tôi nhận được điều này hai lần mỗi lần tôi cố gắng phát trực tiếp.


Sửa 15h 29/05:

Tôi đã làm những gì rahan gợi ý: Nhìn vào Firebug và Firefox debugger:

Các khách hàng không:

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/ 

và chi tiết nói rằng tổng kích thước cho tất cả tài liệu là 1 MB (526 KB từ bộ nhớ cache)

+0

Khách hàng của bạn/trình duyệt đang chấm dứt kết nối. Bạn cần phải kiểm tra điều đó. – Rohan

+0

@Rohan với wireshark? trên trình gỡ rối firefox nhận được phản hồi 200 cho url /.../song/show/1/ – Lumy

+0

Có thể sử dụng wireshark hoặc cũng kiểm tra trình gỡ lỗi FF nếu có gì đó. – Rohan

Trả lời

0

Có thể tôi qua giải pháp hiện tại của bạn, tôi có một đề nghị, cho mp3 trực tuyến sử dụng nginx/apache máy chủ, những ngày này có một giải pháp gọi là sendfile, ví dụ như trong trường hợp của bạn vào xem 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 
Các vấn đề liên quan