exoplayer音轨切换有两种方式:第一种是ParametersBuilder提供的setPreferredLanguage(String lan)方法,该方法根据音轨的language字段来切换,但是有的音轨文件不标准没language字段名,这种情况就得使用第二种方法了;第二种是ParametersBuilder提供的setSelectionOverride(int rederIndex,TrackGroup trackGroup,SelectionOverride selectionOverride)f方法,使用这个方法的难点在于搞清楚各个参数的含义和取值,我就是这块没搞明白,浪费了好多时间,差点就放弃了。接下来就重点讲讲第二种方法的使用。
这里先讲一下,MappingTrackSelector.MapperTrackInfo这个类,这个类呢把exoplayer里面所有支持的渲染器类型,每个渲染器类型里有哪些渲染数据格式类都封装在了一起,我们主要是通过这个类来实现第二方法音轨切换的。我的MapperTrackInfo里面的信息
rederIndex=0,trackType =2,rederSupportType=3,bestTrackRederType=3,trackGroupArray=false,unmappedTrackGroups=false
rederIndex=1,trackType =1,rederSupportType=3,bestTrackRederType=3,trackGroupArray=false,unmappedTrackGroups=false
rederIndex=2,trackType =3,rederSupportType=3,bestTrackRederType=3,trackGroupArray=false,unmappedTrackGroups=false
rederIndex=3,trackType =4,rederSupportType=0,bestTrackRederType=0,trackGroupArray=false,unmappedTrackGroups=false
rederIndex=4,trackType =5,rederSupportType=0,bestTrackRederType=0,trackGroupArray=false,unmappedTrackGroups=false
首先,查看源码的说明文档,得知第一个参数的含义是渲染器的索引,说到渲染器就是音频渲染器、视频渲染器、字幕渲染器和其他的渲染器一共有5种,可在exoplayer里的C类里查到各个渲染器类所对应的数字。exoplayer默认将音频渲染器放在索引为1的位置上,这个可以通过DefaultTrackSelector的getCurrentMappedTrackInfo()方法获取到,这个方法很重要,里面的好多信息都是从这里得到的。所以此处的参数为1,代表我们要对音频渲染器做操作。C类里渲染器类别对应的数字
/** A type constant for tracks of unknown type. */
public static final int TRACK_TYPE_UNKNOWN = -1;
/** A type constant for tracks of some default type, where the type itself is unknown. */
public static final int TRACK_TYPE_DEFAULT = 0;
/** A type constant for audio tracks. */
public static final int TRACK_TYPE_AUDIO = 1;
/** A type constant for video tracks. */
public static final int TRACK_TYPE_VIDEO = 2;
/** A type constant for text tracks. */
public static final int TRACK_TYPE_TEXT = 3;
/** A type constant for metadata tracks. */
public static final int TRACK_TYPE_METADATA = 4;
/** A type constant for camera motion tracks. */
public static final int TRACK_TYPE_CAMERA_MOTION = 5;
/** A type constant for a dummy or empty track. */
public static final int TRACK_TYPE_NONE = 6;
第二步,得到第二个参数TackGroup,通过第一步分析我们得知index为1的是音频渲染器,然后我们便可以通过MapperTrackInfo的getTrackGrops(int rederIndex)方法将1传进去得到音频trackGroup。里面的信息
format audio/mpeg-L2, lang null, id 1/257, lable null
format audio/mpeg-L2, lang null, id 1/258, lable null
第三步,要想得到第三个参数SelectionOverride,就的弄明白TrackGroup是啥,通过查看源码得知,TrackGroup里面维护了一个Fomat数组,Fomat就是数据格式的表示对象,里面有好多成员变量,如minetype,language,id。通过分析第二步的TrackGroup我能得知这里面有两条音轨数据,索引分别为0和1。因此通过SelectionOverride的构造方法将我所需要选的音轨给选择出来。
最后,通过DefaultSelector的setParmameters()方法将它注入进去即可;下面是具体代码
MappingTrackSelector.MappedTrackInfo trackInfo =
MyExoPlayer.getTrackSelector().getCurrentMappedTrackInfo();
if (trackInfo != null) {
MyExoPlayer.getTrackSelector()
.setParameters(MyExoPlayer.getTrackSelector()
.buildUponParameters()
.setSelectionOverride(1, trackInfo.getTrackGroups(1),
new DefaultTrackSelector.SelectionOverride(track, 0)));