как интегрировать субтитры с exoplayer android

Я использую Exoplayer для воспроизведения разных типов видео, я скачал эту демоверсию и работаю с ней.

https://github.com/google/ExoPlayer

теперь мне нужно добавить субтитры для моего видео, я использую ExoPlayer версии 2.9.5

это метод, который создает медиа-источник

private MediaSource buildMediaSource(Uri uri, @Nullable String overrideExtension) {
    @ContentType int type = Util.inferContentType(uri, overrideExtension);
    switch (type) {
      case C.TYPE_DASH:
        return new DashMediaSource.Factory(dataSourceFactory)
            .setManifestParser(
                new FilteringManifestParser<>(new DashManifestParser(), getOfflineStreamKeys(uri)))
            .createMediaSource(uri);
      case C.TYPE_SS:
        return new SsMediaSource.Factory(dataSourceFactory)
            .setManifestParser(
                new FilteringManifestParser<>(new SsManifestParser(), getOfflineStreamKeys(uri)))
            .createMediaSource(uri);
      case C.TYPE_HLS:
        return new HlsMediaSource.Factory(dataSourceFactory)
            .setPlaylistParserFactory(
                new DefaultHlsPlaylistParserFactory(getOfflineStreamKeys(uri)))
            .createMediaSource(uri);
      case C.TYPE_OTHER:
        return new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
      default: {
        throw new IllegalStateException("Unsupported type: " + type);
      }
    }
  }

Я думаю, это то место, которое следует изменить, чтобы добавить субтитры к моему медиафайлу, но я не знаю, как это сделать?

также субтитры будут с сервера и в формате .str

кто-нибудь может помочь, пожалуйста?

вот мой обновленный код

private MediaSource buildMediaSourceWithSubtitle (Uri uri, @Nullable String overrideExtension, Uri subtitle) {

    Format subtitleFormat = Format.createTextSampleFormat(
            null, // An identifier for the track. May be null.
            MimeTypes.APPLICATION_SUBRIP, // The mime type. Must be set correctly.
            0, // Selection flags for the track.
            null); // The subtitle language. May be null.
    MediaSource subtitleSource =
            new SingleSampleMediaSource.Factory(dataSourceFactory)
        .createMediaSource(subtitle, subtitleFormat, C.TIME_UNSET);

    MediaSource mediaSource = null;

    @ContentType int type = Util.inferContentType(uri, overrideExtension);
    switch (type) {
      case C.TYPE_DASH:
        mediaSource = new DashMediaSource.Factory(dataSourceFactory)
                .setManifestParser(
                        new FilteringManifestParser<>(new DashManifestParser(), getOfflineStreamKeys(uri)))
                .createMediaSource(uri);

        return new MergingMediaSource(mediaSource, subtitleSource);

      case C.TYPE_SS:
        mediaSource = new SsMediaSource.Factory(dataSourceFactory)
                .setManifestParser(
                        new FilteringManifestParser<>(new SsManifestParser(), getOfflineStreamKeys(uri)))
                .createMediaSource(uri);
        return new MergingMediaSource(mediaSource, subtitleSource);

      case C.TYPE_HLS:
        mediaSource = new HlsMediaSource.Factory(dataSourceFactory)
                .setPlaylistParserFactory(
                        new DefaultHlsPlaylistParserFactory(getOfflineStreamKeys(uri)))
                .createMediaSource(uri);
        return new MergingMediaSource(mediaSource, subtitleSource);

      case C.TYPE_OTHER:
        mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
        return new MergingMediaSource(mediaSource, subtitleSource);
      default: {
        throw new IllegalStateException("Unsupported type: " + type);
      }
    }
  }

введите здесь описание изображения


person Amira Elsayed Ismail    schedule 17.02.2019    source источник
comment
Итак, вы не нашли это: google.github. io/ExoPlayer/   -  person Morrison Chang    schedule 18.02.2019
comment
Вы можете воспроизвести MKV видеофайлы? Если да, то можно ли поделиться своим кодом?   -  person sanoj lawrence    schedule 08.08.2020


Ответы (1)


Это действительно зависит от того, загружаете ли вы субтитры сбоку или они встроены в ваш поток. Если они встроены, HLS, Dash или другие медиаисточники обнаружат дорожки, и вам нужно будет выбрать текстовую дорожку. См. Пример SimpleExoPlayer

Если у вас боковая загрузка, вам нужно использовать SingleSampleMediaSource и Объединение медиаисточников. Сначала получите источники видео/аудио, затем создайте SingleSampleMediaSource из srt и объедините их с помощью MergingMediaSource Пример. Как только это будет сделано, выберите текстовую дорожку, как указано выше.

person Ge3ng    schedule 18.02.2019
comment
пожалуйста, проверьте мое редактирование, я следую приведенному вами примеру, но это не работает - person Amira Elsayed Ismail; 21.02.2019
comment
пожалуйста, проверьте скриншот - person Amira Elsayed Ismail; 21.02.2019
comment
это URL-адрес моего файла: github.com/amiraelsayed/cv/blob/ master/subtitle.srt , это просто тестовый файл - person Amira Elsayed Ismail; 21.02.2019