我正在使用 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);
}
}
}
最佳答案
这实际上取决于您是侧加载字幕还是嵌入到您的流中。如果它们是嵌入的,HLS、Dash 或其他媒体源将检测轨道,您将需要选择文本轨道。参见 SimpleExoPlayer example
如果您是侧面加载,则需要使用 SingleSampleMediaSource和一个 MergingMediaSource .首先获取您的视频/音频源,然后从 srt 创建一个 SingleSampleMediaSource
并使用 MergingMediaSource
合并两者 Example .完成后选择上面的文本轨道。
关于android - 如何将字幕与exoplayer android集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54738600/