一般在直播间搭建的过程中,由于视频直播是比较消耗性能资源的,所以在添加其中每一个功能的时候,是需要谨慎的去考虑性能成本的今天来介绍一下封装短视频音效开发时的处理思路,通俗点讲就是主播在进行开播时播放音乐的功能是如何实现的。

1.性能方面,利用lrucahe实现固定内存持有的音频资源数,将使用频率最低的音乐资源释放,来保证我们的内存不会持续性的增大:

lruCache = new LruCache<String, CacheId>(maxMusicLoadNum) {
@Override
protected int sizeOf(String key, CacheId value) {
return 1;
}
@Override
protected void entryRemoved(boolean evicted, String key, CacheId oldValue, CacheId newValue) {
removeAndReleaseOldSound(oldValue,newValue);
super.entryRemoved(evicted, key, oldValue, newValue);
}
};

2.声音加载动作首先加入队列里面,等待音频下载完或者load进入内存中,当所属的音乐资源加载完毕,再进行消费.但是超过最大等待数的时候,会选择丢弃动作。

if(linkedBlockingQueue.size()<maxWaitMusic&&!resource.isReload()){
linkedBlockingQueue.add(resource.key());
}else{
SoundLog.e("当前音乐动作已经超过同时最大缓存限制,或者您开启的是预加载模式",this);
}

3.生命周期的管理,及时的根据android组件的生命周期进行相应的响应处理非常重要,会避免很多的性能问题,这里我们借鉴了glide源码的实现,进行自动化的生命周期管理:

if(lifeCycleModel==LifeMode.AUTO){
LifeFragment lifeFragment= BindUtil.bindLifeFragment(context);
LifeListner voiceLifeMannger=new VoiceLifeMannger(context,this);
lifeFragment.join(voiceLifeMannger);
}

直播间源码拓展方面:

1.我们在设计代码的时候将每个更小的子功能抽象成若干个模块,实现可插拔替换的目的,例如:

setiFileDownLoader(new IFileDownLoader() {//您可以自定义下载管理,但需要实现相关接口       
@Override
public void download(String s, String s1, FileListner fileListner) {
fileListner.success(s);
}
})

2.核心的实现类实现了和IAudioPlayer,SoundResource.ILoader,未来我们如果增加音乐播放会很方便,SoundResource 和其iloader接口让核心实现类和音频加载实现了解耦,内部还有很多逻辑模块都是通过接口约束和引用的,在此不一一赘述。

以上就是在直播间搭建过程中短音效开发的源码实现方式,最终完成的配乐/伴奏功能也能够给用户在观看直播的过程中增添乐趣,从而在一定程度上增加用户黏性。