在线咨询
专属客服在线解答,提供专业解决方案
声网 AI 助手
您的专属 AI 伙伴,开启全新搜索体验

如何判断一个通话是语音通话还是视频通话

在开发实时音视频应用时,准确识别当前通话类型是一个常见但关键的需求。无论是为了优化用户界面显示、调整网络带宽策略,还是实现精准的数据统计和计费逻辑,开发者都需要在运行时动态判断用户正在进行的是语音通话还是视频通话。特别是在多人会议、一对一通话、在线教育等场景中,用户可能会在通话过程中动态切换音视频模式——比如从纯语音通话升级到视频通话,或者因网络原因临时关闭视频。这就要求我们的应用能够实时、准确地识别通话状态的变化。

本文将详细介绍如何使用声网实时音视频(RTC)SDK 来判断和监测通话类型,涵盖初始化配置、运行时状态监听、回调函数使用等多个维度,帮助开发者构建更智能、更稳定的实时通信应用。

 

1. 通话前的设置

在开始通话之前,可以通过初始化时的配置来确定通话类型。例如,在创建 AgoraRtcEngine 实例时,可以通过指定相关参数来设置通话类型。不过,这种方式并不适用于所有场景,因为通话类型可能在通话过程中发生变化。

需要特别注意的是,初始配置并不能完全确定整个通话周期的类型,因为:

  • 用户可能在通话中动态开启/关闭摄像头
  • 远端用户可能发送或停止发送视频流
  • 网络状况可能导致视频流的中断与恢复

因此,实际应用中更推荐使用运行时状态监听的方式来动态判断通话类型。

 

2. 通话中的判断

实时音视频通话过程中,声网 SDK 提供了一系列回调函数来实时报告远端用户的音视频状态变化。通过监听这些回调,可以准确判断当前通话是语音通话还是视频通话。

2.1 使用 onRemoteVideoStateChanged 回调

  • 回调函数onRemoteVideoStateChanged
  • 说明:这个回调函数用于报告远端用户的视频状态变化。
  • 判断逻辑
    • 如果收到了 onRemoteVideoStateChanged 回调,并且回调中的 state 参数为 REMOTE_VIDEO_STATE_STARTING 或 REMOTE_VIDEO_STATE_DECODING,则可以判断当前通话为视频通话。
rtcEngine.setOnRemoteVideoStateChanged(new IRtcEngineEventHandler() {
    @Override
    public void onRemoteVideoStateChanged(uid, state, reason, elapsed) {
        if (state == REMOTE_VIDEO_STATE_STARTING || state == REMOTE_VIDEO_STATE_DECODING) {
            // 当前通话为视频通话
        }
    }
});

2.2 使用 onRemoteAudioStateChanged 回调

  • 回调函数onRemoteAudioStateChanged
  • 说明:这个回调函数用于报告远端用户的音频状态变化。
  • 判断逻辑
    • 如果未收到 onRemoteVideoStateChanged 回调,但收到了 onRemoteAudioStateChanged 回调,并且回调中的 state 参数为 REMOTE_AUDIO_STATE_STARTING 或 REMOTE_AUDIO_STATE_DECODING,则可以判断当前通话为语音通话。
rtcEngine.setOnRemoteAudioStateChanged(new IRtcEngineEventHandler() {
    @Override
    public void onRemoteAudioStateChanged(uid, state, reason, elapsed) {
        if (state == REMOTE_AUDIO_STATE_STARTING || state == REMOTE_AUDIO_STATE_DECODING) {
            // 当前通话为语音通话
        }
    }
});

 

3. 通话状态枚举

在某些情况下,你可能需要使用通话状态枚举来进一步确认通话类型。以下是一些常见的通话状态枚举及其描述:

3.1 CallStateType(通话状态枚举)

状态 说明 应用场景
Idle 0 未准备好通话状态 需要先调用 prepareForCall 准备通话环境
Prepared 1 空闲,可以进行通话 调用 prepareForCallcancelCallrejecthangup 后进入
Calling 2 呼叫中 已发起呼叫或收到对端用户呼叫
Connecting 3 连接中 呼叫已被接受,正在建立连接
Connected 4 通话中 通话已成功建立,可以进行音视频通信
Failed 10 出现错误 RTM 服务断线或初始化失败

3.2 CallType(通话类型枚举)

类型 说明
Video 0 视频呼叫(包含音频+视频)
Audio 1 音频呼叫(仅音频)

 

4. 示例代码

以下是一个完整的示例代码,展示了如何在 Android 平台上使用声网 RTC SDK 判断通话类型:

import io.agora.rtc.RtcEngine;
import io.agora.rtc.video.VideoCanvas;
import io.agora.rtc.Constants;

public class CallActivity extends AppCompatActivity implements RtcEngineEventHandler {

    private RtcEngine rtcEngine;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_call);

        // 初始化 RTC 引擎
        rtcEngine = RtcEngine.create(this, "your_app_id", new RtcEngineEventHandler() {
            @Override
            public void onJoinChannelSuccess(String channel, final int uid, int elapsed) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // 加入频道成功
                    }
                });
            }

            @Override
            public void onRemoteVideoStateChanged(int uid, int state, int reason, int elapsed) {
                if (state == Constants.REMOTE_VIDEO_STATE_STARTING || state == Constants.REMOTE_VIDEO_STATE_DECODING) {

本文详细介绍了在声网 RTC SDK 中判断通话类型的多种方法,从初始配置到运行时监听,再到完整的代码实现。通过合理使用 onRemoteVideoStateChanged 和 onRemoteAudioStateChanged 回调,开发者可以准确识别和追踪通话状态的变化,从而构建更智能、用户体验更好的实时音视频应用。

在声网,连接无限可能

想进一步了解「对话式 AI 与 实时互动」?欢迎注册,开启探索之旅。

本博客为技术交流与平台行业信息分享平台,内容仅供交流参考,文章内容不代表本公司立场和观点,亦不构成任何出版或销售行为。