2012-12-19 28 views
11

Tôi đang cố gắng để dòng ra một âm thanh/wav sử dụng tính năng HTML5 theo cách sau:Làm cách nào để phân phát tệp âm thanh để phát trực tuyến từ Grails bằng mã 206?

<audio type="audio/wav" src="/sound/10/audio/full" sound-id="10" version="full" controls=""> 
</audio> 

Đây là hoạt động khá tốt trên Chrome, ngoại trừ việc nó không thể phát lại hoặc định vị lại thuộc tính currentTime:

var audioElement = $('audio').get(0) 
audioElement.currentTime 
> 1.2479820251464844 
audioElement.currentTime = 0 
audioElement.currentTime 
> 1.2479820251464844 

tôi đang phục vụ các tập tin âm thanh từ một bộ điều khiển Grails, sử dụng đoạn mã sau:

def audio() { 
    File file = soundService.getAudio(...) 
    response.setContentType('audio/wav') 
    response.setContentLength (file.bytes.length) 
    response.setHeader("Content-disposition", "attachment;filename=${file.getName()}") 
    response.outputStream << file.newInputStream() // Performing a binary stream copy 
    response.status = 206 

    return false 
} 

có vẻ như dù Grails i s trả lại phản hồi HTTP 200 thay vì 206 (Phần nội dung) như bạn có thể thấy từ kết quả sau từ Chrome:

Request URL:http://localhost:8080/sound/10/audio/full 
Request Method:GET 
Status Code:200 OK 
Request Headersview source 
Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:identity;q=1, *;q=0 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Cookie:JSESSIONID=9395D8FFF34B7455F937190F521AA1BC 
Host:localhost:8080 
Range:bytes=0-3189 
Referer:http://localhost:8080/cms/sound/10/edit 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko)     Chrome/23.0.1271.97 Safari/537.11 
Response Headersview source 
Content-disposition:attachment;filename=full.wav 
Content-Length:3190 
Content-Type:audio/wav 
Date:Wed, 19 Dec 2012 13:58:44 GMT 
Server:Apache-Coyote/1.1 

Bất kỳ ý tưởng nào có thể sai?

Xin cảm ơn, Amit.

ADDITION:

Thay đổi logic điều khiển để:

response.status = 206 
response.setContentType(version.mime) 
response.setContentLength (file.bytes.length) 
response.setHeader("Content-disposition", "attachment;filename=${file.getName()}") 
response.outputStream << file.newInputStream() // Performing a binary stream copy 

Đã giúp đỡ trở về HTTP 206 (Partial-Content), tuy nhiên cả Chrome và Firefox sẽ không chơi các tập tin âm thanh (nhắc đến một lần nữa Chrome đã chơi khi nó đã nhận được tập tin với một 200 ...)

Screenshot of Chrome's network console

với các thông tin sau đây của phản ứng:

Request URL:http://localhost:8080/sound/10/audio/full 
Request Headersview source 
Accept-Encoding:identity;q=1, *;q=0 
Range:bytes=0- 
Referer:http://localhost:8080/cms/sound/10/edit 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 
+2

Có thể đặt 'response.status = 206' _before_ bạn truyền tệp? –

+1

Điều này chắc chắn đã giúp nhận được mã 206 (tiêu đề bán phá giá với curl). Nhưng sau đó, trình phát của

Trả lời

4

Bạn có thể muốn thử:

response.reset(); 
response.setStatus(206); 
response.setHeader("Accept-Ranges", "bytes"); 
response.setHeader("Content-length", Integer.toString(length + 1)); 
response.setHeader("Content-range", "bytes " + start.toString() + "-" + end.toString() + "/" + Long.toString(f.size())); 
response.setContentType(...); 

Và kiểu này đầu ra chỉ nên được thực hiện nếu khách hàng yêu cầu đặc biệt cho một phạm vi. Bạn có thể kiểm tra bằng cách sử dụng:

String range = request.getHeader("range"); 

nếu phạm vi không rỗng, thì bạn sẽ phải phân tích phạm vi cho yêu cầu bắt đầu và kết thúc byte. Lưu ý rằng bạn có thể có "0-" làm dải ô Trong một số trường hợp, bạn sẽ thấy "0-1" làm yêu cầu để xem liệu dịch vụ của bạn có biết cách xử lý các yêu cầu phạm vi không.

+1

Xin cảm ơn, hãy thử điều đó! – amit

+1

Công việc này có phù hợp với bạn không? – raven