Android快速接入
Android快速实现音视频通话
实时视频通话能够拉近人与人之间的距离,帮助你的 APP 提高用户黏性。 本文介绍如何通过少量代码集成百度 RTC SDK ,快速实现高质量、低延迟的视频通话功能。
实现视频通话的步骤如下:
- 加入房间 调用 initWithAppID初始化SDK,并loginRtcRoomWithRoomName 加入房间。在 APP ID 一致的前提下,传入相同房间名的用户会进入同一个房间通话。
- 发布 / 订阅 加入房间后,两位主播可以手动发布音视频并互相订阅。 如果设置自动发布 或 自动订阅 ,则自动发布/订阅音视频。
1. 前期准备
在实现 Android 平台音视频 Demo 之前,你需要有以下准备:
- Android Studio 本文档基于2021.2.1 Patch 2 版本
- Android SDK
-
gradle
- 本文档基于 com.android.tools.build:gradle:3.4.1
- gradle-6.1.1-all.zip
- 申请百度智能云官网 APP ID,详见https://cloud.baidu.com/product/rtc.html
- 下载SDK https://cloud.baidu.com/doc/RTC/s/Hk29sqi42
- 两台运行 Android 4.4 或以上版本的移动设备。
- 可以访问互联网的计算机。确保你的网络环境没有部署防火墙,否则无法正常使用百度服务。
- 快速Demo 下载地址:https://doc.bce.baidu.com/bce-documentation/RTC/rtc_Android_release_fastdemo_20230413.zip
2. 创建项目
可以使用官网下载的Demo进行参考,也可自行创建项目导入SDK。下面是快速实现音视频通话的几个步骤:
(1)创建Android项目
按照以下步骤准备开发环境:如需创建新项目,在 Android Studio 里,依次选择 Phone and Tablet > Empty Activity,创建 Android 项目。 创建项目后,Android Studio 会自动开始同步 gradle, 稍等片刻至同步成功后再进行下一步操作。
(2)导入SDK
- 在项目的libs目录中增加 libbaidurtc.aar
- 如果需要使用变声能力/ 特效能力,需要在jniLibs目录中,增加 libsoundtouch.so / libBARDumix.so
- 修改你的项目中app module 下的 build.gradle,增加如下相关依赖配置项 apply plugin: 'com.android.application'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar'])
}
(3)添加网络及设备权限,在 /app/src/main/AndroidManifest.xml 文件中,在 <application 前面添加如下权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="19" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
3. 使用SDK实现音视频通话
(1) 初始化BaiduRtcRoom
需要调用initWithAppID 设置申请的APPID ,token; 调用setMediaServerURL 设置服务器地址,可使用Demo中默认的URL地址;也可用自己部署的信令服务器地址; 具体可参考 SDK初始化
// 初始化,如果公有云可以用默认token,如果私有云需要使用申请APPID时获取的token
mVideoRoom = BaiduRtcRoom.initWithAppID(this, mAppId, tokenStr);
// 设置是否开启控制台log输出,true输出到控制台,false不输出
BaiduRtcRoom.setVerbose(true);
// 状态上报
mVideoRoom.enableStatsToServer(true, "online");
// 设置回调
mVideoRoom.setBaiduRtcRoomDelegate(this);
// 设置url
mVideoRoom.setMediaServerURL(url);
// 是否房间模式,默认是 BDRTC_ROOM_NORMAL
mVideoRoom.setRoomMode(BaiduRtcRoom.BdRtcRoomMode.BDRTC_ROOM_NORMAL);
(2) 视频通话的用户界面中,通常有两个视图框,分别用于展示本地预览和远端视频
可直接在layout xml 文件中增加两个RTCVideoView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.baidu.rtc.RTCVideoView
android:id="@+id/local_rtc_video_view"
android:layout_width="240dp"
android:layout_height="320dp"
android:gravity="center_vertical" />
<com.baidu.rtc.RTCVideoView
android:id="@+id/remote_rtc_video_view"
android:layout_width="240dp"
android:layout_height="320dp"
android:layout_marginTop="10dp"
android:gravity="center_vertical" />
</LinearLayout>
RTCVideoView rtcLocalVideoView = findViewById(R.id.local_rtc_video_view);
RTCVideoView rtcRemoteVideoView = findViewById(R.id.remote_rtc_video_view);
或者也可通过新建RTCVideoView的方式创建
// 创建local
RTCVideoView rtcLocalVideoView = new RTCVideoView(mContext);
// 设置视频显示类型,SCALE_ASPECT_FIT 填充,其他显示类型,请查看官方文档
rtcVideoView.setScalingType(RTCVideoView.ScalingType.SCALE_ASPECT_FIT);
rootView.addView(rtcLocalVideoView);
// 创建remote
RTCVideoView rtcRemoteVideoView = new RTCVideoView(mContext);
// 设置视频显示类型,SCALE_ASPECT_FIT 填充,其他显示类型,请查看官方文档
rtcVideoView.setScalingType(RTCVideoView.ScalingType.SCALE_ASPECT_FIT);
rootView.addView(rtcRemoteVideoView);
(3) 设置本地预览
调用BaiduRtcRoom setLocalDisplay(rtcVideoView) 接口,具体可参考 视频本地渲染 开始预览,在Activity onCreate 或者 onResume()中添加开始预览
mVideoRoom.setLocalDisplay(rtcLocalVideoView);
mVideoRoom.startPreview();
(4) 配置BaiduRtcRoom参数
具体可参考 媒体参数配置
RtcParameterSettings cfg = RtcParameterSettings.getDefaultSettings();
cfg.EnableMultistream = true;
cfg.inputAudioChannel = 1;
// 音频输出通道数
cfg.outputAudioChannel = 1;
// 音频采样率
cfg.AudioFrequency = 48000;
// 自动发布
cfg.AutoPublish = true;
// 自动订阅用户
cfg.AutoSubScribe = true;
// 是否有视频
cfg.HasVideo = true;
// 是否有音频
cfg.HasAudio = true;
// 分辨率
cfg.VideoResolution = "640x480-800kbps";
// 或者用VideoWidth
cfg.VideoHeight = 640;
cfg.VideoWidth = 480;
// 视频最大码率
cfg.VideoMaxkbps = 800;
// 帧率
cfg.VideoFps = 15;
// 链接超时时间
cfg.ConnectionTimeoutMs = 5000;
// 链接读超时时间
cfg.ReadTimeoutMs = 5000;
if (Build.MANUFACTURER.contains("Ainemo")
|| Build.MODEL.contains("NV6001")
|| Build.MODEL.contains("NV6101")
|| Build.MODEL.contains("NV2001")
|| Build.MODEL.contains("NV5001")) {
cfg.AudioFrequency = 16000;
cfg.inputAudioChannel = 2;
cfg.outputAudioChannel = 2;
cfg.audioContentType = AudioAttributes.CONTENT_TYPE_MUSIC;
}
if (Build.MODEL.contains("ONEPLUS")) {
cfg.AudioSource = MediaRecorder.AudioSource.DEFAULT;
}
// 是否有远端音频,默认true
cfg.HasRemoteAudio = true;
// 是否有远端视频,默认true
cfg.HasRemoteVideo = true;
// 重连,cfg.enableAutoReconnect 如果设置true (默认是false),则SDK自动重连,如需业务侧实现重连,则置为false
// 若使用自动重连功能 cfg.enableListenNetwork 需为true(默认是true)
cfg.enableAutoReconnect = false;
// enable jitter deley can be stretched by retransmission packets
cfg.enableJitterRetransmission = true;
// 设置参数
mVideoRoom.setParamSettings(cfg, RtcParameterSettings.RtcParamSettingType.RTC_PARAM_SETTINGS_ALL);
(5) 登录房间 具体可参考接口文档 登录房间接口
// roomName:房间名; userId:用户Id; userName:用户名
mVideoRoom.loginRtcRoomWithRoomName(roomName, userId, userName);
(6) 设置远端画面预览 通过(2)获取到显示远端画面的RTCVideoView,调用BaiduRtcRoom setRemoteDisplay 接口,即可. setRemoteDisplay 可绑定userId,也可以不绑定userId,具体参考接口文档 远端画面渲染
// 绑定远端用户画面
mVideoRoom.setRemoteDisplay(rtcRemoteVideoView, userId);
完成以上步骤即可实现音视频通话,也可根据Demo查看多人布局效果,更多能力,请查看官网文档 https://cloud.baidu.com/doc/RTC/s/Hk0gh4qck ,或联系客服。