如何将字幕与exoplayer android集成
我使用Exoplayer播放不同类型的视频,我下载了这个演示并使用它 现在我需要为我的视频添加字幕,我使用的是ExoPlayer版本2.9.5 这是构建媒体源的方法如何将字幕与exoplayer android集成,android,exoplayer,subtitle,exoplayer2.x,Android,Exoplayer,Subtitle,Exoplayer2.x,我使用Exoplayer播放不同类型的视频,我下载了这个演示并使用它 现在我需要为我的视频添加字幕,我使用的是ExoPlayer版本2.9.5 这是构建媒体源的方法 private MediaSource buildMediaSource(Uri uri, @Nullable String overrideExtension) { @ContentType int type = Util.inferContentType(uri, overrideExtension); swi
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);
}
}
}
私有MediaSource buildMediaSource(Uri,@Nullable String OverrideeExtension){
@ContentType int-type=Util.inferContentType(uri,overrideExtension);
开关(类型){
案例C.类型_破折号:
返回新的DashMediaSource.Factory(dataSourceFactory)
.setManifestParser(
新的FilteringManifestParser(新的DashManifestParser(),getOfflineStreamKeys(uri)))
.createMediaSource(uri);
案例C.类型:
返回新的SsMediaSource.Factory(dataSourceFactory)
.setManifestParser(
新的FilteringManifestParser(新的SsManifestParser(),getOfflineStreamKeys(uri)))
.createMediaSource(uri);
案例C.类型_HLS:
返回新的HlsMediaSource.Factory(dataSourceFactory)
.SetPlayParserFactory(
新的DefaultHlsPlaylistParserFactory(getOfflineStreamKeys(uri)))
.createMediaSource(uri);
案例C.类型_其他:
返回新的extractoremiasource.Factory(dataSourceFactory.createMediaSource(uri);
默认值:{
抛出新的IllegalStateException(“不支持的类型:“+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);
}
}
}
private MediaSource buildMediaSourceWithSubtitle(Uri Uri,@Nullable String OverrideeExtension,Uri字幕){
Format subtitleFormat=Format.createTextSampleFormat(
null,//轨道的标识符。可能为null。
MimeTypes.APPLICATION\u SUBRIP,//必须正确设置mime类型。
0,//轨迹的选择标志。
null);//字幕语言。可能为null。
媒体源字幕源=
新的SingleSampleMediaSource.Factory(dataSourceFactory)
.createMediaSource(字幕,字幕格式,C.TIME\u UNSET);
MediaSource MediaSource=null;
@ContentType int-type=Util.inferContentType(uri,overrideExtension);
开关(类型){
案例C.类型_破折号:
mediaSource=新DashMediaSource.Factory(dataSourceFactory)
.setManifestParser(
新的FilteringManifestParser(新的DashManifestParser(),getOfflineStreamKeys(uri)))
.createMediaSource(uri);
返回新的MergingMediaSource(mediaSource,subtitleSource);
案例C.类型:
mediaSource=新的SsMediaSource.Factory(dataSourceFactory)
.setManifestParser(
新的FilteringManifestParser(新的SsManifestParser(),getOfflineStreamKeys(uri)))
.createMediaSource(uri);
返回新的MergingMediaSource(mediaSource,subtitleSource);
案例C.类型_HLS:
mediaSource=新的HlsMediaSource.Factory(dataSourceFactory)
.SetPlayParserFactory(
新的DefaultHlsPlaylistParserFactory(getOfflineStreamKeys(uri)))
.createMediaSource(uri);
返回新的MergingMediaSource(mediaSource,subtitleSource);
案例C.类型_其他:
mediaSource=new-extractoreMadisource.Factory(dataSourceFactory).createMediaSource(uri);
返回新的MergingMediaSource(mediaSource,subtitleSource);
默认值:{
抛出新的IllegalStateException(“不支持的类型:“+type”);
}
}
}
这实际上取决于您是侧面加载字幕,还是将字幕嵌入流中。如果它们被嵌入,HLS、Dash或其他媒体源将检测曲目,您需要选择文本曲目。看
如果您是侧面装载,则需要使用和。首先获取视频/音频源,然后从srt创建一个
SingleSampleMediaSource
,并使用MergingMediaSource
将两者合并。完成后,选择如上所述的文本曲目。因此,您没有发现:您可以播放MKV
视频文件吗?如果可以,是否可以共享您的代码?请检查我的编辑,我已经按照您提供的示例进行了操作,但不起作用请检查屏幕快照这是我文件的url:,它只是一个测试文件