2015-12-15 16 views
15

Devo usare un TTS (Text to Speak) da ReadSpeaker per aggiungere audio all'applicazione che sto sviluppando.Streaming MP3 in C# .NET 4.5.1 MVC 5.2.2 su Samsung 6S

Ora l'account SCAPI di base che stiamo utilizzando attualmente ha una configurazione di base, è stato semplicemente impostato un URL e ottenuto un flusso MP3 che abbiamo bisogno di produrre. Poiché la chiave di servizio è nell'URL, non possiamo utilizzarla nel front-end, quindi è necessario trasmettere i file attraverso i nostri server.

Tutto ha funzionato bene fino a quando ho testato il codice di sviluppo sul Samsung 6S. Dove non ha giocato affatto, tuttavia i servizi proprio collegamento funziona cioè funziona:

<audio controls> 
    <source 
     src="http://tts.readspeaker.com/a/speak?key=[ServiceKey]&lang=en_uk&voice=Female01&audioformat=mp3&volume=200&text=test text 2" 
     type="audio/mp3"> 
     Your browser does not support the audio element. 
</audio> 

mentre lo stesso codice esatto attraverso i nostri server non lo fa sul Samsung 6S con lo stesso collegamento come sorgente di flusso nel controller.

Ho attraversato vari modi diversi di streaming del file sul server, ma sono semplicemente caduto piatto ogni volta in Samsung 6S (nuovo di zecca senza modifiche).

Ecco il codice che ho usato.

controllo Void:

string url = "http://tts.readspeaker.com/a/speak?key=[ServiceKey]&lang=en_uk&voice=Female01&audioformat=mp3&volume=200&text=test text 2"; 

HttpWebRequest HttpWRequest = (HttpWebRequest)WebRequest.Create(url); 
HttpWebResponse response = (HttpWebResponse)HttpWRequest.GetResponse(); 

Stream stream = response.GetResponseStream(); 

MemoryStream ms = new MemoryStream(); 
stream.CopyTo(ms); 

Response.AddHeader("Content-Type", response.ContentType); 
Response.AddHeader("Content-Length", response.ContentLength.ToString()); 
Response.AddHeader("Access-Control-Allow-Origin", "*"); 
Response.AddHeader("Connection", "close"); 

Response.Flush(); 

audioData = ms.ToArray(); 
Response.BinaryWrite(audioData); 

Response.End(); 

standard FileStreamResult dove prendo MemoryStream del codice di cui sopra e inviare attraverso di essa vale a dire con un controller FileStreamResult invece di impostare le intestazioni manualmente:

return new FileStreamResult(ms, response.ContentType); 

e even a modified FileStreamResult I found here che permette per lo streaming effettivo dell'URL senza la necessità di scaricarlo sul server.

Ho anche usato questo metodo per ottenere i dati di byte da ReadSpeaker:

byte[] audioData; 
using (WebClient client = new WebClient()) 
{ 
    audioData = client.DownloadData("http://tts.readspeaker.com/a/speak?key=[ServiceKey]&lang=en_uk&voice=Female01&audioformat=mp3&volume=200&text=test text 2"); 
} 

E poi una miriade di modi per uscita, ma sempre il risultato è lo stesso, funziona bene su tutto il resto (anche IE7, non con i tag audio, ma ancora) ma non con Samsung 6S.

Non so che mi manca qualcosa di molto semplice qui, perché tutto quello che ho provato funziona bene su tutto il resto, ma sul Samsung 6S nulla. Anche su altri androidi di fascia alta come l'LG G4 funziona ma sul 6S ... niente, il collegamento diretto al servizio in un tag Audio funziona bene?

Quindi so che devo fare qualcosa di sbagliato qui, qualche idea?

+0

La soluzione migliore qui è inserire il violinista (o uno sniffer http simile allo stile proxy) nella catena. È possibile configurare il violinista per ascoltare tutte le porte (non solo localhost) e impostare il proxy su sammy in modo che punti all'ip/port dell'istanza del violinista in esecuzione sul PC. Quindi dovrebbe essere una questione di confrontare le risposte dalla propria azione del controller proxy e l'url originale e vedere dove si trovano le differenze. – spender

+0

Presterei particolare attenzione alle differenze tra qualsiasi cosa relativa alle intestazioni tra le origini. – spender

risposta

Problemi correlati