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?
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
Zwracałbym szczególną uwagę na różnice między czymkolwiek krzyżowym w nagłówkach. – spender