#实现多方通话

#实现多方通话

# 实现多方通话 本章将介绍如何实现多方视频通话,多方视频通话的 API 调用时序见下图:

# 获取设备权限 使用 checkSelfPermission (opens new window) 方法,在开启 Activity 时检查并获取 Android 移动设备的麦克风使用权限。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// 获取设备权限

requestPermission();

}

/*动态申请权限*/

private void requestPermission() {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||

ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED ||

ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA}, 1000);

}

}

}

# 初始化 调用

JCMediaDevice.create (opens new window)

JCMediaChannel.create (opens new window)

以初始化实现多方通话需要的模块。

// 声明对象

JCMediaDevice mMediaDevice;

JCMediaChannel mMediaChannel;

// 初始化函数

public boolean initialize(Context context) {

//1. 媒体类

mMediaDevice = JCMediaDevice.create(mClient, new JCMediaDeviceCallback() {

@Override

public void onCameraUpdate() {

}

@Override

public void onAudioOutputTypeChange(int i) {

}

@Override

public void onRenderReceived(JCMediaDeviceVideoCanvas jcMediaDeviceVideoCanvas) {

}

@Override

public void onRenderStart(JCMediaDeviceVideoCanvas jcMediaDeviceVideoCanvas) {

}

});

// 2. 媒体通道类

mMediaChannel = JCMediaChannel.create(client, mediaDevice, new JCMediaChannelCallback() {

@Override

public void onMediaChannelStateChange(int i, int i1) {

}

@Override

public void onMediaChannelPropertyChange(JCMediaChannel.PropChangeParam propChangeParam) {

}

@Override

public void onJoin(boolean b, int i, String s) {

}

@Override

public void onLeave(int i, String s) {

}

@Override

public void onStop(boolean b, int i) {

}

@Override

public void onQuery(int i, boolean b, int i1, JCMediaChannelQueryInfo jcMediaChannelQueryInfo) {

}

@Override

public void onParticipantJoin(JCMediaChannelParticipant jcMediaChannelParticipant) {

}

@Override

public void onParticipantLeft(JCMediaChannelParticipant jcMediaChannelParticipant) {

}

@Override

public void onParticipantUpdate(JCMediaChannelParticipant jcMediaChannelParticipant, JCMediaChannelParticipant.ChangeParam changeParam) {

}

@Override

public void onMessageReceive(String s, String s1, String s2) {

}

@Override

public void onInviteSipUserResult(int i, boolean b, int i1) {

}

@Override

public void onParticipantVolumeChange(JCMediaChannelParticipant jcMediaChannelParticipant) {

}

});

}

# 加入频道 调用

enableUploadAudioStream (opens new window)

开启音频流。若要开启视频,调用

enableUploadVideoStream (opens new window)

开启视频流。

// 1. 开启音频流

mMediaDeviceChannel.enableUploadAudioStream(true);

// 2. 开启视频流(语音无需调用此方法)

mMediaDeviceChannel.enableUploadVIdeoStream(true);

调用 join (opens new window),创建并加入频道。需要传入 channelIdOrUri 和

JCMediaChannel.JoinParam (opens new window)

channelId:媒体频道标识。

JCMediaChannelJoinParam:加入参数,没有则填 NULL。

mMediaChannel.join("222", null);

加入频道后自身会收到 onJoin (opens new window) 回调。其他成员会收到 onParticipantJoin (opens new window) 回调。

@Override

public void onJoin(boolean result, @JCMediaChannel MediaChannelReason int reason, String channelId) {

if (result) {

// 加入频道成功

} else {

// 加入频道失败

}

}

# 创建本地视频画面 加入频道后,调用

JCMediaChannel (opens new window)

中的

getSelfParticipant (opens new window)

获取频道内自身对象, 然后调用

JCMediaChannelParticipant (opens new window)

中的

startVideo (opens new window)

方法打开本地视频预览。返回对象为

JCMediaDeviceVideoCanvas (opens new window)。(调用此方法会打开摄像头)

// 打开本地视频预览

//界面UI

private FrameLayout mFLLocalVideo;

// 1.打开本地视频预览

