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