通过Android手机路由视频流量

时间:2012-11-18 17:50:17

标签: android video streaming upnp dlna

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

我可能必须在手机上运行一个简单的代理服务器类型。手机总是知道流URL是什么,所以代理可以非常简单,总是接收任何传入请求并将其传送到外部服务器上的视频流。

我尝试运行套接字连接,只是将输入strem从外部服务器复制到套接字服务器连接的输出流。使用此功能时,Web浏览器可以下载该文件,但所有元数据都丢失了,每次文件下载完成后,我似乎也会遇到损坏的管道异常。媒体播放器似乎根本不理解流,例如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手机向媒体播放器提供视频的示例我可以用来了解如何正确格式化响应流?

谢谢!

1 个答案:

答案 0 :(得分:2)

第一:伙计!不知道你在这儿! : - )

随着欢呼声......

我猜你的问题,至少在某种程度上,是你只是复制HTTP有效负载,而不是来自服务器的整个HTTP响应。因此,您缺少200 OK行和任何必需的标题。这假设看不见的openHttpConnection()getInputStream()上使用HttpUrlConnection或等效。

选项包括:

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

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

  • 查找并使用现有的HTTP反向代理引擎或透明代理引擎,例如one based off of a servlet,或者one based on native code(可能在解除它之后)