# 通话管理

# 通话静音

JCSDK 提供了两种静音方式,分别用于静音扬声器和静音麦克风。静音扬声器则听不到对方的声音,静音麦克风则对方听不到本端的声音。

# 静音扬声器

按照以下步骤实现静音扬声器功能:

  1. 调用 JCCallItem 对象中的 getSpeakerMute 方法获取扬声器静音状态。返回 true 表示已静音,false 表示未静音。
  2. 调用 JCCall 中的 muteSpeaker 方法开启/取消扬声器静音功能。

示例代码

JCCallItem* item = call->getActiveCallItem();
if (item != NULL)
{
    if(item->getSpeakerMute())
    {
        // 取消扬声器静音
        call->muteSpeaker(item, false);
        // 开启扬声器静音
        call->muteSpeaker(item, true);
    }
    
}

# 静音麦克风

按照以下步骤实现静音麦克风功能:

  1. 调用 JCCallItem 对象中的 getMicrophoneMute 方法获取麦克风静音状态。返回 true 表示已静音,false 表示未静音。
  2. 调用 JCCall 中的 muteMicrophone 方法开启/取消麦克风静音功能。

示例代码

JCCallItem* item = call->getActiveCallItem();
if (item != NULL)
{
    if(item->getMicrophoneMute())
    {
        // 取消麦克风静音
        call->muteMicrophone(item, false);
        // 开启麦克风静音
        call->muteMicrophone(item, true);
    }
    
}

# 通话录音

可以在通话中进行录音,开启或关闭录音需要根据当前的录音状态来决定。如果正在录制或者通话被挂起或者挂起的情况下,不能进行音频录制。录音状态可通过 getAudioRecord (opens new window) 方法获取。

调用 audioRecord (opens new window) 方法开启或关闭通话录音。

void JCSampleDlg::OnBnClickedButton1Callrecordaudio()
{
    JCCallItem* item = JCManager::shared()->call->getActiveCallItem();
    if (item != NULL)
    {
        if (item->getAudioRecord())
        {
            //如果正在录制,则停止音频录制
            JCManager::shared()->call->audioRecord(item, false, "");
        }
        else
        {
            std::string filePath = "录制音频文件保存路径";
            //开始音频录制
            JCManager::shared()->call->audioRecord(item, true, filePath);
        }
    }
}

开启或关闭录音时,录音状态会发生改变,并通过 onCallItemUpdate (opens new window) 回调上报。

void JCManager::onCallItemUpdate(JCCallItem* item, JCCallItemChangeParam changeParam) {
}

# 视频通话录制

处于视频通话状态时可以对当前视频通话进行视频录制。调用 videoRecord (opens new window) 开启/关闭视频通话录制。

在开启视频录制前确保以下几点:

  1. 当前没有在录音。

  2. 确保远端/本地正在上传视频流。

  3. 当前处在非录制状态下。

示例代码

JCCallItem* item = call->getActiveCallItem();
if (item != NULL) {
    if (item->getLocalVideoRecord()) {
        // 如果本地视频录制已开启,则关闭本地录制
        call->videoRecord(item, false, false, 0, 0, "", false);
    } else if (item->getRemoteVideoRecord()) {
        // 如果远端视频录制已开启,则关闭远端录制
        call->videoRecord(item, false, true, 0, 0, "", false);
    } else {
        String localFilePath = "自定义文件存储路径";
        String remoteFilePath = "自定义文件存储路径";
        if (call.videoRecord(item, true, false, 600, 360, localFilePath, true)) {
            // 开始录制本地视频
        } else {
            // 调用失败
        }
        if (call.videoRecord(item, true, true, 600, 360, remoteFilePath, true)) {
            // 开始录制远端视频
        } else {
            // 调用失败
        }
    }
}

# 开启/关闭呼叫保持

调用 hold (opens new window) 方法对通话对象进行呼叫保持或解除呼叫保持(当通话对象处于被保持状态(即状态为held)时不可以进行此操作),开启或关闭呼叫保持需要根据 JCCallItem 对象当前的呼叫保持状态来决定。

//获取活跃通话对象
JCCallItem* item = JCManager::shared()->call->getActiveCallItem();
//获取通话对象的呼叫保持状态
bool isHeld = item->getHold();
if (item != NULL)
    {
    //开启或关闭呼叫保持
            JCManager::shared()->call->hold(item);
    }

# 开启/关闭视频流发送

调用 enableUploadVideoStream (opens new window) 方法开启或关闭视频流发送,该方法调用后会触发 onCallItemUpdate (opens new window) 回调。

JCCallItem* item = JCManager::shared()->call->getActiveCallItem();
    if (item != NULL)
    {
            JCManager::shared()->call->enableUploadVideoStream(item);
    }

该接口的具体作用机制如下图所示:

../../../../_images/enablevideostream.jpg

  • 如果 A 开启发送视频流,则 A 的 item->getUploadVideoStreamSelf() 返回值为 true,B 则通过 item->getUploadVideoStreamOther() 方法(此处返回值为 true)判断 A 的视频流发送状态。

  • 如果 A 关闭发送视频流,则 A 的 item->getUploadVideoStreamSelf() 返回值为 false,B 则通过 item->getUploadVideoStreamOther() 方法(此处返回值为 false)判断 A 的视频流发送状态。此时 B 将看不到 A 的画面。

# 切换活跃通话

调用 becomeActive (opens new window) 方法对通话中被保持的对象和活跃的通话对象进行切换。

//获取通话对象列表
std::list<JCCallItem*>* callItems = JCManager::shared()->call->getCallItems();
JCManager::shared()->call->becomeActive(callItems[1]);

# 通话中发送消息

调用 sendMessage (opens new window) 方法在通话中实现发消息的功能。

JCCallItem* item = JCManager::shared()->call->getActiveCallItem();
JCManager::shared()->call->sendMessage(item, "text", "消息内容");

当通话中收到消息时,会收到 onMessageReceive (opens new window) 回调。

void JCManager::onMessageReceive(const char* type, const char* content, JCCallItem* item)
{
    cout << "收到Call消息 " << item->getDisplayName() << " type:" << type << endl;
}

TIP

不建议在通话中发送图片类型的消息

# 相关回调

通话过程中,如果通话状态发生了改变,如开启关闭静音、开启关闭通话保持、活跃状态切换、开启关闭音视频流发送等,均会触发 onCallItemUpdate (opens new window) 回调。

void JCManager::onCallItemUpdate(JCCallItem* item, JCCallItemChangeParam changeParam)
{
    if (changeParam.mute) { // 开启静音
        ...
    } else if (changeParam.state) { // 通话状态变化
        ...
    } else if (changeParam.held) { // 被挂起变化
        ...
    } else if (changeParam.active) { // 活跃状态变化
        ...
    } else if (changeParam.netStatus) { // 网络状态变化
        ...
    }
    ...
}
最后更新时间: 2021/6/11 11:26:24