【问题标题】:how to integrate subtitle with exoplayer android如何将字幕与exoplayer android集成
【发布时间】:2019-02-17 23:18:19
【问题描述】:

我正在使用 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);
      }
    }
  }

【问题讨论】:

标签: android exoplayer subtitle exoplayer2.x


【解决方案1】:

这实际上取决于您是侧加载字幕还是将它们嵌入到您的流中。如果它们是嵌入的,HLS、Dash 或其他媒体源将检测轨道,您将需要选择文本轨道。见SimpleExoPlayer example

如果您是侧载,则需要使用SingleSampleMediaSourceMergingMediaSource。首先获取您的视频/音频源,然后从 srt 创建一个 SingleSampleMediaSource 并使用 MergingMediaSource Example 合并两者。完成后,选择上面的文本轨道。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多