自定义接收器如何使用“ramp”命名空间,或者我可以修改示例应用程序以使用自定义命名空间而无需重写RAMP支持?

时间:2013-10-02 21:14:49

标签: google-cast chromecast

自定义接收器如何使用“ramp”命名空间,或者如何修改示例应用程序以使用自定义命名空间而无需为RAMP协议重写支持(Android中的MediaProtocolMessageStream或iOS中的GCKMediaProtocolMessageStream)?

我无法让Android或iOS Chromecast示例应用与基于dash.js的自定义接收器进行通信(通过Javascript播放MPEG DASH的参考客户端实现 - https://github.com/Dash-Industry-Forum/dash.js)。这似乎是由于Android / iOS Chromecast SDK上的“ramp”命名空间被硬编码(最终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中工作。

1 个答案:

答案 0 :(得分:4)

不幸的是,Dash.js接收器不会让你使用RAMP名称空间,但是他们当前的实现方式并不是完全正确的RAMP(你将不得不改变接收器端的一些东西)。有关RAMP的文档非常缺乏,谷歌尚未发布适用于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());
        }
    }
}