2012-12-19 4 views
11

मैं एक ऑडियो/wav निम्नलिखित तरीके से एचटीएमएल 5 सुविधा का उपयोग कर बाहर स्ट्रीम करने के लिए कोशिश कर रहा हूँ:कोड 206 के साथ Grails से स्ट्रीमिंग के लिए ऑडियो फ़ाइल कैसे सेवा करें?

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

यह क्रोम पर बहुत अच्छी तरह से काम कर रहा है, वास्तव में यह पुन: चलाने या मौजूदा समय विशेषता स्थान बदलने के लिए असंभव है के लिए छोड़कर:

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

मैं एक Grails नियंत्रक से ऑडियो फ़ाइल की सेवा कर रहा हूँ, निम्नलिखित कोड का उपयोग कर:

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 
} 

हालांकि यह Grails लगता है मैं

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 

किसी भी विचार क्या गलत हो सकता है: एक HTTP प्रतिसाद 200 के बजाय 206 (आंशिक-सामग्री) वापस देने के रूप में आप क्रोम से निम्नलिखित उत्पादन से देख सकते हैं है?

धन्यवाद, अमित।

अलावा:

को नियंत्रक तर्क को बदलना:

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 

किया लौटने HTTP-206 (आंशिक-सामग्री), तथापि Chrome और Firefox दोनों ऑडियो फ़ाइल नहीं खेलेंगे के साथ मदद (उल्लेख फिर क्रोम ...) प्रतिक्रिया की निम्नलिखित जानकारी के साथ खेलते हैं, जब यह एक 200 के साथ फ़ाइल मिला

Screenshot of Chrome's network console

किया:

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

शायद 'response.status = 206' _before_ सेट करें, आप फ़ाइल स्ट्रीम करते हैं? –

+1

यह निश्चित रूप से 206 कोड (कर्ल के साथ डंपिंग हेडर) प्राप्त करने में मदद करता है। लेकिन फिर

उत्तर

4

आप कोशिश करना चाहते हो सकता है:

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(...); 

और अगर ग्राहक विशेष रूप से एक सीमा के लिए कहा उत्पादन के इस प्रकार केवल किया जाना चाहिए। आप का उपयोग करके देख सकते हैं:

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

अगर रेंज रिक्त नहीं है, तो आप प्रारंभ और अंत बाइट अनुरोधों के लिए रेंज पार्स करने के लिए होगा। ध्यान दें कि आपके पास "0-" सीमा के रूप में हो सकता है कुछ मामलों में, आपको यह देखने के अनुरोध के रूप में "0-1" दिखाई देगा कि आपकी सेवा सीमा अनुरोधों को कैसे संभालना है या नहीं।

+1

धन्यवाद, कोशिश करेंगे! – amit

+1

क्या यह आपके लिए काम करता है अमितकपिट? – raven

संबंधित मुद्दे