S

Startrek Player Wiki

Startrek Player

Библиотека предназначена для проигрывания интернет потоков mp3/aac/wav/hls и локальных файлов. Основная часть библиотеки выполнена в виде native модуля, который занимается проигрыванием и содержит два основных класса: StartrekPlayer и StartrekPlayerDelegate

Для обработки web сокет метаданных http://play.melonplayer.com/docs/metadata-socket-api используются классы: StartrekMetadataWatcher и StartrekMetadataWatcherDelegate

Для обработки json метаданных https://hostingradio.ru/mdsabout используются классы: StartrekMetadataUpdater и StartrekMetadataUpdaterDelegate

Собранные библиотеки (.aar для android и .a для iOS) хранятся с использованием git lfs https://git-lfs.github.com/ в репозиториях. Важно после клонирования в случае проблем проверить размер этих файлов. Если размер файлов менее 1КБ, то это не файл а git lfs ссылка на него, и нужно проверить настройки git lfs, после чего обновить состояние репозитория.

При использовании плеера рекомендуется выставить значение statisticaUtmMark для того чтобы плеер отправлял данные о том, из какого приложения он работает. Метка обычно совпадает с идентификатором приложения, например: ru.radioplayer.ios Метка statisticaUtmMark (если она задана) переопределяет query параметр radiostatistica указанный в ссылке на поток.

История изменений

Changelog

iOS версия

https://gitlab.hostingradio.ru/public-projects/startrek-radio-ios

xcframework файл копируется и подключается в проект: General → Frameworks, Libraries, and Embedded Content Дополнительно нужно сделать следующие настройки:

  1. Подключить зависимые системные framework к проекту: Accelerate.framework, AudioToolbox.framework, AVFoundation.framework, CFNetwork.framework, CoreServices.framework, GSS.framework, SystemConfiguration.framework
  2. Отключить bitcode: Build Setting → Build Options → Enable Bitcode = No
  3. Добавить флаги линковки: Build Setting → Linking → Other Linker Flags = -lc++ -lz
  4. Добавить Capabilities → Background Modes → Audio, Air Play, and Picture in Picture в проект
  5. При использовании Swift нужно указать Objective C Bridging Header → Frameworks/StartrekPlayer.xcframework/ios-arm64/Headers/STStartrekPlayer-Bridging-Header.h
  6. StartrekPlayer.xcframework с библиотеками формата .а нужно подключать с флагом "Do not embed" для того чтобы необходимые функции были вкомпилированы в результирующий бинарный файл - программу. При использовании "Embed and sign" архив .a будет добавлен целиком в bundle. Это не соответствует требованиям apple (статические библиотеки не должны поставляться в результирующем bundle архиве) и увеличивает размер установочного пакета для конечного пользователя.
  7. bass.xcframework, basshls.xcframework и bassopus.xcframework нужно подключить с флагом "Embed and sign" это динамические фреймворки.

StartrekPlayer.xcframework содержит статические *.a библиотеки для двух архитектур arm64 и x86_64 + заголовочные файлы. Библиотеки *.a содержат отладочные символы, поэтому изначально имеют большой размер. Xcode при сборке их автоматически очищает и в release версию они не попадают, что уменьшает размер конечного приложения. При использовании crashlytics отладочные символы всего проекта нужно отправлять в firebase. Символы из подключенных библиотек автоматически собираются и отправляются, без дополнительных настроек. Подробнее https://firebase.google.com/docs/crashlytics/get-started?platform=ios

Android версия

https://gitlab.hostingradio.ru/public-projects/startrek-radio-android

AAR файл копируется в папку libs проекта и подключается как обычная библиотека.

implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

AAR файл содержит C++ ndk библиотеки *.so с отладочными символами. Важно проконтролировать следущие настройки:

  1. Relase версия apk или aab должна включать в себя библиотеку с stripped native symbols. (По умолчанию android studio именно так и делает.) За счет того, что в release сборке нет отладочных символов конечны размер приложения становится меньше.
  2. При использовании google play crash reports нужно загрузить отладочные символы для библиотеки в google play console. Это требуется, для того чтобы Crash reports в google play console содержали полную информацию о стэке вызовов плеера при возникновении ошибки. Подробнее https://support.google.com/googleplay/android-developer/answer/9848633
  3. При использовании crashlytics нужно так же включить ndk crashlytics report и отправить native debug symbols в crashlytics при сборке. Это позволит просматривать полный стэк вызовов внутри библиотеки плеера при какой-либо ошибке. Подробнее https://firebase.google.com/docs/crashlytics/ndk-reports

Для правильной работы ssl (https) требуется указать при сборке проекта в build.gradle:

packagingOptions.jniLibs.useLegacyPackaging true

Эта опция (useLegacyPackaging) указывает на обязательную распаковку native библиотек при установке приложения, что необходимо для их динамической подгрузки ssl плагином. Кроме этого, для того чтобы подключить распакованные библиотеки к плееру необходимо вызвать код инициализации (это нужно сделать сразу и один раз при инициализации приложения, до момента создания объекта плеера и вызова других функций библиотеки).

// Init TLS (https support)
StartrekAndroid.initTLS(getApplicationContext());

Для использования плеера в Service классе требуется:

  1. Подключить native библиотеку
  2. Указать packagingOptions.jniLibs.useLegacyPackaging true в build gradle
  3. Инициализировать TLS для настройки https. StartrekAndroid.initTLS(getApplicationContext());
  4. Создать идентификатор аудиосессии и передать его в плеер
  5. Создать плеер (обязательно после настройки https и аудиосессии)
public class RadioService extends MediaBrowserServiceCompat {
    static {
        System.loadLibrary("StartrekPlayerNative" + StartrekAndroid.PREFERRED_ABI);
    }

    protected StartrekPlayer m_player = null;

    @Override
    public void onCreate() {
        super.onCreate();

        // Init TLS (https support)
        StartrekAndroid.initTLS(getApplicationContext());

        // Disable player log messages
        StartrekPlayer.disableLogging();

        // Set audio session id
        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        int sid = audioManager.generateAudioSessionId();
        StartrekAndroid.setAudioSessionId(sid);

        // Create player
        m_player = StartrekPlayer.create();
    }
}

Описание классов

StartrekPlayerState

StartrekPlayerQuality

StartrekMetadataSubscriptionType

StartrekMetadataFetchType

StartrekMetadata

StartrekNetwork

StartrekMetadataWatcherDelegate

StartrekMetadataWatcher

StartrekMetadataUpdaterDelegate

StartrekMetadataUpdater

StartrekPlayerDelegate

StartrekPlayer

StartrekAndroid