Изменить субтитры с помощью CastPlayer - PullRequest
3 голосов
/ 23 апреля 2020

У меня есть прямой эфир 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;
    }
}

1 Ответ

1 голос
/ 02 мая 2020

Вот что я обнаружил:

  1. TrackSelector не может использоваться для CastPlayer.
  2. Все доступные субтитры должны быть доступны / известны до загрузки MediaItems в CastPlayer
  3. Для DefaultMediaReceiver требуется доступная c доступная ссылка на файл * .vtt. Что-то другое не работает (нет .webvtt, ни .m3u8)
  4. Самый простой способ обновить субтитры на ExoPlayer, кажется, это:
        DefaultTrackSelector.ParametersBuilder parametersBuilder = trackSelector.getParameters()
                .buildUpon()
                .setRendererDisabled(getRendererIndex(C.TRACK_TYPE_TEXT), !hasSubtitles);

        if (hasSubtitles) {
            parametersBuilder.setPreferredTextLanguage("en").build();
        }

Где getRendererIndex это :

    public int getRendererIndex(final int trackType) {
        for (int t = 0; t < exoPlayer.getRendererCount(); t++) {
            if (exoPlayer.getRendererType(t) == trackType) {
                return t;
            }
        }

        return -1;
    }
Чтобы выбрать SubTitle на CastPlayer, вы можете использовать RemoteMediaClient
remoteMediaClient.setActiveMediaTracks(selectedSubtitleTracks);

Поэтому мое решение таково:

  1. Перед запуском любого потока (локального или приведения). ) получить всю необходимую мне информацию для MediaItem (url, субтитры, ...)
  2. В зависимости от доступности Cast-Session, я загружаю MediaItems в CastPlayer или ExoPlayer
  3. Пользовательский диалог субтитров дает пользователю возможность выбрать субтитры
  4. Когда пользователь выбирает субтитры, я использую методы, описанные выше, чтобы выбрать субтитры на нужном проигрывателе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...