集成Android SDK
准备环境
本节将介绍如何创建项目,将BRTC SDK集成进你的项目中。
- Android Studio 3.2 或以上版本,Gradle 4.6或以上版本,编译环境请选择支持java8
- Android KK(4.4)及以上的设备
*注:经过验证的开发环境如下:
1 ------------------------------------------------------------
2 Gradle 4.6
3 ------------------------------------------------------------
4
5 Groovy: 2.4.12
6 Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017
7 JVM: 1.8.0_192 (Oracle Corporation 25.192-b12)
8 OS: Mac OS X 10.13.6 x86_64
下载SDK
maven方式
推荐使用 Maven 在项目中接入 RTC SDK,步骤如下:
SDK maven 版本列表: https://repo1.maven.org/maven2/com/baidubce/mediasdk/brtc/
1 implementation 'com.baidubce.mediasdk:brtc:2.xx.xx'
离线方式
进入RTC文档中心,点击“下载专区>SDK&Demo下载”,即可下载客户端SDK。下载后请校验下载的包md5值与SDK中心里记录的是否一致。
创建Android项目,若已有 Android 项目,可以直接集成 SDK
将SDK包内libbaidurtc.aar 拷贝到项目的libs目录.
集成SDK
maven依赖可以直接进行使用,离线方式需要手动添加依赖;
添加项目权限
1<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2 package="com.baidu.rtc.videoroom">
3
4 <uses-feature android:name="android.hardware.camera" />
5 <uses-feature android:name="android.hardware.camera.autofocus" />
6 <uses-feature android:glEsVersion="0x00020000" android:required="true" />
7
8 <uses-permission android:name="android.permission.CAMERA" />
9 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
10 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
11 <uses-permission android:name="android.permission.RECORD_AUDIO" />
12 <uses-permission android:name="android.permission.INTERNET" />
13 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
14 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
15 <uses-permission android:name="android.permission.BLUETOOTH" />
16 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
17...
18</manifest>
屏幕分享项目权限
1<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2 package="com.baidu.rtc.videoroom">
3
4 // 前台服务
5 <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
6
7 // 多进程模式下,添加注册(与多流模式互斥)
8 <activity
9 android:name=".screenshare.ScreenCaptureAssistantActivity"
10 android:theme="@android:style/Theme.Translucent"
11 android:process=":brtc_sharescreen" />
12 <service
13 android:name=".screenshare.ScreenSharingService"
14 android:process=":brtc_sharescreen" />
15 <service
16 android:name="com.baidu.rtc.CaptureScreenService"
17 android:enabled="true"
18 android:process=":brtc_sharescreen"
19 android:foregroundServiceType="mediaProjection"/>
20
21 // 多流模式下,添加注册(与多进程模式互斥)
22 <service
23 android:name="com.baidu.rtc.CaptureScreenService"
24 android:enabled="true"
25 android:foregroundServiceType="mediaProjection"/>
26...
27</manifest>
防止代码混淆
在 app/proguard-rules.pro 文件中添加如下行,防止代码混淆:
1-keep class com.baidu.cloud.rtcbridge.framecapture.RtcFrameCaptureImpl {*;}
2-keep class com.baidu.cloud.rtcbridge.frameprocessor.RtcFrameProcessorImpl {*;}
3
4-keep class com.baidu.rtc.BaiduRtcRoom {*;}
5-keep class com.webrtc.** {*;}
6-keep class com.baidu.rtc.** {*;}
7-keep class com.baidu.cloud.rtcbridge.framecapture** {*;}
8
9-dontwarn com.baidu.rtc.**
10-dontwarn com.webrtc.**
11
12-keep class okhttp3.** { *; }
13-keep interface okhttp3.** { *; }
14-dontwarn okhttp3.**
15
16-keep class okio.** { *; }
17-keep interface okio.** { *; }
18-dontwarn okio.**
19
20-keep class javax.annotation.** {*;}
21
22// crash 上报
23-dontwarn com.tencent.bugly.**
24-keep public class com.tencent.bugly.**{*;}
项目配置
在项目的build.gradle中加入如下配置代码, 即可使用。
1 android {
2 compileOptions {
3 sourceCompatibility JavaVersion.VERSION_1_8
4 targetCompatibility JavaVersion.VERSION_1_8
5 }
6 }
7
8 implementation 'com.squareup.okhttp3:okhttp:3.5.0'
9 implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'
10 implementation(name: 'libbaidurtc', ext: 'aar')
实现音视频通话
本节介绍如何实现音视频通话。音视频通话的API调用时序见下图:
外部采集算法:美颜、滤镜、视频增强等算法。
代码示例
1.在您的开发项目中导入包
1 import com.baidu.rtc.BaiduRtcRoom;
2.定义 rtc room 变量
1 private BaiduRtcRoom mVideoRoom
3.初始化 sdk 并设置代理。初始化的时候要带上上下文环境 context,appid,token 串,并确定是否开启后下载
1 mVideoRoom = BaiduRtcRoom.initWithAppID(this,mAppId,mTokenStr, true);
2 mVideoRoom.setBaiduRtcRoomDelegate(this);
4.音视频参数设置:
1 RtcParameterSettings cfg = RtcParameterSettings.getDefaultSettings();
2 cfg.VideoResolution = mVideoResolution;
3 cfg.VideoFps = 30;
4 cfg.AutoPublish = true; //default is true. for mVideoRoom.startPublish() set to false.
5 cfg.AutoSubScribe = true; //default is true. for mVideoRoom.subscribeStreaming() set to false.
6 mVideoRoom.setParamSettings(cfg,RtcParameterSettings.RtcParamSettingType.RTC_PARAM_SETTINGS_ALL);
- 视频显示view设置
1 mVideoRoom.setLocalDisplay((RTCVideoView) findViewById(R.id.local_rtc_video_view));
2 //单人模式:
3 mVideoRoom.setRemoteDisplay((RTCVideoView) findViewById(R.id.remote_rtc_video_view));
4 // 给定用户Id 绑定远端view
5 mVideoRoom.setRemoteDisplay(rtcVideoView, userId);
6
7 // 多人模式,不绑定userId,
8 RTCVideoView[] vg = new RTCVideoView[5];
9 vg[0] = (RTCVideoView) findViewById(R.id.remote_rtc_video_view);
10 vg[1] = (RTCVideoView) findViewById(R.id.remote_rtc_video_view1);
11 vg[2] = (RTCVideoView) findViewById(R.id.remote_rtc_video_view2);
12 vg[3] = (RTCVideoView) findViewById(R.id.remote_rtc_video_view3);
13 vg[4] = (RTCVideoView) findViewById(R.id.remote_rtc_video_view4);
14 mVideoRoom.setRemoteDisplayGroup(vg);
15
16 // 多人模式,绑定userId的方式请用多个 setRemoteDisplay(rtcVideoView, userId)
- 登录房间
1 mVideoRoom.loginRtcRoomWithRoomName(mRoomName,java.lang.Long.parseLong(mUserId),mUserName);
- 登出房间,结束音视频通话
1 mVideoRoom.logoutRtcRoom();
2 mVideoRoom.destroy();
-
外部算法接入 8.1 美颜算法接入
8.1.1)官网申请license
官网地址: https://console.bce.baidu.com/
产品服务——>短视频创作SDK VC_SDK——>选择license申请——>填写相关信息——>得到license 备注:如操作遇到问题,请联系人工服务。
8.1.2)项目路径
v2.4.0之前:
将下载解压缩之后的 SDK 目录下的aar文件拷贝到工程的 app/libs 目录下(如下图)
SDK包含的内容
8.1.3)在项目build.gradle添加库依赖
RTC美颜 SDK maven: https://repo1.maven.org/maven2/com/baidubce/mediasdk/brtc_frameprocessor/
1dependencies {
2 implementation fileTree(dir: 'libs', include: ['*.jar'])
3
4 api fileTree(dir: 'libs', include: ['*.aar'])
5 implementation 'com.baidubce.mediasdk:brtc_frameprocessor:2.13.0.2'
6 implementation 'com.android.support:appcompat-v7:28.0.0'
7 testImplementation 'junit:junit:4.12'
8 androidTestImplementation 'com.android.support.test:runner:1.0.2'
9 androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
10
11 implementation 'com.android.support:recyclerview-v7:28.0.0'
12 implementation "com.github.bumptech.glide:glide:4.6.1"
13
14 api "com.facebook.fresco:fresco:1.11.0"
15 api 'com.airbnb.android:lottie:2.7.0'
16 implementation 'com.android.support.constraint:constraint-layout:1.1.3'
17 api 'com.google.code.gson:gson:2.8.5'
18}
8.1.4)同步SDK,单击 Sync Now 按钮,完成短视频sdk的集成工作。
注意:在使用拍摄器SDK,需要申请产品对应的授权文件,如无授权,产品无法正常使用。
v2.4.0(含)之后: 拿到鉴权后,参考Demo,直接使用arview中libbaidurtc-frameprocessor.aar即可
8.1.5)配置license授权
第一步:修改自定义Application类,替换自己申请的licenseID(可参考demo RtcApplication) 第二步:替换app/src/main/assets中后缀名为.license的文件为上面申请的license文件(licenseID对应license文件) 注意:接入sdk必须在RtcApplication初始化sdk
1 public static final String LICENSEID = "860226087481886720061";
2 // 初始化sdk工作,必须
3 BDCloudSdkInitManager.getInstance().onCreate(mContext, LICENSEID);
4 String packageName = getPackageName();
8.1.6)配置app权限 在 AndroidManifest.xml 中配置 App 的权限,
- 屏幕分享
demo示例入口:CallActivity.java
屏幕分享管理类:ScreenSharingManager.java v2.5.0修改aidl包名,旧版本升级需要参考2.5.0版本demo修改
1// 初始化屏幕分享管理类
2mScreenSharingManager = new ScreenSharingManager(ScreenSharingManager.MODE_MULTI_PROCESS, this);
3mScreenSharingManager.setVideoRoom(mVideoRoom);
4mScreenSharingManager.setRoomName(mRoomName);
5mScreenSharingManager.setBaiduRtcRoomDelegate(this);
9.1)多进程模式屏幕分享,支持服务端录制
多进程屏幕分享实现由业务侧创建一个独立进程,在独立进程中,创建BRTC实例并loginRoom实现,具体代码:
推流端(启动和停止屏幕分享):
1// ScreenSharingService.java中部分代码,屏幕分享用户加入房间(启动屏幕分享):
2private void loginVideoRoom(Intent screenResultData) {
3 // 初始化BRTC,注意此处初始化最后一个参数,因为此为屏幕分享用户,默认不初始化音频管理
4 // 注意!!!如开启鉴权,则token需要按规则生成,规则参见https://cloud.baidu.com/doc/RTC/s/Qjxbh7jpu#rtc鉴权机制
5 mVideoRoom = BaiduRtcRoom.initWithAppID(this, appId, token, "", false,
6 false);
7 mVideoRoom.setBaiduRtcRoomDelegate(this);
8 // 省略部分代码,仅保留屏幕分享相关代码,配置屏幕分享参数
9 RtcParameterSettings cfg = RtcParameterSettings.getDefaultSettings();
10 cfg.HasVideo = false;
11 cfg.HasAudio = false;
12 if (screenResultData != null) {
13 cfg.HasScreen = true;
14 cfg.screenIntentData = screenResultData;
15 cfg.videoEncodeParams = new HashMap<>();
16 cfg.videoEncodeParams.put(RtcParameterSettings.RtcMediaTarget.TARGET_VIDEO_SCREEN, mShareScreenParams);
17 }
18 cfg.EnableMultistream = true; // 多流
19 cfg.AutoPublish = true; // 自动推流
20 cfg.AutoSubScribe = false; // 多进程模式,屏幕流只推不拉
21 mVideoRoom.setParamSettings(cfg, RtcParameterSettings.RtcParamSettingType.RTC_PARAM_SETTINGS_ALL);
22 // 登录房间
23 mVideoRoom.loginRtcRoomWithRoomName(mRoomName, java.lang.Long.parseLong(mUserId), mUserName);
24}
25// ScreenSharingService.java中部分代码,屏幕分享用户离开房间(停止屏幕分享):
26private void logoutVideoRoom() {
27 ScreenCaptureAssistantActivity.mCallback = null;
28 mVideoRoom.logoutRtcRoom();
29 mVideoRoom.destroy();
30 mVideoRoom = null;
31}
推流端(启动或停止屏幕分享回调事件):
1public void onRoomEventUpdate(int roomEvents, long data, final String extraInfo) {
2 super.onRoomEventUpdate(roomEvents, data, extraInfo);
3 switch (roomEvents) {
4 // 收到屏幕共享停止状态(被其他进程占用等)
5 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_CAPTURE_SCREEN_ON_STOP:
6 // 共享中,但被停止,非主动停止,同步UI状态
7 break;
8 // 收到屏幕共享启动、停止状态
9 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_EVENT_SHARE_SCREEN_START:
10 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_EVENT_SHARE_SCREEN_STOP:
11 // 操作屏幕分享成功
12 if (data == BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_STATE_SUCCESS) {
13 // 记录状态等
14 } else {
15 // 失败
16 Log.d(TAG, extraInfo);
17 }
18 });
19 break;
20 }
21}
拉流端,根据特殊用户或者流类型或者自定义用户事件,同步拉流端当前用户是否是屏幕分享用户,如下示例特殊用户或者流类型判断:
1public void onRoomEventUpdate(int roomEvents, long data, final String extraInfo) {
2 switch (roomEvents) {
3 // 远端用户加入
4 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_EVENT_REMOTE_COMING:
5 // 远端为特殊用户id(屏幕共享)
6 if (data == ScreenSharingManager.SCREEN_SHARE_USER_ID) {
7 onScreenComing(data);
8 return;
9 } else {
10 // 远端不是特殊用户id(屏幕共享),但用户id不确定是什么,所以从target里查找匹配(目前target仅Android、iOS端可互识别)
11 ArrayList<CommonDefine.StreamInfo> comingStreams = mVideoRoom.getComingStreams(data);
12 if (comingStreams != null && comingStreams.size() == 1) {
13 for (CommonDefine.StreamInfo streamInfo : comingStreams) {
14 if (TextUtils.equals(streamInfo.type,
15 RtcParameterSettings.RtcMediaTarget.TARGET_VIDEO_DEFAULT)
16 && TextUtils.equals(RtcParameterSettings.RtcMediaTarget.TARGET_VIDEO_SCREEN,
17 streamInfo.description)) {
18 onScreenComing(data);
19 mCurrentScreenUserId = data;
20 return;
21 }
22 }
23 }
24 }
25 // 普通用户加入房间逻辑
26 break;
27 // 远端用户离开
28 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_EVENT_REMOTE_LEAVING:
29 // 远端为特殊用户id(屏幕共享)
30 if (data == ScreenSharingManager.SCREEN_SHARE_USER_ID || data == mCurrentScreenUserId) {
31 if (mRemoteViews != null
32 && mRemoteViews.containsKey(RtcParameterSettings.RtcMediaTarget.TARGET_VIDEO_SCREEN)) {
33 // 当前为拉流端,移除UI
34 mRemoteViews.remove(RtcParameterSettings.RtcMediaTarget.TARGET_VIDEO_SCREEN);
35 notifyViewChanged();
36 }
37 mCurrentScreenUserId = INVALID_USER_ID;
38 return;
39 }
40 // 普通用户离开房间逻辑
41 break;
42 default:
43 break;
44 }
45}
9.2)多流模式屏幕分享,不支持服务端录制
多流模式实现方式是在当前用户BRTC通讯流中,增加和移除一条媒体流完成,由于媒体流中包含两个视频流,需要使用接口获取当前流的信息,以此区分一条流具体是相机流还是屏幕流。
推流端(启动和停止屏幕分享):
1// 参见ScreenSharingManager.java部分代码
2
3// 配置参数
4RtcParameterSettings parameterSettings = RtcParameterSettings.getDefaultSettings();
5parameterSettings.screenIntentData = resultData;
6if (parameterSettings.videoEncodeParams == null) {
7 parameterSettings.videoEncodeParams = new HashMap<>();
8}
9parameterSettings.videoEncodeParams.put(RtcParameterSettings.RtcMediaTarget.TARGET_VIDEO_SCREEN,
10 getScreenShareParams());
11mVideoRoom.setParamSettings(parameterSettings,
12 RtcParameterSettings.RtcParamSettingType.RTC_PARAM_SETTINGS_SHARE_SCREEN);
13// 启动分享
14mVideoRoom.startShareScreen();
15
16// 停止推流
17mVideoRoom.stopShareScreen();
推流端(启动或停止屏幕分享回调事件):与多进程模式一致
拉流端:根据事件,区分是否中间增加、移除一路流,或者是用户加入时就以两条视频流加入
1public void onRoomEventUpdate(int roomEvents, long data, final String extraInfo) {
2 switch (roomEvents) {
3 // 远端用户加入
4 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_EVENT_REMOTE_COMING:
5 // getComingStreams 获取当前加入用户的流信息,进而为流关联特定的View
6 onComing(data, mVideoRoom.getComingStreams(data));
7 break;
8 // 已加入的远端用户,有新的流加入
9 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_EVENT_REMOTE_ADDED_STREAM:
10 // getOperatingStreams 获取用户的加入的流信息
11 onAddedStreams(data, mVideoRoom.getOperatingStreams(data));
12 break;
13 // 远端用户离开
14 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_EVENT_REMOTE_LEAVING:
15 // 处理移除用户View等
16 break;
17 // 已加入的远端用户,有流离开
18 case BaiduRtcRoom.BaiduRtcRoomDelegate.RTC_ROOM_EVENT_REMOTE_REMOVED_STREAM:
19 // getOperatingStreams 获取用户的移除的流信息
20 onRemovedStreams(mVideoRoom.getOperatingStreams(data));
21 break;
22 default:
23 break;
24 }
25}