6

RAMP プロトコルのサポート (Android の MediaProtocolMessageStream または iOS の GCKMediaProtocolMessageStream ) を書き直すことなく、カスタム レシーバーが "ramp" 名前空間を使用する方法、またはサンプル アプリを変更してカスタム名前空間を使用する方法を教えてください。

Android または iOS の Chromecast サンプル アプリを、dash.js に基づくカスタム レシーバーと通信させることができませんでした (Javascript を介して MPEG DASH を再生するための参照クライアント実装 - https://github.com/Dash-Industry-フォーラム/dash.js )。これは、Android / iOS Chromecast SDK で「ramp」の名前空間がハードコードされている ( final const ) ことと、dash.js レシーバーが何らかの理由で「ramp」の名前空間を使用できないことが原因のようです ( http:// www.digitalprimates.net/author/tapper/2013/08/27/chromecast_dash/ )

デフォルトでdash.jsが使用する名前空間を使用すると、ChromeのJavascript送信者からMPEG-DASHをうまくキャストできます。Android または iOS を介してカスタム レシーバーとやり取りしようとすると、Chromecast デバイスはレシーバー ページを正常にロードしますが、メディア URL を含むロード コマンドを受け取りません。これは、カスタム レシーバーが "ramp" (メディア再生の既定値) の名前空間を使用するように設定されている場合にも発生します。さらに、名前空間が "ramp" に設定されていると、カスタム レシーバーが Chrome で動作しなくなります。

4

1 に答える 1

4

残念なことに、Dash.js レシーバーでは RAMP 名前空間を使用できませんが、現在の実装はいずれにしても正しい RAMP ではありません (レシーバー側でいくつか変更する必要があります)。RAMP に関するドキュメントはかなり不足しており、Google が iOS および Android 用の Chromecast ライブラリのソースをリリースしていないのはかなり苛立たしいことです。ただし、Java Decompiler ( http://jd.benow.ca/ ) を使用して Android ライブラリを逆コンパイルし、詳細を確認しました。ホワイトリストに登録された Chromecast デバイスをブラウザで起動し、Web ソケットを監視して、送受信している RAMP メッセージの種類を確認することもできます。

ただし、MediaProtocolMessageStream で変更したいものはすべて最終的なものです。つまり、送信者にとって完璧な RAMP 実装は、あなたの手の届かないところにあります。ガイダンスとして逆コンパイルされたコードを使用して独自の MessageStream を作成することもできますが、リフレクション ハッキングを使用して、MediaProtocolMessageStream の名前空間を強制的に変更することにしました。

public class CustomMediaProtocolMessageStream extends MediaProtocolMessageStream {

    private static final String NAMESPACE = "org.dashif.dashjs";

    public CustomMediaProtocolMessageStream() {
        super();
        // Hack Google's hardcoded namespace which doesn't work with the DASH receiver.
        try {
            // This is the field where MessageStream stores the namespace.  If you decompile the jar you can see it's named 'b'.
            Field field = MessageStream.class.getDeclaredField("b");
            field.setAccessible(true);
            field.set(this, NAMESPACE);
        } catch (Exception e) {
            Log.e(TAG, "problem changing namespace:" + e.getMessage());
        }
    }
}
于 2013-10-28T17:59:02.793 に答える