【问题标题】:Sideload subtitle not working in ExoPlayer旁加载字幕在 ExoPlayer 中不起作用
【发布时间】:2019-02-21 01:59:53
【问题描述】:

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

代码:

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

【问题讨论】:

    标签: android exoplayer exoplayer2.x


    【解决方案1】:
    MediaSource videoSource = new ExtractorMediaSource(
            视频Uri,
            数据源工厂,
            新的 DefaultExtractorsFactory(),
            空值,
            空值);
    格式 subtitleFormat = Format.createTextSampleFormat(
            空值,
            MimeTypes.APPLICATION_SUBRIP,
            C.SelectionFlags,
            "zh");
    MediaSource textMediaSource = new SingleSampleMediaSource(
        Uri.parse("http://www.storiesinflight.com/js_videosub/jellies.srt"),
        数据源工厂,
        字幕格式,
        C.TIME_UNSET);
    source = new MergingMediaSource(videoSource, textMediaSource); // 稍后使用
    
    
    // 嵌套到某个以 SubtitleView 作为成员的类
    类 SomeListener 实现 ...,TextRenderer.Output,... {
        ...
            // 这个函数似乎没有被调用
        公共无效onCues(列表提示){
            // 这里有些日志
            if (subtitleView != null) {
            subtitleView.onCues(提示);
            }
        }
        ...
    }
    
    player.setTextOutput(监听器);
    ...
    // 稍后,播放视频,假设它已准备好等等
    player.setPlayWhenReady(true);

    【讨论】:

    • 非常感谢它的帮助
    【解决方案2】:

    在 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)
    

    【讨论】:

    • 如果您的文件位于项目的 assets 目录中,则只想添加以用于 srtUri 或 videoUri 例如 Uri.parse(("file:///android_asset/subtitle.srt")) .
    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多