当用户在 RTC 与白板的动态 PPT 同时使用时,可能会遇到以下问题:
为了解决这些问题,2.9.15 的白板内置了用于混音的 RTC 接口,用户在根据本章内容进行实现后可以避免这些问题。
如果用户使用的 RTC 提供商不支持混音本章内容将会无效
样例代码可以参考 Android-demo
本文中 RTC 使用 Agora Android SDK 作为实例,运行 demo 前请先在 strings.xml 中配置好 rtc_app_id 参数
用户需要实现 com.herewhite.sdk.AudioMixerBridge 类,该类用于桥接 native sdk 与用户引用的 RTC 客户端。

PPT 内部在触发播放事件前会调用 AudioMixerBridge 接口方法,通过用户的实现类调用到 RTC 的混音相关方法。
AudioMixerBridge 的实现例子如下(具体方法说明请参考 AudioMixerBridge 接口注释):
public class AudioMixerBridgeImpl implements AudioMixerBridge {
    private RtcEngine rtcEngine;
    public AudioMixerBridgeImpl(RtcEngine rtcEngine) {
        this.rtcEngine = rtcEngine;
    }
    @Override
    public void startAudioMixing(String filepath, boolean loopback, boolean replace, int cycle) {
        rtcEngine.startAudioMixing(filepath, loopback, replace, cycle);
    }
    @Override
    public void stopAudioMixing() {
        rtcEngine.stopAudioMixing();
    }
    @Override
    public void setAudioMixingPosition(int position) {
        rtcEngine.setAudioMixingPosition(position);
    }
}
在 2.9.15 后的 white sdk 初始化方法中多了一个可选参数 AudioMixerBridge audioMixerBridge。用户如果要使用 RTC 混音功能需要在初始化 sdk 前将 AudioMixerBridge接口实现传入到该方法中:
new WhiteSdk(xxx, xxx, xxx, new CommonCallbacks() {
                    .... 
                }, 
                // 如果用户需要用到 rtc 混音功能来解决回声和声音抑制问题,那么必须要在 whiteSDK 之前初始化 rtcEngine
                // AudioMixerBridgeImpl 在传入 sdk 后,ppt 内的音视频就全部使用 rtc 混音的方式播放
                new AudioMixerBridgeImpl(rtcEngine));
其中 rtcEngine 是用户引入的 RTC 服务客户端对象,需要在该步骤前初始化完毕。
RTC 客户端需要有混音状态回调提示,在该回调方法中调用 sdk 中的混音状态变化方法来通知 PPT 是否该进行视频播放。
如果 RTC 客户端没有相关回调会造成 PPT 的视频音画不同步问题。
IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() {
        ... 
        @Override
        // 混音状态变化时的回调
        public void onAudioMixingStateChanged(int state, int errorCode) {
            if (whiteSdk != null) {
                /**
                * 混音 API 完成后的状态回调
                * @param state 混音状态
                *  710: 成功调用 startAudioMixing 或 resumeAudioMixing
                *  711: 成功调用 pauseAudioMixing
                *  713: 成功调用 stopAudioMixing
                *  714: 播放失败,error code 会有具体原因,
                * @param errorCode 当播放失败时,该值有意义
                */
                whiteSdk.getAudioMixerImplement().setMediaState(state, errorCode);
            }
        }
    };