NanoHTTPD - 将 https 流转换为 http

NanoHTTPD - convert https stream to http

为了克服 Chromecast 对来自自认证 https 服务器(在我的例子中是 Subsonic 音乐服务器)的流式传输的限制,我已经 运行 使用 NanoHTTPD 服务器的一个实例作为我 Android 应用程序。这个想法是从 Subsonic 服务器 (SSL) 流式传输并将该流连接到新流(非 SSL),以便 NanoHTTP.Response 返回 Chromecast。我有来自 Subsonic 服务器(通过 MediaPlayer 播放)的 InputStream,但不知道如何为以下调用重新传输未加密的流:

new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "audio/mpeg", newStream);

简而言之,如何将 https 加密的音频流即时转换为解密的音频流?

好的,成功完成了所有这些工作。使用 https 的 Subsonic 服务器,可从 Android 访问,Chromecast 使用服务器的自签名证书。如果 https 开启,那么 Android 和 Chromecast 都使用 Android 客户端上的 nanohttpd 代理服务器 运行 流式传输到 Android MediaPlayer 和 html5 音频元素分别。 Android 上的 nanohttpd 服务器 运行 的服务函数覆盖包含以下代码:-

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

我发现启用 mp3 转码的流式 flac 文件给了我 flac 文件大小,当然还有 mp3 流。这证明很难处理 html5 音频元素,因此我恢复为将 &format=raw 添加到流的 Subsonic api 调用中。因此,无论用户通过 https 进行的配置如何,我都会流式传输原始格式,并且到目前为止在测试中一切似乎都运行良好。