ExoPlayer获取可用的音轨并在它们之间切换

时间:2019-05-09 15:22:40

标签: android exoplayer audiotrack

我有一个Android应用程序,可通过ExoPlayer播放视频。我想向流添加语言支持。流将具有什么语言,必须从流的元数据中获取。

在ExoPlayer库中,我找到了一种通过以下方法从流中获取曲目列表的方法:

$('#btnSave').prop('disabled', false);
$('#btnSave').prop('disabled', true);`

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

  

Format(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,空,音频/mpeg-L2、-1、、[-1、-1、-1.0]、[2、48000])
  格式(1/201,null,audio / mpeg-L2,-1,,[-1,-1,-1.0],[2,48000])

我想知道是否有一种更简单的方法来仅获取音轨及其所需的信息,以供以后切换。

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  

Format(1/21,null,application / id3,-1,null,[-1,-1,-1.0],[-1,-1])
   格式(0,null,视频/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])
   格式(英语,空,音频/ mpeg-L2,-1,英语,[-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(我不完全知道)匹配。