【问题标题】:ExoPlayer get available audio tracks and switch between themExoPlayer 获取可用的音轨并在它们之间切换
【发布时间】:2019-09-27 11:38:46
【问题描述】:

我有一个使用 ExoPlayer 流式传输视频的 android 应用程序。我想为流添加语言支持。流将具有哪些语言,必须从流的元数据中获取。

在 ExoPlayer 库中,我找到了从流中获取曲目列表的方法:

player.getCurrentTrackGroups().get(i).getFormat(i) //player is SimpleExoPlayer class

但这给了我一些原始信息,这里是视频、音频和其他需要标记的轨道。打印格式如下所示:

格式(1/100, null, video/avc, -1, null, [1920, 1080, -1.0], [-1, -1])
格式(1/8292, null, application/cea-608, -1, null, [-1, -1, -1.0], [-1, -1])
格式(1/200, null, audio/mpeg-L2, -1, , [-1, -1, -1.0], [2, 48000])
格式(1/201, null, audio/mpeg-L2, -1, , [-1, -1, -1.0], [2, 48000])

我想知道是否有一种更简单的方法可以只获取音轨及其所需的信息,以便以后在它们之间切换。

我的下一个问题是我不知道如何在音轨之间切换。我搜索并接受了一个答案,这是通过以下代码完成的:

player.selectTrack(FullPlayer.TYPE_AUDIO, ExoPlayer.TRACK_DEFAULT);

此代码取自this 答案。 问题是,我的 SimpleExoPlayer 类没有这个功能。我有 exoplayer 2.8.2 并且 SimpleExoPlayer ExoPlayer 类都没有这个功能。所以我被困在那里。
另一个找到的答案来自具有以下面孔的 DefaultTrackSelector 类:

 trackSelector.setParameters( trackSelector.getParameters().buildUpon().setPreferredAudioLanguage("eng"));

这看起来既简单又好方法,但并非所有流都这样标记。许多曲目没有语言名称的字符串。他们唯一不同的是ID字符串。并且传递 id 字符串不起作用。

【问题讨论】:

  • 这个问题好运吗?你能解决吗?
  • @negrotico19 我发布了答案。看看它是否会有所帮助。我很快会做一些测试,我会更新答案。

标签: android exoplayer audiotrack


【解决方案1】:

使用我拥有的流元数据,我认为不可能获得语言列表。 现在修复元数据后,它看起来像这样:

格式(1/21, null, application/id3, -1, null, [-1, -1, -1.0], [-1, -1])
格式(0, null, video/hevc, 2541422, null, [1920, 1080, -1.0], [-1, -1])
格式(1/8228, null, application/cea-608, -1, null, [-1, -1, -1.0], [-1, -1])
格式(1/21, null, application/id3, -1, null, [-1, -1, -1.0], [-1, -1])
格式(eng, null, audio/mpeg-L2, -1, eng, [-1, -1, -1.0], [2, 48000])
格式(1/21, null, application/id3, -1, null, [-1, -1, -1.0], [-1, -1])
格式(rus, null, audio/mpeg-L2, -1, rus, [-1, -1, -1.0], [2, 48000])

我编写了从元数据中获取信息的代码:

for(int i = 0; i < player.getCurrentTrackGroups().length; i++){
   String format = player.getCurrentTrackGroups().get(i).getFormat(0).sampleMimeType;
   String lang = player.getCurrentTrackGroups().get(i).getFormat(0).language;
   String id = player.getCurrentTrackGroups().get(i).getFormat(0).id;

   System.out.println(player.getCurrentTrackGroups().get(i).getFormat(0));
   if(format.contains("audio") && id != null && lang != null){
      //System.out.println(lang + " " + id);
      audioLanguages.add(new Pair<>(id, lang));
   }
}

如果元数据的 sampleMimeType 包含“音频”字符串,我认为它与音频有关。可以有许多不同类型的音频。

现在关于在音轨之间切换:

trackSelector.setParameters( trackSelector.getParameters().buildUpon().setPreferredAudioLanguage("eng"));

这个内部字符串应该匹配.getFormat(0).language.getFormat(0).id(我不太清楚)。

【讨论】:

  • 上述解决方案是否有帮助,您能否获得语言列表?
  • 是的,通过这个解决方案,我在播放器中实现了音频语言切换。
  • 感谢您的热情回复,我尝试了上面的代码但对我不起作用,我的 HLS 流 URL 有音轨,我觉得我从不正确的地方调用了上面的代码地方,现在我在初始化 ExoPlayer 后马上打电话。如果我需要从其他任何地方打电话,请告诉我。
  • 您应该在流准备好播放时调用此方法。当playbackState == Player.STATE_READY 时,我在侦听器的onPlayerStateChanged 函数中调用此函数。 onPlayerStateChanged 已经在较新的版本中被弃用,所以我认为你可以在 onPlaybackStateChanged state == Player.STATE_READY 时使用它
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2012-09-07
  • 1970-01-01
  • 2018-05-08
  • 2020-04-15
相关资源
最近更新 更多