exoplayer开发-音轨切换

本文详细介绍了ExoPlayer中音轨切换的两种方法,重点解析了通过ParametersBuilder的setSelectionOverride方法进行音轨切换的技术细节,包括理解MapperTrackInfo类、确定渲染器索引、获取TrackGroup以及应用SelectionOverride。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)));

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值