10个步骤!30分钟!让智能手表快速实现音视频通话功能!

作者 | 网易云信

编辑 | 小帅

最近云信帮助很多客户爸爸

实现了智能手表的音视频通话功能,

听起来牛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了吗?

有人要向技术小哥表白吗?

小编要去跪谢技术小哥了!

点击“阅读原文”,不要怂,立马做起来!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值