侧载字幕在ExoPlayer中不起作用

时间:2019-02-21 01:59:54

标签: android exoplayer exoplayer2.x

我正在尝试将字幕文件与视频一起加载,但无法正常工作。

代码:

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

    Format subtitleFormat = Format.createTextSampleFormat(null, MimeTypes.APPLICATION_SUBRIP, 0, 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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

MediaSource videoSource = new ExtractorMediaSource(
        videoUri,
        dataSourceFactory,
        new DefaultExtractorsFactory(),
        null,
        null);
Format subtitleFormat = Format.createTextSampleFormat(
        null,
        MimeTypes.APPLICATION_SUBRIP,
        C.SelectionFlags,
        "en");
MediaSource textMediaSource = new SingleSampleMediaSource(
    Uri.parse("http://www.storiesinflight.com/js_videosub/jellies.srt"),
    dataSourceFactory,
    subtitleFormat,
    C.TIME_UNSET);
source = new MergingMediaSource(videoSource, textMediaSource); // to be used later


// nested to some class that has SubtitleView as member
class SomeListener implements ..., TextRenderer.Output, ... {
    ...
        // this function doesn't seem to be invoked
    public void onCues(List cues) {
        // some logging here
        if (subtitleView != null) {
        subtitleView.onCues(cues);
        }
    }
    ...
}

player.setTextOutput(listener);
...
// later, play the video assuming its prepared and whatnot
player.setPlayWhenReady(true);