通过设备管理API开发者可实现以下功能(各平台实现情况请参考各平台文档详情):
设备 | 功能 |
麦克风 | 检测麦克风状态 开关麦克风 获取麦克风音量 |
摄像头 | 检测摄像头状态 开关摄像头 切换摄像头 |
扬声器 | 检测扬声器状态 开关扬声器 获取扬声器音量 |
对于PC端,开发者可通过API实现设备列表的检测,并可对会议中使用的设备进行选择。 设备状态变更引起的参会者音视频状态的变更将通过事件回调进行通知。
前一章节实现了参会者布局功能,之后屏幕上就会渲染出我们想要的参会者画面,除了视频信息之外了我们还需要处理参会者的音视频状态,也就是媒体设备管理。因此,接下来我们了解一下设备管理的一些方法。 当会议链接成功时,系统会自动申请相机、麦克风、扬声器资源,因此我们一般操作媒体设备都会在收到会议链接成功回调之后进行。如下列举了常用的操作方法:
在视频采集方面,我们需要额外注意的一点就是在手机屏幕方向属相变更的时候摄像头的方向也会变更,此时我们需要将设备屏幕方向同步给SDK,这样才能保证远端的画面显示正常。开发者通过setOrientation方法来设置方向,参数为枚举类型,列举如下:
参会中修改摄像机和麦克风状态:
XyCallActivity.java
@Override
public void showCallConnected() {
...
if (getIntent().getBooleanExtra("muteVideo", false)) { //同步Camera预设状态
isVideoMute = true;
NemoSDK.getInstance().setVideoMute(isVideoMute);
setVideoState(isVideoMute);
}
if (getIntent().getBooleanExtra("muteAudio", false) && isMuteBtnEnable) { //同步Mic预设状态
updateMuteStatus(true);
}
...
}
@Override
public void onClick(View v) {
switch (v.getId()) {
...
case R.id.mute_mic_btn:
if (isMuteBtnEnable) {
updateMuteStatus(!NemoSDK.getInstance().isMicMuted()); //切换静音/非静音
} else { //会控强制静音 需要举手发言
// 举手/取消举手/结束发言
switch (muteStatus) {
case MuteStatus.HAND_UP:
NemoSDK.getInstance().handUp();
muteStatus = MuteStatus.HAND_DOWN;
btMuteMic.setImageResource(R.mipmap.ic_toolbar_handdown);
tvMuteMic.setText("取消举手");
break;
case MuteStatus.HAND_DOWN:
NemoSDK.getInstance().handDown();
muteStatus = MuteStatus.HAND_UP;
btMuteMic.setImageResource(R.mipmap.ic_toolbar_hand_up);
tvMuteMic.setText("举手发言");
break;
case MuteStatus.END_SPEACH:
NemoSDK.getInstance().endSpeech();
muteStatus = MuteStatus.HAND_UP;
btMuteMic.setImageResource(R.mipmap.ic_toolbar_hand_up);
tvMuteMic.setText("举手发言");
break;
}
}
break;
case R.id.close_video:
isVideoMute = !isVideoMute;
NemoSDK.getInstance().setVideoMute(isVideoMute); //设置Camera状态
setVideoState(isVideoMute);
break;
...
}
}
屏幕旋转时设置参数到SDK:
XyCallActivity.java
/**
* 示例代码为Activity界面中通过传感器返回屏幕orientation来设置横竖屏,
* 开发者也可以通过onConfigurationChanged回调中得到屏幕方向
*/
private class YourOrientationEventListener extends OrientationEventListener {
public YourOrientationEventListener(Context context) {
super(context);
}
@Override
public void onOrientationChanged(int orientation) {
int screenOrientation = getResources().getConfiguration().orientation;
if (((rotation >= 0) && (rotation < 45)) || (rotation > 315)) {
// 竖屏 0度:手机默认竖屏状态(home键在正下方)
// NOTE: 白板状态默认支持横屏 竖屏会拉伸变形, 画廊模式也默认横屏(口, 品, 田)
if (screenOrientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && screenOrientation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
...
NemoSDK.getInstance().setOrientation(Orientation.PORTRAIT);
}
} else if (rotation > 225 && rotation < 315) {
// 横屏 270度:手机顺时针旋转270度横屏,(home键在右侧)
...
NemoSDK.getInstance().setOrientation(Orientation.LANDSCAPE);
} else if (rotation > 45 && rotation < 135) {
// 反向横屏 90度:手机顺时针旋转90度横屏(home建在左侧)
...
NemoSDK.getInstance().setOrientation(Orientation.REVERSE_LANDSCAPE);
} else if (rotation > 135 && rotation < 225) {
}
}
}