文档反馈
文档反馈

当前通话信息

本章节主要介绍在通话过程中,您可能要用到的各种通话信息。包括:远程画面就绪通知、自己和正在说话的用户的音量汇报等。

实现 AVChatStateObserver 监听通话过程中状态变化。被叫方同意来电请求后,SDK 自动进行音视频服务器连接,并返回相应信息供上层应用使用。

public class AVChatActivity implements AVChatStateObserver {
    AVChatManager.getInstance().observeAVChatState(this, register);
}

当前用户加入房间通知

当前用户加入房间会返回服务器连接是否成功的回调 onJoinedChannel,并通过返回的 result code 做相应的处理。

    /**
     * 服务器连接回调
     *
     * @param code      加入服务器结果 {@link AVChatResCode.JoinChannelCode}
     * @param audioFile 如果存在服务器录制,指向语音文件.自v6.6.0开始已废弃。
     * @param videoFile 如果存在服务器录制,指向视频文件.自v6.6.0开始已废弃。
     * @param elapsed 从下面三个相关调用处开始计算,到成功加入房间的耗时,单位ms
     * @see AVChatManager#call2(String, AVChatType, AVChatNotifyOption, AVChatCallback)
     * @see AVChatManager#accept2(long, AVChatCallback)
     * @see AVChatManager#joinRoom2(String, AVChatType, AVChatCallback)
     */
    void onJoinedChannel(int code, String audioFile, String videoFile, int elapsed);
参数 说明
code 返回加入频道是否成功。常见错误码参考 JoinChannelCode
audioFile 在开启服务器录制的情况下返回语音录制文件的保存路径。自v6.6.0开始已废弃。
videoFile 在开启服务器录制的情况下返回语音视频文件的保存路径。自v6.6.0开始已废弃。
elapsed 从开始加入房间关调用处开始计算,到成功加入房间的耗时,单位ms
@Override
public void onJoinedChannel(int code, String audioFile, String videoFile, int elapsed) { }

其他用户加入房间通知

其他用户音视频服务器连接成功后,会回调 onUserJoined,可以获取当前通话的用户帐号。

    /**
     * 用户加入频道
     *
     * @param account 用户账号
     * @see AVChatManager#call2(String, AVChatType, AVChatNotifyOption, AVChatCallback)
     * @see AVChatManager#accept2(long, AVChatCallback)
     * @see AVChatManager#joinRoom2(String, AVChatType, AVChatCallback)
     */
    void onUserJoined(String account);
参数 说明
account 用户账号。
@Override
public void onUserJoined(String account) {
// 如果是视频通话,需要设置远端用户视频画布
AVChatManager.getInstance().setupRemoteVideoRender(String account, IVideoRender render, boolean mirror, int scalingType);
}

当前用户离开房间通知

自己成功离开频道回调 onLeaveChannel

    /**
     * 退出频道.
     *
     * @see AVChatManager#hangUp2(long, AVChatCallback)
     * @see AVChatManager#leaveRoom2(String, AVChatCallback)
     */
    void onLeaveChannel();
@Override
public void onLeaveChannel() {}

其他用户离开房间通知

通话过程中,若有用户离开,则会回调 onUserLeave

    /**
     * 用户离开频道
     *
     * @param account 用户ID
     * @param event   {@link AVChatUserQuitType}
     * @see AVChatManager#hangUp2(long, AVChatCallback)
     * @see AVChatManager#leaveRoom2(String, AVChatCallback)
     */
    void onUserLeave(String account, int event);
参数 说明
account 用户账号。
event 用户退出类型定义,常见类型参考 AVChatUserQuitType
// @param event   -1,用户超时离开  0,正常退出
@Override
public void onUserLeave(String account, int event) {}

版本协议不兼容回调

若语音视频通话双方软件版本不兼容,则会回调 onProtocolIncompatible

    /**
     * 双方协议版本不兼容
     *
     * @param status 0 自己版本过低  1 对方版本过低
     */
    void onProtocolIncompatible(int status);
