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了吗?

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

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值