3

AndroidフォンでSamsungSmartTVでのビデオストリームの再生を制御したい。ビデオストリームへのURLを使用してUPnPコマンドをテレビに送信できます。残念ながら、SamsungTVはローカルネットワークの外部を指すURLを受け入れません。リモートストリームを機能させるには、Samsung TVへのローカル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携帯からメディアプレーヤーにビデオを提供する例はありますか?

ありがとう!!

4

1 に答える 1

2

最初:おい!あなたがSOにいることを知りませんでした!:-)

楽しいものが邪魔にならないように...

あなたの問題は、少なくとも部分的には、サーバーからのHTTP応答全体ではなく、HTTPペイロードのみをコピーしていることだと思います。したがって、200 OK行と必要なヘッダーが欠落しています。これは、見えないものが、または同等のものopenHttpConnection()を使用getInputStream()していることを前提としています。HttpUrlConnection

オプションは次のとおりです。

  • また、結果ストリームを提供する前にgetResponseCode()、、、getResponseMessage()およびから再構築されたヘッダーを提供します。getHeaderFields()

  • HttpUrlConnection手動でHTTPリクエストを行うために使用するrawソケットからの入力を提供するだけに切り替えます。

  • 既存のHTTPリバースプロキシエンジンまたは透過プロキシエンジン(サーブレットに基づくもの、またはネイティブコードに基づくものなど)を見つけて使用します(おそらく、それをデトーリングした後)

于 2012-11-18T18:22:09.710 に答える