У меня есть прямой эфир HLS, который представлен URI, указывающим на файл манифеста. Файл манифеста дополнительно определяет субтитры.
При использовании ExoPlayer я могу использовать TrackSelector, присоединить его к ExoPlayer, и у меня есть возможность показать доступные субтитры пользователю (и изменить его с помощью TrackSelector).
Я хочу сделать то же самое только с CastPlayer. Вот самое простое из возможных действий, которое я могу себе представить:
public class PlayerActivity extends AppCompatActivity implements SessionAvailabilityListener {
private MediaRouteButton castButton;
private CastPlayer castPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.player_activity);
castButton = findViewById(R.id.castButton);
CastButtonFactory.setUpMediaRouteButton(this, castButton);
CastContext castContext = CastContext.getSharedInstance(this);
castPlayer = new CastPlayer(castContext);
castPlayer.setSessionAvailabilityListener(this);
}
@Override
public void onCastSessionAvailable() {
MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
MediaInfo mediaInfo = new MediaInfo.Builder("https://myuri.ch/video.m3u8")
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setMetadata(movieMetadata)
.build();
MediaQueueItem mediaItem = new MediaQueueItem.Builder(mediaInfo).build();
castPlayer.loadItems(new MediaQueueItem[]{mediaItem}, 0, 0, Player.REPEAT_MODE_OFF);
}
@Override
public void onCastSessionUnavailable() {
}
}
Макет выглядит следующим образом:
<androidx.mediarouter.app.MediaRouteButton
android:id="@+id/castButton"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</androidx.mediarouter.app.MediaRouteButton>
Это действие запускается, и когда я нажимаю CastButton, оно передает mov ie за "https://myuri.ch/video.m3u8" до литого устройства. Отлично работает:)
Но я не могу понять, как разрешить пользователю выбирать субтитры из моего приложения. Какова идея о том, как мы должны реализовать нечто подобное?
Очки, которые я уже выяснил:
- Я не могу прикрепить что-то вроде TrackSelector к CastPlayer
- В документации говорится, что мы можем предоставить MediaTracks для MediaInfo-Object. Но у меня нет этой информации, соответственно она скрыта в файле m3u8.
В качестве дополнительной информации мои CastOptions выглядят следующим образом:
public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context appContext) {
return new CastOptions.Builder()
.setReceiverApplicationId(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)
.build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context context) {
return null;
}
}