ExoPlayer2 中显示内嵌字幕指南:使用 SubtitleView 实现字幕显示
ExoPlayer2 中显示内嵌字幕指南:使用 SubtitleView 实现字幕显示
要在 ExoPlayer 2 中显示内嵌字幕,可以使用 SubtitleView。
1. 在布局文件中添加 SubtitleView:
<com.google.android.exoplayer2.ui.SubtitleView
android:id="@+id/subtitle_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
2. 在代码中设置 SubtitleView:
// 获取 SubtitleView 实例
SubtitleView subtitleView = findViewById(R.id.subtitle_view);
// 创建 MediaSource
MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(videoUrl));
// 创建 ExoPlayer
SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build();
player.prepare(mediaSource);
// 设置 SubtitleView
Format subtitleFormat = Format.createTextSampleFormat(null, MimeTypes.APPLICATION_SUBRIP,
Format.NO_VALUE, "en");
MediaItem.Subtitle subtitle = new MediaItem.Subtitle(Uri.parse(subtitleUrl), subtitleFormat,
null, C.SELECTION_FLAG_DEFAULT);
player.addMediaItem(MediaItem.fromUri(Uri.parse(videoUrl)).setSubtitles(Collections.singletonList(subtitle)));
player.setPlayWhenReady(true);
player.attachSubtitleView(subtitleView);
其中,dataSourceFactory 是通过 DefaultHttpDataSourceFactory 创建的,videoUrl 是视频的 URL 地址,subtitleUrl 是字幕的 URL 地址。
3. 在字幕中添加时间轴:
内嵌字幕通常包含时间轴信息,可以使用 SubRip 格式的字幕文件来添加时间轴。
例如,下面是一个 SubRip 格式的字幕文件:
1
00:00:10,500 --> 00:00:13,000
This is the first subtitle.
2
00:00:15,000 --> 00:00:17,500
This is the second subtitle.
其中,每个字幕块的格式为:
[字幕编号]
[开始时间] --> [结束时间]
[字幕内容]
在 ExoPlayer 中,可以通过设置 Format.subtitleMimeType 和 Format.subtitleLanguage 来指定字幕的 MIME 类型和语言。
例如,下面是一个使用 SubRip 格式的字幕文件的示例代码:
// 设置字幕的 MIME 类型和语言
Format subtitleFormat = Format.createTextSampleFormat(null, MimeTypes.APPLICATION_SUBRIP,
Format.NO_VALUE, "en");
// 创建字幕
MediaItem.Subtitle subtitle = new MediaItem.Subtitle(Uri.parse(subtitleUrl), subtitleFormat,
null, C.SELECTION_FLAG_DEFAULT);
// 将字幕添加到 MediaItem 中
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(videoUrl)).setSubtitles(Collections.singletonList(subtitle));
// 创建 MediaSource
MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(mediaItem);
注意,如果字幕文件中没有时间轴信息,则需要手动为每个字幕块设置时间轴。
例如,下面是一个手动设置时间轴的示例代码:
// 设置字幕的 MIME 类型和语言
Format subtitleFormat = Format.createTextSampleFormat(null, MimeTypes.APPLICATION_SUBRIP,
Format.NO_VALUE, "en");
// 创建字幕
MediaItem.Subtitle subtitle = new MediaItem.Subtitle(Uri.parse(subtitleUrl), subtitleFormat,
null, C.SELECTION_FLAG_DEFAULT);
// 手动设置时间轴
long[] subtitleOffsetsUs = {0, 10500000, 15000000};
long[] subtitleDurationsUs = {10500000, 4500000, 0};
subtitle.setOffsetsUs(subtitleOffsetsUs);
subtitle.setDurationsUs(subtitleDurationsUs);
// 将字幕添加到 MediaItem 中
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(videoUrl)).setSubtitles(Collections.singletonList(subtitle));
// 创建 MediaSource
MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(mediaItem);
原文地址: https://www.cveoy.top/t/topic/jH7N 著作权归作者所有。请勿转载和采集!