首页 > 其他分享 >基于Agora SDK实现Android端的声动互娱(三)——播放音效

基于Agora SDK实现Android端的声动互娱(三)——播放音效

时间:2023-03-25 23:06:16浏览次数:37  
标签:文件 互娱 audioEffectManager void soundId 音效 Agora 播放

除了背景音乐之外,配音对音视频的影响也是至关重要的,比如喜剧啦、相声啦会配音掌声如雷和哄堂大笑,此外有人新加入直播间时的敲门声也是一种音效。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)

标签:文件,互娱,audioEffectManager,void,soundId,音效,Agora,播放
From: https://blog.51cto.com/dongfeng9ge/6149656

相关文章