2015-12-15 12 views
15

Muszę korzystać z SaaS TTS (Text To Speak) od ReadSpeaker w celu dodania dźwięku do aplikacji, którą właśnie rozwijam.Strumieniowe przesyłanie plików MP3 w C# .NET 4.5.1 MVC 5.2.2 na Samsunga 6S

Podstawowe konto SCAPI, z którego obecnie korzystamy, ma podstawową konfigurację: wystarczy ustawić adres URL i odzyskać strumień MP3, który musimy wydrukować. Ponieważ klucz usługi znajduje się w adresie URL, nie możemy go używać z przodu, więc musimy przesyłać strumieniowo pliki przez nasze serwery.

Wszystko działało dobrze, dopóki nie przetestowałem kodu rozwojowego w Samsungu 6S. Gdzie nie grać w ogóle, jednak usługi własny link działa to działa:

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

natomiast dokładnie ten sam kod przez nasze serwery nie robi na Samsung 6S z tego samego łącza jako źródła strumienia w kontrolerze.

Przeszedłem kilka różnych sposobów przesyłania strumieniowego pliku na serwerze, ale po prostu spadł płasko za każdym razem w Samsung 6S (zupełnie nowy z pudełka bez modów).

Oto kod, którego użyłem.

Odpada kontroler:

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

Standardowy FileStreamResult gdzie biorę powyższy kod w MemoryStream i wysłać przez to znaczy ze sterownikiem FileStreamResult zamiast ustawiać nagłówki ręcznie:

return new FileStreamResult(ms, response.ContentType); 

i even a modified FileStreamResult I found here który pozwala dla rzeczywistego przesyłania adresu URL bez konieczności pobierania go na serwer.

Ja również stosować tę metodę, aby uzyskać dane bajt z 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"); 
} 

A potem mnóstwo sposobów na wyjście, ale zawsze wynik jest taki sam, działa dobrze na wszystko inne (nawet IE7, nie z tagami dźwiękowymi, ale nadal), ale nie z Samsung 6S.

Nie wiem, że brakuje mi czegoś bardzo prostego, ponieważ wszystko, co wypróbowałem, działa dobrze na wszystkim, ale na Samsungu 6S nic. Nawet na innych high-endowych androidach, takich jak LG G4 to działa, ale na 6S ... nic, jet bezpośrednie łącze serwisowe w tagu Audio działa dobrze?

Więc wiem, że muszę robić coś złego tutaj, jakieś pomysły?

+0

Najlepszym rozwiązaniem jest wstawienie do łańcucha skrzypka (lub podobnego scyffera http w stylu proxy). Możesz skonfigurować skrzypce do słuchania wszystkich portów (nie tylko localhost) i ustawić proxy na sammy, aby wskazywało na port ip/instancji skrzypka uruchomionej na komputerze. Wtedy powinno być sprawą porównania odpowiedzi z własnej akcji kontrolera proxy i oryginalnego adresu URL oraz sprawdzenia, gdzie znajdują się różnice. – spender

+0

Zwracałbym szczególną uwagę na różnice między czymkolwiek krzyżowym w nagłówkach. – spender

Odpowiedz

Powiązane problemy