JCMediaDeviceVideoCanvas localCanvas = mMediaChannel.getSelfParticipant().startVideo(JCMediaDevice.RENDER_FULL_CONTENT, JCMediaChannel.PICTURESIZE_LARGE);

// 2.将本地视频画面添加到画布中

mFLLocalVideo.addView(localCanvas.getVideoView());

# 创建远端视频画面 视频通话中,通常需要看到其他用户。加入频道后,调用

JCMediaChannel (opens new window)

中的

getParticipants (opens new window)

获取频道内所有成员对象。

然后调用

JCMediaChannelParticipant (opens new window)

类中的

startVideo (opens new window)

获取远端视频画面。返回对象为

JCMediaDeviceVideoCanvas (opens new window)。

startVideo (opens new window)

方法调用后,还需要调用

JCMediaChannel (opens new window)

中的

requestVideo (opens new window)

方法请求频道中其他用户的视频流。

//界面UI

private FrameLayout mFLRemoteVideo;

// 其他成员加入频道的回调

@Override

public void onParticipantJoin(JCMediaChannelParticipant participant) {

//1.打开远端视频预览

JCMediaDeviceVideoCanvas remoteCanvas = participant.startVideo(JCMediaDevice.RENDER_FULL_CONTENT,JCMediaChannel.PICTURESIZE_LARGE);

//2.将远端视频画面添加到界面UI中

mFLRemoteVideo.addView(remoteCanvas.getVideoView());

}

# 离开频道 调用

leave (opens new window)

方法可以离开当前频道。

mMediaChannel.leave();

在多方视频通话中,离开频道还需要调用

stopVideo (opens new window)

移除视频画面。

mParticipant.stopVideo();

离开频道后,自身收到

onLeave (opens new window)

回调,其他成员同时收到

onParticipantLeft (opens new window)

回调。

# 销毁本地和远端视频画面 调用

JCMediaChannelParticipant (opens new window)

里的

stopVideo (opens new window)

销毁本地和远端视频画面。

// 离开频道结果回调

@Override

public void onLeave(@JCMediaChannel.MediaChannelReason int reason, String channelId) {

...

// 销毁视频画面

mParticipant.stopVideo();

}

# 解散频道 如果想解散频道,可以调用下面的接口,此时所有成员都将被退出。

// 结束频道

mMediaChannel.stop();

在多方视频通话中,离开频道还需要调用

stopVideo (opens new window)

移除视频画面。

mParticipant.stopVideo();

解散频道后,发起结束的成员收到

onStop (opens new window)

回调,其他成员同时收到

onLeave (opens new window)

回调。 解散失败原因枚举值请参考

MediaChannelReason (opens new window)

@Override

public void onStop(boolean result, @JCMediaChannel.MediaChannelReason int reason) {

// 销毁视频, canvas 为 JCMediaDeviceVideoCanvas 对象实例

mParticipant.stopVideo();

canvas = null;

}

相关推荐

鄰近 碓冰嶺鐵道文化村
365bet滚球网

鄰近 碓冰嶺鐵道文化村

📅 01-05 👁️ 9963
日本和歌山/奈良刀根柿禮盒 (附送中秋飾物) 1盒8
beat365唯一官网

日本和歌山/奈良刀根柿禮盒 (附送中秋飾物) 1盒8

📅 12-22 👁️ 8427
CF都有哪些赛事?(cf都有哪些赛事可以玩)
365bet滚球网

CF都有哪些赛事?(cf都有哪些赛事可以玩)

📅 07-26 👁️ 8441
【欢乐颂2】取景地大曝光!那个美炸的小岛就在上海隔壁~白天小希腊,晚上荧光海…美翻了.
本晨数码专营店的便携显示器口碑怎么样?用后一周讲体验真相
米兔故事机怎么定时关机
365bet滚球网

米兔故事机怎么定时关机

📅 06-30 👁️ 4345
涌西新书
365bet滚球网

涌西新书

📅 08-26 👁️ 6827
如何定义好一个符合规范的url
beat365唯一官网

如何定义好一个符合规范的url

📅 08-13 👁️ 330
中国移动经纪人登录注册流程,看这篇就够用了!