侧载字幕在 ExoPlayer 中不起作用

Sideload subtitle not working in ExoPlayer

我正在尝试将字幕文件与我的视频一起加载,但它不起作用。

代码:

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);
        }
    }
}
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);

在 Exoplayer 中 2.16.1 我使用了这段代码并且工作正常:

val subtitle = MediaItem.SubtitleConfiguration.Builder(srtUri)
    .setMimeType(MimeTypes.APPLICATION_SUBRIP)
    .setLanguage("en")
    .setSelectionFlags(C.SELECTION_FLAG_DEFAULT)
    .build()
val mediaItem = MediaItem.Builder()
    .setUri(videoUrl)
    .setSubtitleConfigurations(ImmutableList.of(subtitle))
    .build()

player?.setMediaItem(mediaItem)