参数 说明
status 0 自己版本过低 1 对方版本过低。
// @param status 0 自己版本过低  1 对方版本过低
@Override
public void onProtocolIncompatible(int status) {}

服务器断开回调

通话过程中,从服务器断开连接, 当自己断网超时后,会回调 onDisconnectServer

    /**
     * 从服务器断开连接, 当自己断网后超时后,会收到此通知。
     */
    void onDisconnectServer();
@Override
public void onDisconnectServer() {}

音视频连接成功建立回调

音视频连接建立,会回调 onCallEstablished。音频切换到正在通话的界面,并开始计时等处理。视频则通过为用户设置对应画布并添加到相应的 layout 上显示图像。

    /**
     * 会话成功建立.
     */
    void onCallEstablished();
@Override
public void onCallEstablished() {
    if (state == AVChatTypeEnum.AUDIO.getValue()) {
        aVChatUIManager.onCallStateChange(CallStateEnum.AUDIO);
    } else {
        aVChatUIManager.initSmallSurfaceView();
        aVChatUIManager.onCallStateChange(CallStateEnum.VIDEO);
    }
    isCallEstablished = true;
}

音视频设备状态通知

音视频设备状态发生改变时,会回调 onDeviceEvent

    /**
     * 语音采集设备和视频采集设备事件通知
     *
     * @param code 事件ID
     * @param desc 事件描述
     * @see com.netease.nimlib.sdk.avchat.constant.AVChatDeviceEvent
     */
    void onDeviceEvent(int code, String desc);
参数 说明
code 事件ID,参考AVChatDeviceEvent
desc 事件描述。
@Override
public void onDeviceEvent(String account, int code, String desc) {}

截图结果回调

用户执行截图后会回调 onTakeSnapshotResult

    /**
     * 截取用户图像后的结果通知。
     *
     * @param account 被截图用户的账号
     * @param success 截图是否成功
     * @param file    截图成功后图像存储路径
     * @see AVChatManager#takeSnapshot(String)
     */
    void onTakeSnapshotResult(String account, boolean success, String file);
参数 说明
account 被截图用户的账号。
success 截图是否成功。
file 截图成功后图像存储路径,图像保存路径是 /Sdcard/Android/data/{app_package_name}/files/snapshot。
@Override
public void onTakeSnapshotResult(String account, boolean success, String file) {}

本地网络类型发生改变回调

本地客户端网络类型发生改变时回调,会通知当前网络类型。

    /**
     * 客户端网络类型发生了变化
     *
     * @param netType 当前的网络类型
     * @see com.netease.nimlib.sdk.avchat.constant.AVChatConnectionType
     */
    void onConnectionTypeChanged(int netType);
参数 说明
netType 当前的网络类型,参考AVChatConnectionType
@Override
public void onConnectionTypeChanged(int netType) {}

用户第一帧画面通知

当用户第一帧视频画面绘制前通知。

    /**
     * 用户第一帧视频数据绘制前通知.
     *
     * @param account 用户账号
     */
    void onFirstVideoFrameAvailable(String account);
参数 说明
account 用户账号。
@Override
public void onFirstVideoFrameAvailable(String account) {}

用户第一帧画面绘制后通知

当用户第一帧视频画面绘制后通知。

    /**
     * 第一帧绘制通知
     *
     * @param account 用户账号
     */
    void onFirstVideoFrameRendered(String account);
参数 说明
account 用户账号。
@Override
public void onFirstVideoFrameRendered(String account) {}

用户视频画面分辨率改变通知

当用户视频画面的分辨率改变时通知。

    /**
     * 用户画面尺寸改变通知
     *
     * @param account   用户账号
     * @param width  视频宽
     * @param height 视频高
     * @param rotate 视频角度
     */
    void onVideoFrameResolutionChanged(String account, int width, int height, int rotate);
参数 说明
account 用户账号。
width 视频宽。
height 视频高。
rotate 视频角度。
@Override
public void onVideoFrameResolutionChanged(String user, int width, int height, int rotate) {}

用户视频帧率汇报

