2013-10-02 9 views
6

Wie kann ein benutzerdefinierter Empfänger den Namespace "ramp" verwenden oder wie kann ich die Beispielanwendungen für einen benutzerdefinierten Namespace ändern, ohne die Unterstützung für das RAMP-Protokoll neu zu schreiben (MediaProtocolMessageStream in Android oder GCKMediaProtocolMessageStream in iOS)?Wie kann ein benutzerdefinierter Empfänger den Namespace "ramp" verwenden oder kann ich die Beispielanwendungen so ändern, dass ein benutzerdefinierter Namespace verwendet wird, ohne die Unterstützung für RAMP neu schreiben zu müssen?

Ich konnte weder die Android- oder iOS-Chromecast-Beispiel-Apps mit einem benutzerdefinierten Empfänger basierend auf dash.js kommunizieren (die Referenz-Client-Implementierung für die Wiedergabe von MPEG-DASH über Javascript - https://github.com/Dash-Industry-Forum/dash.js). Es scheint, als ob der Namespace von "ramp" auf den Android/iOS Chromecast SDKs hardcoded (final const) ist und der demh.js-Empfänger den Namespace "ramp" aus irgendeinem Grund nicht benutzen kann (per http://www.digitalprimates.net/author/tapper/2013/08/27/chromecast_dash/)

Ich bin in der Lage, MPEG-DASH von einem Javascript-Absender in Chrome gut zu werfen, wenn der Namespace dash.js standardmäßig verwendet. Wenn Sie versuchen, mit meinem benutzerdefinierten Receiver über Android oder iOS zu interagieren, lädt das Chromecast-Gerät die Empfängerseite problemlos, erhält jedoch nie den Ladebefehl mit der Medien-URL. Dies geschieht sogar dann, wenn der benutzerdefinierte Empfänger so eingestellt ist, dass er den Namespace "ramp" verwendet (Standardeinstellung für die Medienwiedergabe). Außerdem funktioniert mein benutzerdefinierter Receiver nicht mehr in Chrome, wenn der Namespace auf "Rampe" eingestellt ist.

+0

Möglicherweise möchten Sie den MPEG-Dash-Code so ändern, dass der Namespace 'ramp' nicht verwendet wird. –

Antwort

4

Es ist bedauerlich, dass der Dash.js-Empfänger den RAMP-Namespace nicht verwenden kann, aber ihre aktuelle Implementierung ist sowieso nicht ganz korrekt RAMP (Sie werden ein paar Dinge auf der Empfängerseite ändern müssen) . Die Dokumentation zu RAMP ist ziemlich knapp und es ist ziemlich frustrierend, dass Google die Quelle für ihre Chromecast-Bibliotheken für iOS und Android nicht veröffentlicht hat. Ich habe jedoch die Android-Bibliothek mit Java Decompiler (http://jd.benow.ca/) dekompiliert, um einige Details zu erfahren. Sie können Ihr Chromecast-Gerät auf der weißen Liste auch im Browser anzeigen und in den Web Sockets sehen, welche Arten von RAMP-Nachrichten gesendet und empfangen werden.

Alles, was Sie in MediaProtocolMessageStream ändern möchten, ist jedoch final, was bedeutet, dass eine perfekte RAMP-Implementierung für Ihren Absender nicht mehr zu erreichen ist. Sie könnten Ihren eigenen MessageStream schreiben, indem Sie den dekompilierten Code als Richtlinie verwenden, aber ich entschied mich dafür, das Reflection-Hacking zu verwenden, um den Namespace in MediaProtocolMessageStream zu erzwingen.

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()); 
     } 
    } 
} 
+0

Vielen Dank! Sie haben mir gerade Stunden Arbeit erspart ... Ich kann nicht glauben, dass Google den Namensraum fest codieren würde – Darussian