exoplayer2 中 如何显示内嵌入字幕
要在ExoPlayer 2中显示内嵌字幕,可以使用SubtitleView。
- 在布局文件中添加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" />
- 在代码中设置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地址。
- 在字幕中添加时间轴:
内嵌字幕通常包含时间轴信息,可以使用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/cbrB 著作权归作者所有。请勿转载和采集!