2013-10-02 6 views
6

Как пользовательский приемник может использовать пространство имен «ramp» или как изменить пример приложений для использования пользовательского пространства имен без повторной записи поддержки (MediaProtocolMessageStream в Android или GCKMediaProtocolMessageStream в iOS) для протокола RAMP?Как пользовательский приемник может использовать пространство имен «ramp» или я могу изменить примеры приложений для использования пользовательского пространства имен без повторной записи поддержки RAMP?

Я не смог сделать приложение для приложений Android или iOS Chromecast для связи с пользовательским ресивером, основанным на dash.js (эталонная реализация клиента для воспроизведения MPEG DASH через Javascript - https://github.com/Dash-Industry-Forum/dash.js). По-видимому, это связано с тем, что пространство имен «рампы» является жестко запрограммированным (final const) на SDK Android/iOS Chromecast, и приемник dash.js по какой-либо причине не может использовать пространство имен «рампы» (за http://www.digitalprimates.net/author/tapper/2013/08/27/chromecast_dash/)

Я могу отличить MPEG-DASH от Javascript-отправителя в Chrome при использовании пространства имен, которое использует dash.js по умолчанию. При попытке взаимодействия с моим пользовательским получателем через Android или iOS устройство Chromecast загружает страницу получателя только отлично, но никогда не получает команду загрузки, содержащую URL-адрес медиа. Это происходит даже тогда, когда пользовательский приемник настроен на использование пространства имен «ramp» (по умолчанию для воспроизведения мультимедиа). Кроме того, мой пользовательский приемник перестает работать в Chrome, когда для пространства имен установлено значение «ramp».

+0

Возможно, вы захотите изменить код MPEG-Dash, чтобы не использовать пространство имён «ramp». –

ответ

4

Прискорбно, что приемник Dash.js не позволит использовать пространство имен RAMP, но их текущая реализация не совсем корректна RAMP в любом случае (вам нужно будет изменить несколько вещей на конце приемника) , Документация по RAMP довольно скудна, и довольно сложно, что Google не выпустил источник для своих библиотек Chromecast для iOS и Android. Тем не менее, я декомпилировал библиотеку Android, используя Java Decompiler (http://jd.benow.ca/), чтобы узнать некоторые детали. Вы также можете открыть свое белое устройство Chromecast в браузере и посмотреть веб-сокеты, чтобы узнать, какие сообщения 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()); 
     } 
    } 
} 
+0

Большое спасибо! Вы просто спасли мне часы работы ... Я не могу поверить, что Google будет жестко кодировать пространство имен – Darussian