Как пользовательский приемник может использовать пространство имен ramp, или я могу изменить примеры приложений, чтобы использовать пользовательское пространство имен, не переписывая поддержку RAMP?

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

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

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


person James Bobowski    schedule 02.10.2013    source источник
comment
Возможно, вы захотите изменить код MPEG-Dash, чтобы не использовать пространство имен ramp.   -  person Les Vogel - Google DevRel    schedule 26.10.2013


Ответы (1)


К сожалению, получатель 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());
        }
    }
}
person ActiveApathy    schedule 28.10.2013
comment
Большое спасибо! Вы только что сэкономили мне часы работы ... Я не могу поверить, что Google жестко закодировал пространство имен - person Darussian; 22.11.2013