exoplayer2是谷歌出的一个非常强大的播放器,言归正转。想要同时播放多个MP3文件或者视频文件exoplayer2本身是不支持的,但是可以通过重写几个类做到。

重写TrackSelector

public class MultiTrackSelector extends TrackSelector {@Overridepublic TrackSelectorResult selectTracks(RendererCapabilities[] rendererCapabilities, TrackGroupArray trackGroups, MediaSource.MediaPeriodId periodId, Timeline timeline) throws ExoPlaybackException {
//        int rendererCount = rendererCapabilities.length;
//        TrackSelection[] rendererTrackSelections = new TrackSelection[rendererCount];
//        LogUtils.E("345","rendererCount==="+rendererCount);
//        int length = trackGroups.length;
//        for (int i = 0; i < rendererCount; i++) {
//            int trackType = rendererCapabilities[i].getTrackType();
//
//
//            LogUtils.E("345","length111==="+length);
//            if (trackType == C.TRACK_TYPE_AUDIO) {
//                if (trackGroups.length > i) {
//                    LogUtils.E("345","length==="+length);
//                    rendererTrackSelections[i] = new FixedTrackSelection(trackGroups.get(i), 0);
//                }
//            }
//        }
//
//        RendererConfiguration[] rendererConfigurations = new RendererConfiguration[rendererCapabilities.length];
//        for (int i = 0; i < rendererCount; i++) {
//            rendererConfigurations[i] = rendererTrackSelections[i] != null ? RendererConfiguration.DEFAULT : null;
//        }
//
//
//        return new TrackSelectorResult(rendererConfigurations, rendererTrackSelections, new Object());Queue<Integer> audioRenderers = new ArrayDeque<>();RendererConfiguration[] configs = new RendererConfiguration[rendererCapabilities.length];TrackSelection[] selections = new TrackSelection[rendererCapabilities.length];for (int i = 0; i < rendererCapabilities.length; i++) {if(rendererCapabilities[i].getTrackType() == C.TRACK_TYPE_AUDIO) {audioRenderers.add(i);configs[i] = RendererConfiguration.DEFAULT;}}for (int i = 0; i < trackGroups.length; i++) {if (MimeTypes.isAudio(trackGroups.get(i).getFormat(0).sampleMimeType)) {Integer index = audioRenderers.poll();if (index != null) {selections[index] = new FixedTrackSelection(trackGroups.get(i), 0);}}}return new TrackSelectorResult(configs, selections, new Object());}@Overridepublic void onSelectionActivated(Object info) {}
}

我这主要是音频文件,如果是视频文件上面的TRACK_TYPE_AUDIO就要改成TRACK_TYPE_VIDEO。

然后就是

public class MultiTrackRenderersFactory extends DefaultRenderersFactory {private int audioTrackCnt;private Context context;private List<MultiMediaCodecAudioRenderer>audioSinkList= new ArrayList<>();private List<AudioSink>audioSinks= new ArrayList<>();public List<AudioSink> getAudioSinks() {return audioSinks;}public void setAudioSinks(List<AudioSink> audioSinks) {this.audioSinks = audioSinks;}public List<MultiMediaCodecAudioRenderer> getAudioSinkList() {return audioSinkList;}public void setAudioSinkList(List<MultiMediaCodecAudioRenderer> audioSinkList) {this.audioSinkList = audioSinkList;}public MultiTrackRenderersFactory(int audioTrackCnt, Context context) {super(context);this.audioTrackCnt = audioTrackCnt;this.context = context;}@Overrideprotected void buildAudioRenderers(Context context, int extensionRendererMode, MediaCodecSelector mediaCodecSelector,boolean enableDecoderFallback, AudioSink audioSink, Handler eventHandler,AudioRendererEventListener eventListener, ArrayList<Renderer> out) {audioSinkList.clear();SonicAudioProcessor sonicAudioProcessor = new SonicAudioProcessor();DefaultAudioSink.DefaultAudioProcessorChain defaultAudioProcessorChain=  new DefaultAudioSink.DefaultAudioProcessorChain(new AudioProcessor[] {},new SilenceSkippingAudioProcessor(),sonicAudioProcessor);AudioSink myAudioSink =new  DefaultAudioSink(AudioCapabilities.getCapabilities(context),defaultAudioProcessorChain,true,true,true);for (int i = 0; i < audioTrackCnt; i++) {MultiMediaCodecAudioRenderer multiMediaCodecAudioRenderer =new MultiMediaCodecAudioRenderer(i, context,MediaCodecSelector.DEFAULT,eventHandler,eventListener,audioSink);out.add(multiMediaCodecAudioRenderer);audioSinkList.add(multiMediaCodecAudioRenderer);audioSinks.add(audioSink);}}}

这里面主要用到audioSinkList,我们知道播放它是用audiotrck去播放的。我们可以用MultiMediaCodecAudioRenderer来控制每个音频的声音大小和速度大小。具体怎么控制看

MultiMediaCodecAudioRenderer里面的源代码。速度可以直接控制,声音要绕一绕了,看源码应该可以处理。
public class MultiMediaCodecAudioRenderer extends MediaCodecAudioRenderer {private int index;public MultiMediaCodecAudioRenderer(int index, Context context, MediaCodecSelector mediaCodecSelector,Handler eventHandler,AudioRendererEventListener eventListener,AudioSink audioSink) {
//        super(context,mediaCodecSelector,eventHandler,eventListener,audioSink);super(context,mediaCodecSelector);this.index = index;}@Overridepublic MediaClock getMediaClock() {if (index == 0) {return super.getMediaClock();}return null;}}

完成这三个重写后,加入到SimpleExoPlayer实例就可以同时播放多个音频了。视频同理。最后感叹下exoplayer2的强大。因为可以同时播多个音频,还可以同时播多个轨道。目前为止还没看到有其他的可以做到。

exoplayer2同时播放多个音频文件相关推荐

