# 自定义音频采集和渲染

# 简介

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

# 前提条件

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

# 自定义音频采集

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

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

// 自定义音频采集,在状态为连接中时或者加入频道成功后调用此方法
private void runAudioInput()
{
    byte[] buff = GetFileData("文件路径");
    int len = buff.Length;
    int packetLen = 32 * 1024;
    int packetNum = len / packetLen;
    int num = 0;
    while (_inputThreadRun)
    {
        byte[] data = new byte[packetLen];
        Array.Copy(buff, num * packetLen, data, 0, packetLen);
        JCManager.shared().mediaDevice.inputCustomAudioData(16000, 1, data, packetLen, 0, 0, 0);
        num = (++num) % packetNum;
        Thread.Sleep(1000);
    }
}

private byte[] GetFileData(string fileUrl)
{
    FileStream fs = new FileStream(fileUrl, FileMode.Open, FileAccess.Read);
    try
    {
        byte[] buffur = new byte[fs.Length];
        fs.Read(buffur, 0, (int)fs.Length);
        return buffur;
    }
    catch (Exception ex)
    {
        //MessageBoxHelper.ShowPrompt(ex.Message);
        return null;
    }
    finally
    {
        if (fs != null)
        {
            //关闭资源
            fs.Close();
        }
    }
}

# 自定义音频渲染

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

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

// 自定义音频渲染,在状态为连接中时或者加入频道成功后调用此方法
private void runAudioOutput()
{
    Player.Start();
    while (_outputThreadRun)
    {
        byte[] data = new byte[1024];
        JCManager.shared().mediaDevice.getAudioOutputData(16000, 1, data, 1024);
        PcmPlay.Player.PutData(System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(data, 0), 1024);
    }
    Player.Stop();
}
最后更新时间: 2021/3/30 14:57:27