3

我想要一部 Android 手机来控制三星智能电视上的视频流播放。我可以通过视频流的 URL 向电视发送 UPnP 命令。不幸的是,三星电视不接受指向本地网络之外的 URL。为了使远程流工作,我必须通过我的手机循环流量,这样它看起来就像是三星电视的本地 URL。

我可能必须在手机上运行一个简单的代理类型的服务器。电话始终知道流 URL 是什么,因此代理可以非常简单,它始终接收任何传入请求并将其通过管道传输到外部服务器上的视频流。

我尝试过运行套接字连接并简单地将输入流从外部服务器复制到套接字服务器连接的输出流。虽然使用这个网络浏览器能够下载文件,但所有元数据都丢失了,而且每次文件下载完成时我似乎也遇到了一个损坏的管道异常。媒体播放器似乎根本不理解流,例如在 VLC 上没有播放。

对于服务器,我使用了一段非常简单的代码,如下所示:

    public class ServerThread implements Runnable {

    public void run() {
        try {
            if (SERVERIP != null) {

                serverSocket = new ServerSocket(SERVERPORT);

                while (true) {
                    // listen for incoming clients
                    Socket client = serverSocket.accept();
                    client.setSoTimeout(20000);
                    client.setKeepAlive(true);


                    OutputStream os = client.getOutputStream();

                    OutputStream out = new BufferedOutputStream(os);


                    InputStream is = openHttpConnection("<URL to the stream>");

                    copyStream(is, out);

对于复制流代码:

    private static void copyStream(InputStream input, OutputStream output)
        throws IOException {
    int bytesRead;
    try {
        while ((bytesRead = input.read()) != -1) {
            output.write(bytesRead);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    output.flush();
    output.close();
    input.close();
}

我可以做些什么来简单地将所有元数据转发到套接字连接吗?还是我也做错了什么?

是否有任何从 Android 手机向媒体播放器提供视频的示例,我可以使用它来了解如何正确格式化响应流?

谢谢!!

4

1 回答 1

2

第一:哥们!不知道你在这里!:-)

随着寒暄的结束...

我猜你的问题,至少部分是,你只是在复制 HTTP 有效负载,而不是来自服务器的整个 HTTP 响应。因此,您缺少该200 OK行和任何必要的标题。这假设 unseenopenHttpConnection()正在使用getInputStream()aHttpUrlConnection或等价物。

选项包括:

  • 在提供结果流之前,还要服务getResponseCode()getResponseMessage()和从 重建的标头。getHeaderFields()

  • HttpUrlConnection从用于手动发出 HTTP 请求的原始套接字切换到仅提供输入。

  • 查找并使用现有的 HTTP 反向代理引擎或透明代理引擎,例如一个基于 servlet 的引擎,或者一个基于本机代码的引擎(可能在对其进行 de-Tor 处理之后)

于 2012-11-18T18:22:09.710 回答