除了背景音乐之外,配音对音视频的影响也是至关重要的,比如喜剧啦、相声啦会配音掌声如雷和哄堂大笑,此外有人新加入直播间时的敲门声也是一种音效。Agora提供了简单易用的SDK让开发者更简便地使用音效(AudioEffect),仅需要实现IAudioEffectManager接口
播放配音音效
和音乐混动一样,使用音效功能也需要在AndroidManifest.xml里配置usesCleartextTraffic和requestLegacyExternalStorage,不再赘述。
我们首先采用RtcEngine默认的IAudioEffectManager实现,然后只需写一行代码便可以使用Agora傻瓜式的音效功能:
audioEffectManager = mRtcEngine.getAudioEffectManager();
// 播放指定的音效文件
// 可以设置多个音效 ID,同时播放多个音效文件
// 建议同时播放的音效不超过三个
audioEffectManager.playEffect(
soundId, // 设置音效 ID
filePath, // 设置音效文件路径
-1, // 设置音效循环播放的次数。-1 表示无限循环
1, // pitch,设置音效的音调,取值范围为 [0.5,2.0]。1 表示原始音调
0.0, // pan,设置音效的空间位置,取值范围为 [-1.0,1.0]。0.0 表示音效出现在正前方
100, // 设置音效音量,取值范围为 [0.0,100.0]。默认100
true,// 设置是否将音效发布至远端
0 // 设置音效文件的播放位置。0 表示从音效文件的第 0 ms 开始播放
);
我来解释一下其中第二个参数的含义,这个String类型的写法和前面音乐混动比较像,也支持File,ContentProvider和assets中的内容,但是不支持过大的文件,也不可以填入在线音效文件的URL路径(http://或https://打头)
配音音效的预加载与回收
当然我们也可以利用preloadEffect()方法将音效文件加载到内存中,这个方法支持在joinChannel()方法调用之前调用:
// 如果要音效文件较大或者需要反复播放音效,建议将音效文件预加载至内存
// 不支持特别大的文件,也不支持网络URL
for (String strSound :soundList){
audioEffectManager.preloadEffect(id++, strSound);
}
需要注意的是,如果提前调用了preloadEffect()方法,那么调用playEffect()方法的时候前两个参数必须与preloadEffect()缓存的两个参数一致。
为了避免内存泄漏问题,我们需要在关闭当前Activity时清空音效缓存
@Override
protected void onDestroy() {
super.onDestroy();
……
// 清空音效缓存
for (int soundId:soundIdList){
audioEffectManager.unloadEffect(soundId);
}
}
配音音效的其他方法
如果需要回调的话,我们就在刚才的IRtcEngineEventHandler()内部类中override onAudioEffectFinishe()方法
private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() {
……
// 该回调在音效文件播放结束时触发
@Override
public void onAudioEffectFinished(int soundId) {
super.onAudioEffectFinished(soundId);
// 一个音效结束后,播放下一个音效
switch (soundId) {
// 大弦嘈嘈如急雨,小弦切切如私语
case idBigWire:
audioEffectManager.playEffect(idSmallWire, strSmallWire, 1, 1, 0, 100);
break;
// 银瓶乍裂水浆迸,铁骑突出刀枪鸣
case idBreakBottle:
audioEffectManager.playEffect(idKnightAssault, strKnightAssault, 1, 1, 0, 100);
break;
default:
break;
}
}
……
};
此外音效还有许多其他方法,如下所示:
// 暂停掌声
public void pauseClapping(){
audioEffectManager.pauseEffect(idClapping);
}
// 恢复掌声
public void resumeClapping(){
audioEffectManager.resumeEffect(idClapping);
}
// 停止掌声
public void stopClapping(){
audioEffectManager.stopEffect(idClapping);
}
最后我们以一个欢乐的视频结束本文,视频里主画面(我的正脸)是对方视角,副画面(我的侧脸)是本人视角,注意听掌声
我们接下来学习的内容是如何使用美声(VoiceBeautifier)和人声(VoiceConversion)