2012-11-18 63 views
3

我想讓Android手機控制三星智能電視上的視頻流回放。我可以通過URL向視頻流發送UPnP命令到電視。不幸的是,三星電視不接受指向本地網絡之外的URL。爲了使遠程流正常工作,我必須通過手機循環流量,使其看起來像是三星電視的本地URL。通過Android手機路由視頻流量流量

我可能必須在手機上運行一個簡單的代理服務器類型。手機總是知道流的URL是什麼,所以代理可以非常簡單,它總是接收任何傳入請求並將其傳送到外部服務器上的視頻流。

我試過運行一個套接字連接,並簡單地將輸入strem從外部服務器複製到套接字服務器連接的輸出流。雖然使用這個網頁瀏覽器可以下載文件,但所有的元數據都會丟失,並且每次文件下載完成後,我似乎也會收到損壞的管道異常。媒體播放器似乎完全不瞭解流,並且例如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手機向媒體播放器提供視頻的示例我可以使用它來了解如何正確設置響應流的格式?

謝謝!

+0

*「不幸的是,三星電視唐不接受指向本地網絡之外的URL「*。這恐怕不是三星本身的錯,但是我擔心整個UPnP的設計限制。 –

+0

談論元數據迷失:什麼是原始數據源?它是否符合UPnP標準?不管你傳遞的是多麼巧妙,UPnP元數據都不是流URL的一部分。但你已經有某個地方的網址......我很困惑。 –

回答

2

第一:老兄!不知道你在這裏! :-)

隨着寒暄閃開......

我猜測你的問題,至少部分是,你只能複製HTTP有效載荷,而不是從整個HTTP響應服務器。因此,您錯過了200 OK行和任何必需的標題。這假定未看到的openHttpConnection()HttpUrlConnection上使用getInputStream()或等效。

選項包括:

  • 還可用作getResponseCode()getResponseMessage(),和頭從getHeaderFields()重建,服務於這一結果流之前。

  • HttpUrlConnection切換到僅用於手動發出HTTP請求的原始套接字的服務輸入。

  • 查找和使用現有的HTTP和反向代理引擎或透明代理的發動機,如one based off of a servlet,或者one based on native code(後去的Tor-ING它,也許)

+0

謝謝馬克!我認爲這是我的解決方案。我快到了 :) – Juhani