实时汇报用户的视频绘制帧率。

    /**
     * 用户视频画面fps更新, 需要设置参数 {@link AVChatParameters#KEY_VIDEO_FPS_REPORTED}.
     *
     * @param account 用户账号
     * @param fps     当前绘制帧率
     * @see AVChatParameters#KEY_VIDEO_FPS_REPORTED
     * @see AVChatManager#setParameter(AVChatParameters.Key, Object)
     */
    void onVideoFpsReported(String account, int fps);
参数 说明
account 用户账号。
fps 当前绘制帧率。
@Override
public void onVideoFpsReported(String account, int fps) {}

采集视频数据回调

当用户开始外部视频处理后,采集到的视频数据通过此回调通知。 用户可以对视频数据做相应的美颜等不同的处理。 需要通过setParameters开启视频数据处理,根据情况选择开启新的或者老的数据回调,推荐使用新的数据回调方式。

parameters.setBoolean(AVChatParameters.KEY_VIDEO_FRAME_FILTER, on);//开启老的视频数据回调
parameters.setBoolean(AVChatParameters.KEY_VIDEO_FRAME_FILTER_NEW, on);//开启新的视频数据回调
/**
     * 视频数据外部处理接口, 此接口需要同步执行. 操作运行在视频数据发送线程上,处理速度过慢会导致帧率过低
     *
     * @param frame          待处理数据
     * @param maybeDualInput 如果为 {@code true} 则代表需要外部输入两路数据,
     *                       {@link AVChatVideoFrame#data} 处理后的原始数据,{@link AVChatVideoFrame#dataMirror} 处理后的镜像数据。
     *                       如果为  {@code false} 则代表仅需要外部输入一路数据,仅支持 {@link AVChatVideoFrame#data}。
     *                       在实际使用过程中,用户需要根据自己需求来决定是否真正需要输入镜像数据,一般在使用到水印等外部处理时才会需要真正输入两路数据,其他情况可以忽略此参数。
     * @return 返回true成功
     */
    boolean onVideoFrameFilter(AVChatVideoFrame frame, boolean maybeDualInput);
参数 说明
frame 待处理数据,参考AVChatVideoFrame
maybeDualInput 是否需要外部输入两路数据,如果为 true 则代表需要外部输入两路数据。
@Override
public boolean onVideoFrameFilter(AVChatVideoFrame frame, boolean maybeDualInput)) {}
/**
 * 视频数据外部处理接口, 此接口需要同步执行. 操作运行在视频数据发送线程上,处理速度过慢会导致帧率过低
 * @param input          待处理数据
 * @param outputFrames   {@link com.netease.nrtc.sdk.video.VideoFrame[0]} 处理后的数据,{@link com.netease.nrtc.sdk.video.VideoFrame[1]} 处理后的镜像数据。
 *                       在实际使用过程中,用户需要根据自己需求来决定是否真正需要输入镜像数据,一般在使用到水印等外部处理时才会需要真正输入两路数据,其他情况可以忽略此参数。
 * @param filterParameter 待处理数据的参数
 * @return 返回true成功
 */
boolean onVideoFrameFilter(final com.netease.nrtc.sdk.video.VideoFrame input, com.netease.nrtc.sdk.video.VideoFrame[] outputFrames, VideoFilterParameter filterParameter);
参数 说明
input 待处理数据,统一用VideoFrame封装,可能是I420/NV/Texture格式
outputFrames outputFrames[0]处理后的数据,outputFrames[1]处理后的镜像数据
filterParameter 待处理参数 ,参考 VideoFilterParameter
@Override
boolean onVideoFrameFilter(final VideoFrame input, VideoFrame[] outputFrames, VideoFilterParameter filterParameter){
    ...
        if(format == VideoFrameFormat.kVideoTexture) {
            innerVideoEffect.init(getApplicationContext(), true, true);
        }else{
            innerVideoEffect.init(getApplicationContext(), true, false);
        }
    ...
         if (frame.getBuffer().getFormat() == VideoFrameFormat.kVideoTexture) {
            return  filterTextureFrame(frame,outputFrames,filterParameter);
        } else {
            return filterByteBufferFrame(frame, outputFrames, filterParameter);
        }
    ...
}

