exoplayer2同时播放多个音频文件
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同时播放多个音频文件相关推荐
- SDM450+android8.1播放左声道音频文件和右声道音频文件,左右喇叭都有声音问题
正常的现象是播放左声道音频文件,左喇叭播放:播放右声道音频文件,右喇叭播放,但问题是不管播放左还是右音频文件,左右喇叭都有播放 原理图设计 经过排查,原来是当时产品为了兼容,hardware\qcom ...
- html怎么播放下一首,javascript – HTML5音频播放列表 – 第一个结束后如何播放第二个音频文件?...
这是一个JSLinted,不引人注目的 Javascript示例,演示如何处理和使用结束的 mediaevent.在您的特定情况下,您将触发在您的结束事件处理程序中播放第二个音频文件. 单击播放列表中 ...
- Mediaplay:Android后台同时播放多个音频文件第一弹:读取并播放音频文件
Mediaplay:Android后台同时播放多个音频文件 设备/引擎:Mac(11.6)/cocos 开发工具:Android studio(4.1.2) 开发语言:java/c++ 开发需求:an ...
- iOS 用 AVPlayer 播放一个本地音频文件
iOS 用 AVPlayer 播放一个本地音频文件 步骤 第一步:在 Project - TARGETS - Project名 - Build Phases - Link Binary With Li ...
- iOS Dev (21) 用 AVPlayer 播放一个本地音频文件
iOS Dev (21) 用 AVPlayer 播放一个本地音频文件 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 前言 这篇文章与上一篇极其相似,要注 ...
- Mediaplay:Android后台同时播放多个音频文件第二弹:控制音频音量
Mediaplay:Android后台同时播放多个音频文件 设备/引擎:Mac(11.6)/cocos 开发工具:Android studio(4.1.2) 开发语言:java/c++ 开发需求:an ...
- Android中怎样使用MediaPlayer播放byte数组音频文件
场景 在得到某音频文件的byte[]后使用MediaPlayer将其播放出来. 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序 ...
- java播放mp3格式音频文件
下载第三方jar包,网址:http://www.javazoom.net/javalayer/javalayer.html 下载完成之后解压提取jl1.0.0.1.jar 将jl1.0.0.1.jar ...
- window API播放pcm格式音频文件,函数waveOutOpen等
之前在我的博客中有一篇关于编写录音器的代码,可保存为pcm和wav格式,说白了其实两者是一个东西,只不过wav比pcm多了一个文件头,这个文件头一共占了44个字节.此处这个不是重点,重点是如何编写程序 ...
最新文章
- 推荐一个分布式JVM监控工具,非常实用!
- 旧金山站线上峰会24h倒数
- 用Hystrix保护您的应用程序
- java中子类实例化过程中的内存分配
- #55 #56 #58 #59 #60 #66
- 机器学习基础(三)——信息、信息熵与信息增益
- Spring学习(一)Spring简介、SpringIOC
- Qt PDF预览功能实现汇总
- 微信小程序轮子 - 外卖点餐左右联动界面完整源码(类似美团饿了么点餐界面)
- w ndows 10关机快捷键,win10系统
- win10 internet 信息服务器,Win10无internet访问权限怎么解决?Win10无网络解决方法
- 内外盘期货市场的介绍(一)
- 基于OpenStack的云测试平台
- uniapp打开摄像头进行视频并拍照
- java实现堆栈 打印英文字母表
- 劳动者可以拒绝加班吗
- 彻底删除已经下载安装好的Mysql
- 攻城略地mysql充值_攻城掠地充值有巨惠!平台折扣5.0超划算
- (半平面交)POJ2451Uyuw‘s Concert
- Ubuntu安装搜狗输入法无论如何就是找不到的解决方法///Ubuntu怎么安装搜狗输入法///Ubuntu怎么输入中文///Ubuntu搜狗输入法怎么修改皮肤
热门文章
- Grafana变量介绍
- Python分布式爬虫框架Scrapy实战
- 安装VS2008 SP1出现错误,文件正在使用 Microsoft Program Database
- SQL SERVER 2012安装
- 票务公司网上订票系统
- 断言assert的理解和用法
- Property ‘next‘ does not exist on type ‘Component<any, {}, any>‘问题的解决方法
- 计算机操作系统--基础知识
- 【计算机-内存】内存核心频率/IO控制器频率(主频)/等效频率
- 2021-05-28 sqlplus命令连接数据库的几种方法