作者 | 网易云信
编辑 | 小帅
最近云信帮助很多客户爸爸
实现了智能手表的音视频通话功能,
听起来牛X轰轰的样子!
但是听说操作非常简单,
技术小白也能秒秒钟干大事!
小编赶紧屁颠屁颠跑去抱住我们技术小哥的
大腿!
求造福技术小白,
求带飞~
小哥哥给了我一份详细攻略,
只要10个步骤,
一共不超过30分钟,
就可以让智能手表快速实现音视频通话功能!
Duang Duang Duang,
准备好了吗?
我要献出攻略了!
前期准备做好了吗?
1. 到云信管理后台注册账号,创建应用,获取Appkey,申请音视频权限开通;
2. 下载独立音视频SDK。
大概思路是这样的:
a. 在Activity上放两个EditText,一个用来输入用户id(uid),一个用来输入频道名(channelName);
b. 再放三个SwitchCompat用来选择模式,视频还是音频模式,安全模式还是非安全模式(非安全模式适合调试,安全模式适合上线),低功耗开还是关闭(手表专用);
c. 最后放一个Button来加入房间实现音视频通话。
噜起袖子就是干!!
01
先来开始创建工程,打开Android Studio,File – New – New Project
02
按照文档里的方式,手动集成SDK
03
因为我们需要麦克风、相机以及其他的权限,在Androidmanifest.xml中根据文档配置相应的权限
04
然后我们配置一个简单的登录页面,打开activity_main.xml,拖进去两个EditText,宽度设置为match_parent;3个SwitchCompat使用LinearLayout,使其在一条水平位置上,并且视频模式默认开启,设置android:checked=”true”;1个Button,位置居于layout_centerInParent
05
界面简单的搭好之后,这样才能愉快的写代码~
最最最干货的代码部分
前面提到的开发思路,关键点只有三个部分,打开视频模式,关闭安全模式(测试时关闭,上线时打开),关闭低功耗模式(手表需打开),只要用好这三个模式,就可以实现音视频通话的能力了。
在使用前,先配置Application,这里就使用NrtcApplication,
并且在Androidmanifest.xml中声明,保证应用可以正常启动
首先是声明和初始化。
打开MainActivity,首先初始化控件,并且在这里还需要监听他们的事件,所以需要去实现onClickListener,加好后如下所示
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.SwitchCompat;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText uid;
private EditText channelName;
private SwitchCompat safeMode;
private SwitchCompat videoMode;
private SwitchCompat lowEnergy;
private Button start;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uid = findViewById(R.id.uid);
channelName = findViewById(R.id.chanelName);
safeMode = findViewById(R.id.safeMode);
videoMode = findViewById(R.id.videoMode);
lowEnergy = findViewById(R.id.lowEnergy);
start = findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startRTC();
}
});
}
}
准备好已经初始化的控件对象以及监听之后,在做通话前的一次check,对这些条件做一些判断(这里视频模式开启,低功耗关闭,安全模式关闭)
public void startRTC(){
String userId = uid.getText().toString();
String channel = channelName.getText().toString();
if(TextUtils.isEmpty(userId)){
uid.setError("缺少uid");
return;
}
if(TextUtils.isEmpty(channel)){
channelName.setError("缺少channel");
return;
}
ChatActivity.launch(this,Long.parseLong(userId),channel,videoMode.isChecked(),safeMode.isChecked(),lowEnergy.isChecked());
}
那这个launch方法是什么呢,其实就是在MainActivity中做一个跳转到ChatActivity的操作
public static void launch(Context context,
long uid,
String channel,
boolean videoMode,
boolean safeMode,
boolean lowEnergy) {
Intent intent = new Intent();
intent.putExtra("uid", uid);
intent.putExtra("channel", channel);
intent.putExtra("videoMode", videoMode);
intent.putExtra("safeMode", safeMode);
intent.putExtra("lowEnergy", lowEnergy);
intent.setClass(context, ChatActivity.class);
context.startActivity(intent);
}
那既然从MainActivity中传递过来的参数,那我在ChatActivity中要先接受了,用不用以后在说
private void configFromIntent(Intent intent) {
uid = intent.getLongExtra("uid", 100);
channel = intent.getStringExtra("channel");
videoMode = intent.getBooleanExtra("videoMode", false);
safeMode = intent.getBooleanExtra("safeMode", false);
lowEnergy = intent.getBooleanExtra("lowEnergy", false);
}
那既然我们都接受了从MainActivity了,那是不是要做一点正经事了(注,以下所有的操作都是在ChatActivity的onCreate方法中实现
1, 初始化NRTC的实例(创建NRTC实例,随时有可能出现RuntimeException,UnsatisfiedLinkError异常),create之后需要通话dispose释放资源
try{
//1, 创建nrtc的实例,是否区分低功耗
nrtc = (NRtcEx) NRtc.create(this, "f097ff62d4aa8e0a6dbb138c96d492c7", lowEnergy,this);
}catch (Exception e){
e.printStackTrace();
}
2, 设置共享的EGL Context,最后需要释放
// 2, 设置共享EGL Context, 最后需要释放
mEglContext = EglContextWrapper.createEglContext();
if (mEglContext.isEGL14Supported()) {
nrtc.updateSharedEGLContext((EGLContext) mEglContext.getEglContext());
}
3, 设置通话Profile(目前有三种,默认模式,高清音乐模式,自适应高清音乐模式)
// 3, 设置通话Profile
nrtc.setChannelProfile(NRtcConstants.ChannelProfile.CHANNEL_PROFILE_DEFAULT);
4, 参数+配置,区分是否是低功耗的模式
// 4, 参数家配置,区分是否低功耗
if(lowEnergy) {
nrtc.setParameter(NRtcParameters.KEY_AUDIO_CALL_PROXIMITY, false); //关闭语音通话距离感应
nrtc.setParameter(NRtcParameters.KEY_DEVICE_FIXED_ROTATION, Surface.ROTATION_0); //固定旋转角度, 关闭设备旋转监听
nrtc.setParameter(NRtcParameters.KEY_AUDIO_EFFECT_ACOUSTIC_ECHO_CANCELER, NRtcConstants.AudioEffectMode.AUDIO_EFFECT_MODE_SDK_BUILTIN_PRIORITY); //使用软件AEC处理
nrtc.setParameter(NRtcParameters.KEY_AUDIO_EFFECT_NOISE_SUPPRESSOR, NRtcConstants.AudioEffectMode.AUDIO_EFFECT_MODE_DISABLE); //关闭语音降噪
nrtc.setParameter(NRtcParameters.KEY_VIDEO_ENCODER_MODE, NRtcConstants.MediaCodecMode.MEDIA_CODEC_HARDWARE); //强制使用视频硬件编码
nrtc.setParameter(NRtcParameters.KEY_VIDEO_DECODER_MODE, NRtcConstants.MediaCodecMode.MEDIA_CODEC_HARDWARE); //强制使用视频硬件解码
nrtc.setParameter(NRtcParameters.KEY_VIDEO_QUALITY, NRtcConstants.VideoQuality.QUALITY_MEDIUM); //使用中等清晰度, 320x240
nrtc.setParameter(NRtcParameters.KEY_VIDEO_FRAME_RATE, NRtcConstants.VideoFrameRate.FRAME_RATE_10); //视频帧率10fps
nrtc.setParameter(NRtcParameters.KEY_VIDEO_FIXED_CROP_RATIO, NRtcConstants.VideoCropRatio.CROP_RATIO_4_3); //裁剪比例4:3
} else {
nrtc.setParameter(NRtcParameters.KEY_VIDEO_FRAME_RATE, NRtcConstants.VideoFrameRate.FRAME_RATE_10); //视频帧率10fps
nrtc.setParameter(NRtcParameters.KEY_VIDEO_QUALITY, NRtcConstants.VideoQuality.QUALITY_LOW); //使用低分辨率
nrtc.setParameter(NRtcParameters.KEY_VIDEO_FIXED_CROP_RATIO, NRtcConstants.VideoCropRatio.CROP_RATIO_9_8); //手机发送画面比例9:8
}
5, 创建视频采集器,并且设置(这边cameraCapturer是CameraCapturer对象)
/ 5, 创建视频采集器,并且设置
cameraCapturer = VideoCapturerFactory.createCameraCapturer();
nrtc.setupVideoCapturer(cameraCapturer);
6, 视频模式下需要激活视频模块,同时设置qos策略(流畅,清晰和录屏,这里使用清晰优先)
// 6, 视频模式下需要激活视频模块,同时设置qos策略
if (videoMode) {
nrtc.enableVideo();
nrtc.setVideoQualityStrategy(RtcVideoQualityStrategy.PreferImageQuality);
}
7, 创建本地预览画布,并且设置(这边userRenders是sdk内置的一个IVideoRender)
// 7, 创建本地预览画布,并且设置
IVideoRender localRender = createVideoRender();
userRenders.put(uid, localRender);
nrtc.setupLocalVideoRenderer(localRender, 0, false);
8, 开始视频预览
// 8, 开始视频预览
if (videoEnabled) {
nrtc.startVideoPreview();
}
9, 加入房间,开始音视频通话
nrtc.joinChannel(token, channelName, uid);
10, 收到对方加入(onuserjoin)的回调,渲染对方的画面
IVideoRender remoteRender = createVideoRender();
userRenders.put(uid, remoteRender);
nrtc.setupRemoteVideoRenderer(userRenders.get(uid), uid, scalingType, false);
是不是很简单,以上就是所有的代码,这里回顾一下前面的完整流程:
a. 新建和配置工程
b. 添加MainActivity的配置和界面搭载
c. 响应用户事件来调用sdk相关方法
d. 实现音视频通话的回调
一共就这么点代码,
搭个配置界面,
按照10个步骤
就可以实现音视频通话了!
一共只需要30分钟!
小哥哥小姐姐们都get了吗?
有人要向技术小哥表白吗?
小编要去跪谢技术小哥了!
点击“阅读原文”,不要怂,立马做起来!