采集语音数据回调

当用户开始外部语音处理后,采集到的语音数据通过此回调通知。 在此回调中用户可以对语音数据做相应的变声等不同的处理。需要通过setParameters开启语音数据处理。

    /**
     * 语音数据处理接口, 不要改变数据的长度. 需要设置参数 {@link AVChatParameters#KEY_AUDIO_FRAME_FILTER}.
     *
     * @param frame 语音帧
     * @return 返回false 失败
     * @see AVChatParameters#KEY_AUDIO_FRAME_FILTER
     * @see AVChatManager#setParameter(AVChatParameters.Key, Object)
     */
    boolean onAudioFrameFilter(AVChatAudioFrame frame);
参数 说明
frame 语音帧。
@Override
public boolean onAudioFrameFilter(AVChatAudioFrame frame) {}

语音播放设备变化通知

当用户切换扬声器或者耳机的插拔等操作时, 语音的播放设备都会发生变化通知。

    /**
     * 音频设备变化
     *
     * @param device 语音设备
     * @param set 可选语音设备
     * @param shouldSelect 如果为true,可以弹框选择蓝牙外放、耳机外放选项
     * @see AVChatAudioDevice
     */
    void onAudioDeviceChanged(int device, Set<Integer> set, boolean shouldSelect);
参数 说明
device 语音播放设备,具体类型参考AVChatAudioDevice
set 可选语音设备列表,具体类型参考AVChatAudioDevice
shouldSelect 如果为true,可以弹框提醒用户选择蓝牙外放、耳机外放等选项,然后调用AVChatManagerLite#selectAudioDevice(int)方法完成选择。
@Override
public void onAudioDeviceChanged(int device, Set<Integer> set, boolean shouldSelect) {}

语音正在说话用户声音强度通知

正在说话用户的语音强度回调,包括自己和其他用户的声音强度。如果一个用户没有说话,或者说话声音小没有被参加到混音,那么这个用户的信息不会在回调中出现。

    /**
     * 汇报正在说话的用户。 需要设置参数 {@link AVChatParameters#KEY_AUDIO_REPORT_SPEAKER}.
     *
     * @param speakers    用户账号和声音强度的键值对
     * @param mixedEnergy 除去自己后,所有用户语音混音后的强度
     * @see AVChatParameters#KEY_AUDIO_REPORT_SPEAKER
     * @see AVChatManager#setParameter(AVChatParameters.Key, Object)
     */
    void onReportSpeaker(Map<String, Integer> speakers, int mixedEnergy);
参数 说明
speakers 用户账号和声音强度的键值对。
mixedEnergy 除去自己后,所有用户语音混音后的强度。
@Override
void onReportSpeaker(Map<String, Integer> speakers, int mixedEnergy) {}

伴音事件通知

当伴音出错或者结束时,通过此回调进行通知

    /**
     * 伴音事件
     *
     * @see com.netease.nimlib.sdk.avchat.constant.AVChatAudioMixingEvent#MIXING_ERROR
     * @see com.netease.nimlib.sdk.avchat.constant.AVChatAudioMixingEvent#MIXING_FINISHED
     * @see com.netease.nimlib.sdk.avchat.constant.AVChatAudioMixingEvent#MIXING_STARTED
     * @see AVChatManager#startAudioMixing(String, boolean, boolean, int, float)
     * @see AVChatManager#stopAudioMixing()
     */
    void onAudioMixingEvent(int event);
参数 说明
event 伴音事件类型,参考AVChatAudioMixingEvent
@Override
void onAudioMixingEvent(int event) {}

实时统计信息汇报

通过此回调通知实时统计信息。

    /**
     * 实时统计信息
     *
     * @param sessionStats 详细的统计信息
     */
    void onSessionStats(AVChatSessionStats sessionStats);
参数 说明
sessionStats 详细的统计信息,参考AVChatSessionStats
@Override
void onSessionStats(AVChatSessionStats sessionStats) {}
×

反馈成功

非常感谢您的反馈,我们会继续努力做得更好。