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, после чего обновить состояние репозитория.
История изменений
iOS версия
https://gitlab.hostingradio.ru/public-projects/startrek-radio-ios
xcframework файл копируется и подключается в проект: General → Frameworks, Libraries, and Embedded Content Дополнительно нужно сделать следующие настройки:
- Подключить зависимые системные framework к проекту: Accelerate.framework, AudioToolbox.framework, AVFoundation.framework, CFNetwork.framework, CoreServices.framework, GSS.framework, SystemConfiguration.framework
- Отключить bitcode: Build Setting → Build Options → Enable Bitcode = No
- Добавить флаги линковки: Build Setting → Linking → Other Linker Flags = -lc++ -lz
- Добавить Capabilities → Background Modes → Audio, Air Play, and Picture in Picture в проект
- При использовании Swift нужно указать Objective C Bridging Header → Frameworks/StartrekPlayer.xcframework/ios-arm64/Headers/STStartrekPlayer-Bridging-Header.h
- xcframework с библиотеками формата .а нужно подключать с флагом "Do not embed" для того чтобы необходимые функции были вкомпилированы в результирующий бинарный файл - программу. При использовании "Embed and sign" архив .a будет добавлен целиком в bundle. Это не соответствует требованиям apple (статические библиотеки не должны поставляться в результирующем bundle архиве) и увеличивает размер установочного пакета для конечного пользователя.
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 с отладочными символами. Важно проконтролировать следущие настройки:
- Relase версия apk или aab должна включать в себя библиотеку с stripped native symbols. (По умолчанию android studio именно так и делает.) За счет того, что в release сборке нет отладочных символов конечны размер приложения становится меньше.
- При использовании google play crash reports нужно загрузить отладочные символы для библиотеки в google play console. Это требуется, для того чтобы Crash reports в google play console содержали полную информацию о стэке вызовов плеера при возникновении ошибки. Подробнее https://support.google.com/googleplay/android-developer/answer/9848633
- При использовании 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 классе требуется:
- Подключить native библиотеку
- Указать packagingOptions.jniLibs.useLegacyPackaging true в build gradle
- Инициализировать TLS для настройки https. StartrekAndroid.initTLS(getApplicationContext());
- Создать идентификатор аудиосессии и передать его в плеер
- Создать плеер (обязательно после настройки 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();
}
}
Описание классов
StartrekMetadataSubscriptionType
StartrekMetadataWatcherDelegate