2017-03-06 3 views
2

Um Chromecast's Streaming-Beschränkung von selbst zertifizierten https-Servern (in meinem Fall dem Subsonic-Musikserver) zu umgehen, verwende ich eine Instanz des NanoHTTPD-Servers, der bereits als Teil meiner Android-App läuft. Die Idee ist, vom Subsonic Server (SSL) zu streamen und diesen Stream mit einem neuen Stream (nicht SSL) für die NanoHTTP.Response zurück zu Chromecast zu verbinden. Ich habe den InputStream von dem Subsonic-Server funktioniert (der über den MediaPlayer abspielt), aber nicht wissen, wie unverschlüsselt für den folgenden Anruf erneut streamen:


Also in kurzen Worten, wie konvertiere ich eine HTTPS-verschlüsselte Audio zu einem entschlüsselten Audiostream während der Übertragung streamen?NanoHTTPD - https stream in http konvertieren

Antwort

0

Ok, geschafft, das alles funktioniert zu bekommen. Subsonic-Server mit https, auf den von Android und Chromecast mit dem selbstsignierten Zertifikat des Servers zugegriffen werden kann. Wenn https aktiviert ist, verwenden sowohl Android als auch Chromecast einen nanohttpd-Proxyserver, der auf dem Android-Client ausgeführt wird, um den Android MediaPlayer bzw. das html5-Audioelement zu streamen. Die Funktion Überschreibung der nanohttpd Server dienen auf Android läuft enthält den folgenden Code: -

int filesize = .... obtained from Subsonic server for the track to be played 

// establish the https connection using the self-signed certificate 
// placed in the Android assets folder (code not shown here) 
HttpURLConnection con = _getConnection(subsonic_url,"subsonic.cer") 

// Establish the InputStream from the Subsonic server and 
// the Piped Streams for re-serving the unencrypted data 
// back to the requestor 
final InputStream is = con.getInputStream(); 
PipedInputStream sink = new PipedInputStream(); 
final PipedOutputStream source = new PipedOutputStream(sink); 

// On a separate thread, read from Subsonic and write to the pipe 
Thread t = new Thread(new Runnable() { 
       public void run() { 
        try { 
         byte[] b = new byte[1024]; 
         int len; 
         while ((len = is.read(b,0,1024)) != -1) 
          source.write(b, 0, len); 
         source.flush(); 
        } 
        catch (IOException e) { 
        } 
       }}); 

t.start(); 
sleep(200); // just to let the PipedOutputStream start up 

// Return the PipedInputStream to the requestor. 
// Important to have the filesize argument 
return new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, 
           "audio/mpeg", sink, filesize); 

Ich fand, dass auf Streaming-flac-Dateien mit MP3-Transcodierungs gab mir die flac Dateigröße, aber natürlich den MP3-Stream. Dies stellte sich als schwierig für das html5-Audioelement heraus, so dass ich zu dem subsonic api-Aufruf für den Stream wieder & format = raw hinzufügte. Also unabhängig von der Benutzerkonfiguration über https streame ich das Raw-Format und alles scheint bisher gut zu funktionieren.

+0

Als Ben Baron hier darauf hingewiesen, ... https://groups.google.com/forum/#!topic/subsonic-app-developers/xpB14ZgZ75I I 'estimateContentLength = true' im Stream Aufruf verwenden kann, um Haben Sie den Inhaltsheader die transcodierte Größe, um zu vermeiden, das unformatierte Format zu verwenden – milleph