# 自定义音频采集和渲染

# 简介

实时音频传输过程中,JC SDK 会启动默认的音频模块进行采集和渲染。当遇到不支持系统标准 API 的音频设备的时候,或者希望使用自己已经拥有的音频模块进行音频采集和渲染的时候,您可以选择在音频被采集前自定义音频采集,也可以选择在音频播放前自定义音频渲染

# 前提条件

在自定义音频采集和渲染前,确保已经初始化了 JCMediaDevice 模块。

# 自定义音频采集

参照下述步骤,在音频输入前,修改音频输入源和采样率等参数:

  1. 发起通话前,将 JCMediaDevice 中 audioParam 的 autoStartAudioInputDevice (opens new window) 设置为 false。这种情况下才可以获取音频输入数据。
  2. 调用 inputCustomAudioData (opens new window) 自定义音频采集。 建议在一对一通话状态为连接中时或者加入频道成功后,在子线程不断的调用此方法传入音频数据。
  3. 在结束通话的时候,关闭子线程停止音频采集。
// 在开启前将 autoStartAudioInputDevice 属性设为 false
public void turnOffAutoStartAudioOutputDevice(){
    mMediaDevice.audioParam.autoStartAudioInputDevice = false;
}

Thread mCustomAudioInputThread = null;

// 自定义音频采集,在状态为连接中时或者加入频道成功后调用此方法
public void customizeAudioInput(){
    mCustomAudioInputThread = new Thread(() -> {
        int sampleRateHz = 8000;
        int channels = 1;

        // 自定义音频数据
        byte[] value = "Any String you want".getBytes();
        ByteBuffer buffer = ByteBuffer.allocateDirect(value.length);
        buffer.put(value);
        buffer.flip();

        // 将音频输入数据输入到媒体层
        while ((mCall != null && mCall.getActiveCallItem() != null) || (mMediaChannel != null && mMediaChannel.getState() == JCMediaChannel.STATE_JOINED)) {
            mMediaDevice.inputCustomAudioData(sampleRateHz, channels, buffer,0,0,0);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    });
};

# 自定义音频渲染

参照下述步骤,在音频播放前,修改音频输入源和采样率等参数:

  1. 发起通话前,将 JCMediaDevice 中 audioParam 的 autoStartAudioInputDevice (opens new window) 设置为 false。这种情况下才可以获取音频输出数据。
  2. 调用 getAudioOutputData (opens new window) 自定义音频渲染。建议在一对一通话状态为连接中时或者加入频道成功后,在子线程不断的调用此方法渲染音频数据。
  3. 在结束通话的时候,关闭子线程停止音频渲染。
// 在开启前将 autoStartAudioOutputDevice 属性设为 false
public void turnOffAutoStartAudioOutputDevice(){
    mMediaDevice.audioParam.autoStartAudioOutputDevice = false;
}

Thread mGetAudioOutputDataThread = null;


// 自定义音频渲染,在状态为连接中时或者加入频道成功后调用此方法
public void customizeAudioOutput(){
    mGetAudioOutputDataThread = new Thread(() -> {
        int sampleRateHz = 8000;
        int channels = 1;
        ByteBuffer buffer = ByteBuffer.allocateDirect(sampleRateHz / 100 * 2 * channels).order(ByteOrder.nativeOrder());

        // 获取音频输出数据
        while ((mCall != null && mCall.getActiveCallItem() != null) || (mMediaChannel != null && mMediaChannel.getState() == JCMediaChannel.STATE_JOINED)) {
            mMediaDevice.getAudioOutputData(sampleRateHz, channels, buffer);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    });
};
最后更新时间: 2021/4/1 17:07:52