实时通话


实时通话分为视频通话和音频通话,与普通电话不同,它是基于网络的。

实时通话的数据流量

实时语音和实时视频的数据流量如下:

  • 实时语音:双向 170k bytes/minute
  • 实时视频:双向 2.5M~3M bytes/minute

监听呼入通话

通过注册相应 action 的 BroadcastReceiver 来监听呼叫过来的通话,接到广播后开发者可以调起 APP 里的通话 Activity。

IntentFilter callFilter = new IntentFilter(EMClient.getInstance().callManager().getIncomingCallBroadcastAction());
registerReceiver(new CallReceiver(), callFilter);

private class CallReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// 拨打方username
		String from = intent.getStringExtra("from");
		// call type
		String type = intent.getStringExtra("type");
                //跳转到通话页面

	}
}

监听通话状态

通过 addCallStateChangeListener 监听通话状态。

注意:在收到 DISCONNNECTED 回调时才能 finish 当前页面(保证通话所占用的资源都释放完),然后开始下一个通话。

EMClient.getInstance().callManager().addCallStateChangeListener(new EMCallStateChangeListener() {
    @Override
    public void onCallStateChanged(CallState callState, CallError error) {
        switch (callState) {
        case CONNECTING: // 正在连接对方
           
            break;
        case CONNECTED: // 双方已经建立连接
           
            break;

        case ACCEPTED: // 电话接通成功
           
            break;
        case DISCONNNECTED: // 电话断了

            break;
        case NETWORK_UNSTABLE: //网络不稳定
            if(error == CallError.ERROR_NO_DATA){
		//无通话数据
	    }else{
	    }
	    break;
	case NETWORK_NORMAL: //网络恢复正常
			
	    break;
        default:
            break;
        }

    }
});

详细回调请参考API Doc

拨打语音通话

/**
* 拨打语音通话
* @param to
* @throws EMServiceNotReadyException
*/
try {//单参数
	EMClient.getInstance().callManager().makeVoiceCall(username);
} catch (EMServiceNotReadyException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

try {//多参数
	EMClient.getInstance().callManager().makeVoiceCall(username,"ext 扩展内容");
} catch (EMServiceNotReadyException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

//获取扩展内容
 String callExt = EMClient.getInstance().callManager().getCurrentCallSession().getExt();

拨打视频通话

/**
* 拨打视频通话
* @param to
* @throws EMServiceNotReadyException
*/
try {//单参数
	EMClient.getInstance().callManager().makeVideoCall(username);
} catch (EMServiceNotReadyException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

try {//多参数
	EMClient.getInstance().callManager().makeVideoCall(username,"ext 扩展内容");
} catch (EMServiceNotReadyException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

//获取扩展内容
 String callExt = EMClient.getInstance().callManager().getCurrentCallSession().getExt();

视频通话需要显示自己和对方的图像,需要设置相应 surfaceview

接听通话

/**
* 接听通话
* @throws EMNoActiveCallException
* @throws EMNetworkUnconnectedException
*/
try {
	EMClient.getInstance().callManager().answerCall();
} catch (EMNoActiveCallException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (EMNetworkUnconnectedException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

拒绝接听

/**
* 拒绝接听
* @throws EMNoActiveCallException
*/
try {
	EMClient.getInstance().callManager().rejectCall();
} catch (EMNoActiveCallException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

挂断通话

/**
* 挂断通话
*/
EMClient.getInstance().callManager().endCall();

暂停和恢复语音或视频数据传输

暂停语音数据传输:

EMClient.getInstance().callManager().pauseVoiceTransfer()

恢复语音数据传输:

EMClient.getInstance().callManager().resumeVoiceTransfer()

暂停视频(图像)数据传输:

EMClient.getInstance().callManager().pauseVideoTransfer()

恢复视频(图像)数据传输:

EMClient.getInstance().callManager().resumeVideoTransfer()

调用后对方会收到相应VOICE_PAUSE、VOICE_RESUME、VIDEO_PAUSE、VIDEO_RESUME的callstate的变动通知。

视频通话设置显示自己和对方图像的 surfaceView

视频通话需要预先设置 localSurfaceView、oppositeSurfaceView, 而且必须在Activity.onCreate(Context context)方法中设置,之后才能正确捕捉 Surface 的变化。

EMClient.getInstance().callManager().setSurfaceView(localSurface, oppositeSurface);

视频通话处理本地摄像头数据

视频通话时如果需要处理摄像头数据,需实现 EMCameraDataProcessor 接口,并设置到 callManager。

/** @param bytes 回调的数据
     * @param camera 相机对象
     * @param width 采集画面的宽
     * @param height 采集画面的高
     * @param rotateAngle 画面旋转角度
     */
class MyDataProcessor implements EMCallManager.EMCameraDataProcessor {
        @Override
        public void onProcessData(byte[] bytes, Camera camera, int width, int height,int rotateAngle) {
            //把data中的数据替换成自己处理过的
        }
}
EMClient.getInstance().callManager().setCameraDataProcessor(new MyDataProcessor());

切换摄像头

视频通话时如果有前置摄像头,默认使用前置的,提供切换 API 切换到别的摄像头。

EMClient.getInstance().callManager().switchCamera();

更多视频通话相关 API

视频通话相对复杂,把视频相关的一些 API 封装到了 EMVideoCallHelper 里。

获取 CallHelper

EMVideoCallHelper callHelper = EMClient.getInstance().callManager().getVideoCallHelper();

设置通话最大帧率

设置通话最大帧率,SDK 最大支持(30),默认(20)

EMClient.getInstance().callManager().getCallOptions().setMaxVideoFrameRate(30);

视频截图

callHelper.takePicture(filepath);

设置图像分辨率

设置视频通话分辨率 默认是(640, 480)

EMClient.getInstance().callManager().getCallOptions().setVideoResolution(640, 480);

设置视频比特率

设置视频通话最大和最小比特率(可以不设置,SDK会根据手机分辨率和网络情况自动适配),最大值默认800, 最小值默认80

EMClient.getInstance().callManager().getCallOptions().setMaxVideoKbps(800);
 EMClient.getInstance().callManager().getCallOptions().setMinVideoKbps(80);

离线推送

音视频呼叫对方,如果对方不在线,则发送一条离线消息通知对方(true推送,false不推送)

EMClient.getInstance().callManager().getCallOptions().setIsSendPushIfOffline(false);

音视频采样率

设置音视频采样率,一般不需要设置,除非采集声音有问题才需要手动设置(默认值48000),根据自己硬件设备确定

EMClient.getInstance().callManager().getCallOptions().setAudioSampleRate(48000);

录制视频

录制视频,参数为录制的文件存储目录。

callHelper.startVideoRecord(dirPath);

停止录制

停止录制,此方法返回录制完成的视频的完整路径。

callHelper.stopVideoRecord();

详细文档请参考 Java Doc


上一页:聊天室管理

下一页:红包集成