通过安卓手机路由视频流量

3
我希望有一部安卓手机来控制三星智能电视上的视频流播放,我可以通过UPnP命令向电视发送指向视频流的URL。不幸的是,三星电视不接受指向本地网络以外的URL。为了使远程流起作用,我必须将流量通过我的手机循环,这样它看起来像是三星电视的本地URL。
我可能需要在手机上运行一个简单的代理服务器。手机总是知道流URL,因此代理可以非常简单,始终接收任何传入请求并将其导向外部服务器上的视频流。
我尝试运行套接字连接,并简单地将外部服务器的输入流复制到套接字服务器连接的输出流中。虽然使用此方法,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手机向媒体播放器提供视频服务的示例,我可以用来了解如何正确格式化响应流?

谢谢!


很遗憾,三星电视不接受指向本地网络之外的URL。这并不是三星的错,而是UPnP的设计限制,我很抱歉。 - Pavel Zdenek
谈论元数据丢失的问题:原始数据源是什么?它是否符合UPnP DMS标准?UPnP元数据并不是流URL的一部分,无论你如何聪明地传递它。但是你已经从某个地方获得了URL...我感到困惑。 - Pavel Zdenek
1个回答

2
首先:老兄!没想到你也在SO上!:-)
客套话说完了...
我猜你的问题至少部分在于你只复制了HTTP payload,而没有复制从服务器返回的整个HTTP响应。因此,你错过了200 OK行以及任何必要的头部信息。这假设未见openHttpConnection()正在使用getInputStream()在HttpUrlConnection上,或等效方法。
选项包括:
  • 在提供结果流之前,还要提供getResponseCode()getResponseMessage()和从getHeaderFields()重构的头文件。

  • HttpUrlConnection切换到仅从原始套接字中提供输入,您可以手动进行HTTP请求。

  • 查找并使用现有的HTTP反向代理引擎或透明代理引擎,例如基于servlet的引擎,或者可能是基于本地代码的引擎(也许在去除Tor之后)


谢谢Mark!我觉得这正引导我找到解决方案。我快要成功了 :) - Juhani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接