2012-12-19 3 views
11

Sto cercando di fuori flusso audio/wav utilizzando funzionalità HTML5 nel seguente modo:Come servire file audio per lo streaming da Grails con il codice 206?

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

Questo sta lavorando abbastanza bene su Chrome, tranne che per il fatto che è impossibile riprodurre o riposizionare l'attributo currentTime:

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

sto servendo il file audio da un controller di Grails, utilizzando codice seguente:

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 
} 

sembra però Grails i s restituendo una risposta HTTP 200 invece di 206 (Partial-Content) come si può vedere dalla seguente output da 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 

Qualche idea di cosa potrebbe essere sbagliato?

Grazie, Amit.

AGGIUNTA:

Cambio della logica di controller per:

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 

ha aiutato con il ritorno HTTP-206 (Partial-Content), comunque sia Chrome e Firefox non giocherà il file audio (menzionando nuovo Chrome ha fatto giocare quando ha ottenuto il file con un 200 ...)

Screenshot of Chrome's network console

con il seguente informazioni della risposta:

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

Forse impostare 'response.status = 206' _prima_ lo streaming del file? –

+1

Ciò ha sicuramente aiutato a ottenere il codice 206 (con le intestazioni di dumping arricciate). Ma il lettore di

risposta

4

Si potrebbe desiderare di provare:

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

E questo tipo di uscita dovrebbe essere fatto solo se il cliente ha chiesto espressamente per una serie. È possibile controllare tramite:

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

se gamma non è nullo, allora si dovrà analizzare la gamma per le richieste di byte di inizio e fine. Nota che puoi avere "0-" come intervallo In alcuni casi, vedrai "0-1" come una richiesta per vedere se il tuo servizio sa come gestire le richieste di intervallo.

+1

Grazie, ci proverò! – amit

+1

Questo lavoro ha funzionato per te? – raven

Problemi correlati