exoplayer开发-音轨切换

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

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于ijkplayer的多音轨切换是指在Android应用中使用ijkplayer播放视频时,可以切换不同的音轨进行播放。在Android平台上,编译好的全解库是指已经将ijkplayer库编译成适用于ARMv7-A架构的可执行文件。 要实现多音轨切换的功能,首先需要导入ijkplayer库到项目中。可以通过在build.gradle文件中添加依赖来导入这个库。然后,需要创建一个IjkMediaPlayer对象,并对其进行配置和初始化。可通过设置setOption方法来控制音轨相关的参数,如选择指定的音轨。 在ijkplayer中,可以通过getTrackInfo方法来获取视频的所有音轨信息。调用该方法后,可以遍历获取到的音轨信息,然后通过setAudioTrack方法来设置指定音轨进行播放。具体的音轨切换逻辑和实现方式,可以根据实际需求进行设计和开发。 然后,将视频源设置给IjkMediaPlayer对象,并调用prepareAsync方法进行异步准备。准备完成后,可以调用start方法开始播放视频。在播放过程中,可以通过控制界面上的按钮或其他交互手段,动态切换不同的音轨进行播放。 最后,需要注意在退出应用或切换页面时,调用IjkMediaPlayer的reset方法进行资源释放和重置操作,以确保不会出现内存泄漏和资源浪费的问题。 总之,通过使用编译好的全解库和对ijkplayer进行配置和初始化,可以实现基于ijkplayer的多音轨切换功能。这样用户在观看视频时就可以根据需要切换不同的音轨,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值