【问题标题】:Exoplayer changing subtitle on the flyExoplayer 即时更改字幕
【发布时间】:2018-03-03 20:53:13
【问题描述】:

我正在尝试更改 Exoplayer 中视频的字幕。视频可以已经有字幕,或者用户可以从内部存储中添加新字幕。我知道在启动播放器之前,我们可以为字幕和视频创建Mediasource,并使用MergingMediaSource 进行合并。但是,我不确定如何为当前播放的视频替换/添加新字幕?是否可以使用DynamicConcatenatingMediaSource 或任何其他方式这样做?

 MediaSource[] subTitleMediaSources = new MediaSource[uris.length];
        Format subtitleFormat = Format.createTextSampleFormat(
                null,
                MimeTypes.APPLICATION_SUBRIP,
                C.SELECTION_FLAG_DEFAULT,
                null);
        for (int i = 0; i < uris.length; i++) {
            String subTitle = getSubtitleFile(subs, uris[i]);
            if (subTitle != null) {
                subTitleMediaSources[i] = new SingleSampleMediaSource.Factory(mediaDataSourceFactory).
                        createMediaSource(Uri.parse(subTitle), subtitleFormat,
                                          C.TIME_UNSET);
            } else {
                subTitleMediaSources[i] = new SingleSampleMediaSource.Factory(mediaDataSourceFactory).
                        createMediaSource(Uri.parse("dummy"), subtitleFormat, C.TIME_UNSET);
            }
        }

        MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0]
                : new ConcatenatingMediaSource(mediaSources);

        MediaSource subsMediaSource = subTitleMediaSources.length == 1 ? subTitleMediaSources[0]
                : new ConcatenatingMediaSource(subTitleMediaSources);

        MediaSource mergedSource;

        if (subsMediaSource == null) {
            mergedSource = mediaSource;
        } else {
            mergedSource = new MergingMediaSource(mediaSource, subsMediaSource);
        }

【问题讨论】:

  • 我也有类似的问题,只是我必须在运行时放字幕。从输入字段中取字幕,您能给我一些建议吗?

标签: android exoplayer


【解决方案1】:

我能够通过删除Mediasource 并再次添加它来使其工作。我使用了ConcatenatingMediaSource。我认为应该有比这更好/更简单的方法,只需将新的字幕源添加到现有的MergingMediasource。欢迎提出建议。

 public void onSubSelected(String path) {
    final long position = player.getCurrentPosition();

    if (path == null) {
        return;
    }

    List<MediaSource> subtitleSource = new ArrayList<>();
    Uri uri = uris[currentIndex];
    MediaSource trackSource = buildMediaSource(uri);
    List<String> subPaths;
    if (!pathSubtitleMapping.containsKey(uri)) {
        subPaths = new ArrayList<>();
        subPaths.add(path);
        subtitleSource.add(buildSubtitleSource(path));
        pathSubtitleMapping.put(uris[currentIndex], subPaths);
    } else {
        subPaths = pathSubtitleMapping.get(uri);
        if (!subPaths.contains(path)) {
            subPaths.add(path);
        }
        for (String path1 : subPaths) {
            subtitleSource.add(buildSubtitleSource(path1));
        }
    }
    MediaSource mediaSources[] = new MediaSource[subtitleSource.size() + 1];
    mediaSources[0] = trackSource;
    int index = 1;
    for (MediaSource source : subtitleSource) {
        mediaSources[index] = source;
        index++;
    }
    finalMediaSource.removeMediaSource(currentIndex);
    finalMediaSource.addMediaSource(currentIndex, new MergingMediaSource(mediaSources), new Runnable() {
        @Override
        public void run() {
            player.seekTo(currentIndex, position);
        }
    });

}

private Map<Uri, List<String>> pathSubtitleMapping = new HashMap<>(); // (uri, list of subs)

private MediaSource buildMediaSource(Uri uri) {
    MediaSource newSource = new ExtractorMediaSource.Factory(mediaDataSourceFactory).createMediaSource(uri);
    return newSource;

}

private MediaSource buildSubtitleSource(String path) {
    Format subtitleFormat = Format.createTextSampleFormat(
            null,
            MimeTypes.APPLICATION_SUBRIP,
            C.SELECTION_FLAG_DEFAULT,
            null);
    MediaSource mediaSource = new SingleSampleMediaSource.Factory(mediaDataSourceFactory).
            createMediaSource(Uri.parse(path), subtitleFormat, C.TIME_UNSET);
    return mediaSource;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2021-03-10
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多