  1. SDM450+android8.1播放左声道音频文件和右声道音频文件,左右喇叭都有声音问题

    正常的现象是播放左声道音频文件,左喇叭播放:播放右声道音频文件,右喇叭播放,但问题是不管播放左还是右音频文件,左右喇叭都有播放 原理图设计 经过排查,原来是当时产品为了兼容,hardware\qcom ...

  2. html怎么播放下一首,javascript – HTML5音频播放列表 – 第一个结束后如何播放第二个音频文件?...

    这是一个JSLinted,不引人注目的 Javascript示例,演示如何处理和使用结束的 mediaevent.在您的特定情况下,您将触发在您的结束事件处理程序中播放第二个音频文件. 单击播放列表中 ...

  3. Mediaplay:Android后台同时播放多个音频文件第一弹:读取并播放音频文件

    Mediaplay:Android后台同时播放多个音频文件 设备/引擎:Mac(11.6)/cocos 开发工具:Android studio(4.1.2) 开发语言:java/c++ 开发需求:an ...

  4. iOS 用 AVPlayer 播放一个本地音频文件

    iOS 用 AVPlayer 播放一个本地音频文件 步骤 第一步:在 Project - TARGETS - Project名 - Build Phases - Link Binary With Li ...

  5. iOS Dev (21) 用 AVPlayer 播放一个本地音频文件

    iOS Dev (21) 用 AVPlayer 播放一个本地音频文件 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 前言 这篇文章与上一篇极其相似,要注 ...

  6. Mediaplay:Android后台同时播放多个音频文件第二弹:控制音频音量

    Mediaplay:Android后台同时播放多个音频文件 设备/引擎:Mac(11.6)/cocos 开发工具:Android studio(4.1.2) 开发语言:java/c++ 开发需求:an ...

  7. Android中怎样使用MediaPlayer播放byte数组音频文件

    场景 在得到某音频文件的byte[]后使用MediaPlayer将其播放出来. 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序 ...

  8. java播放mp3格式音频文件

    下载第三方jar包,网址:http://www.javazoom.net/javalayer/javalayer.html 下载完成之后解压提取jl1.0.0.1.jar 将jl1.0.0.1.jar ...

  9. window API播放pcm格式音频文件,函数waveOutOpen等

    之前在我的博客中有一篇关于编写录音器的代码,可保存为pcm和wav格式,说白了其实两者是一个东西,只不过wav比pcm多了一个文件头,这个文件头一共占了44个字节.此处这个不是重点,重点是如何编写程序 ...

最新文章

  1. 推荐一个分布式JVM监控工具,非常实用!
  2. 旧金山站线上峰会24h倒数
  3. 用Hystrix保护您的应用程序
  4. java中子类实例化过程中的内存分配
  5. #55 #56 #58 #59 #60 #66
  6. 机器学习基础(三)——信息、信息熵与信息增益
  7. Spring学习(一)Spring简介、SpringIOC
  8. Qt PDF预览功能实现汇总
  9. 微信小程序轮子 - 外卖点餐左右联动界面完整源码(类似美团饿了么点餐界面)
  10. w ndows 10关机快捷键,win10系统
  11. win10 internet 信息服务器,Win10无internet访问权限怎么解决?Win10无网络解决方法
  12. 内外盘期货市场的介绍(一)
  13. 基于OpenStack的云测试平台
  14. uniapp打开摄像头进行视频并拍照
  15. java实现堆栈 打印英文字母表
  16. 劳动者可以拒绝加班吗
  17. 彻底删除已经下载安装好的Mysql
  18. 攻城略地mysql充值_攻城掠地充值有巨惠!平台折扣5.0超划算
  19. (半平面交)POJ2451Uyuw‘s Concert
  20. Ubuntu安装搜狗输入法无论如何就是找不到的解决方法///Ubuntu怎么安装搜狗输入法///Ubuntu怎么输入中文///Ubuntu搜狗输入法怎么修改皮肤

热门文章

  1. Grafana变量介绍
  2. Python分布式爬虫框架Scrapy实战
  3. 安装VS2008 SP1出现错误,文件正在使用 Microsoft Program Database
  4. SQL SERVER 2012安装
  5. 票务公司网上订票系统
  6. 断言assert的理解和用法
  7. Property ‘next‘ does not exist on type ‘Component<any, {}, any>‘问题的解决方法
  8. 计算机操作系统--基础知识
  9. 【计算机-内存】内存核心频率/IO控制器频率(主频)/等效频率
  10. 2021-05-28 sqlplus命令连接数据库的几种方法