要在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" />
  1. 在代码中设置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地址。

  1. 在字幕中添加时间轴:

内嵌字幕通常包含时间轴信息,可以使用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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录