集成sdk -奇异果体育app竞彩官网下载
准备环境
本节将介绍如何创建项目,将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
进入rtc文档中心,点击“下载专区>”,即可下载客户端sdk。下载后请校验下载的包md5值与sdk中心里记录的是否一致。
集成sdk
创建android项目,若已有 android 项目,可以直接集成 sdk
将sdk包内libbaidurtc.aar 拷贝到项目的libs目录.
添加项目权限
...
屏幕分享项目权限
// 前台服务
// 多进程模式下,添加注册(与多流模式互斥)
// 多流模式下,添加注册(与多进程模式互斥)
...
防止代码混淆
在 app/proguard-rules.pro 文件中添加如下行,防止代码混淆:
-keep class com.baidu.** {*;}
-keep class com.baidu.**
-keep class org.webrtc.** {*;}
-keep class org.webrtc.**
-dontwarn com.baidu.rtc.**
-dontwarn org.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)奇异果体育app竞彩官网下载官网申请license
奇异果体育app竞彩官网下载官网地址:
产品服务——>短视频创作sdk vc_sdk——>选择license申请——>填写相关信息——>得到license 备注:如操作遇到问题,请联系人工服务。
8.1.2)项目路径 将下载解压缩之后的 sdk 目录下的aar文件拷贝到工程的 app/libs 目录下(如下图)
sdk包含的内容
8.1.3)在项目build.gradle添加库依赖
dependencies {
implementation filetree(dir: 'libs', include: ['*.jar'])
api filetree(dir: 'libs', include: ['*.aar'])
compileonly filetree(dir: '../share/libs', include: ['cloud-download-release.aar'])
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,需要申请产品对应的授权文件,如无授权,产品无法正常使用。
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 的权限,
8.2视频增强算法接入 参考附录增强sdk集成文档
roomactivity.java
// 外部纹理 推流 yuv 格式转换
outerrtcvideocapture selfrtcvideocapture = null;
// 拍摄 视频增强 美颜
outmanagerrouter outmanagerrouter = null;
public void initoutcapturer() {
log.i(tag, "initoutcapturer");
outmanagerrouter = new outmanagerrouter(this);
mvideoroom.enableexternalvideocapturer(true);
mvideoroom.setvideocapture(selfrtcvideocapture);
updatevideowidthheight();
int width = getvideowidth();
int height = getvideoheight();
log.i(tag, "getvideowidth = " width " getvideoheight = " height);
outmanagerrouter.init(splitviewmanager.getinstance().getlocalglsurfaceview(), width, height);
egltexturereader egltexturereader = new egltexturereader(getvideowidth(), getvideoheight());
egltexturereader.setpixeloutputflipv(true);
egltexturereader.setonpixelreadcallback(new egltexturereader.onpixelreadcallback() {
@override
public byte[] onpixelread(byte[] bytes, int i, int i1) {
if (customdialog.getenhanceisenable() && rtcapplication.iscapableforenhance()) {
byte[] enhancenv21byte;
synchronized (rtcapplication.getvideoenhanceutils()) {
enhancenv21byte = rtcapplication.getvideoenhanceutils().sendframe(bytes,
getvideowidth(), getvideoheight(), videoenhanceutils.format.nv21, 2.0f, 5.0f);
}
selfrtcvideocapture.drawremoteclient(enhancenv21byte, i, i1);
return enhancenv21byte;
} else {
selfrtcvideocapture.drawremoteclient(bytes, i, i1);
return bytes;
}
}
});
egltexturereader.setontextureupdatacallback(new ontextureupdatelistener() {
@override
public void ontextureupdate(int textureid, int width, int height) {
}
});
outmanagerrouter.settexturereader(egltexturereader);
if (customdialog.getenhanceisenable() && rtcapplication.iscapableforenhance()) {
outmanagerrouter.setprocessalgorihm(mpixelreadcallback);
}
cropforoutmanager(customdialog.isscaletypecrop());
log.i(tag, "setvideocapture");
dologin();
}
- 屏幕分享
demo示例入口:callactivity.java
屏幕分享管理类:screensharingmanager.java
// 初始化屏幕分享管理类
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 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;
}
}