【Android】腾讯云TRTC技术实现在线直播
受当前新冠疫情影响,面对线下业务受疫情因素难以开展的今天,越来越多的厂商开始着眼于线上直播业务的部署,如在线教育、电商、大型在线社区等。把握当前风口,把直播业务快速稳定地接入进项目中去,才能更快更好的实现业务的拓展。那么接下来我们跟着腾讯的官方文档看一下如何接入直播业务吧。
相关资源
- 官方文档:https://cloud.tencent.com/document/product/647
- 官方Demo下载:https://cloud.tencent.com/document/product/647/17021
- 官方API文档:https://liteav.sdk.qcloud.com/doc/api/zh-cn/index.html
- Github示例:
1. SDK集成
官方提供了自动装配和手动装配的方式,这里推荐使用gradle引入aar文件的自动装配方式,另外由于sdk对CPU架构有限制,目前仅支持在armeabi,armeabi-v7a 和 arm64-v8a架构下运作。
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
}
}
dependencies {
implementation 'com.tencent.liteav:LiteAVSDK_TRTC:latest.release'
}
2. 权限配置
需要在Manifest中配置以下属性,基本是个直播都要这么配,没什么好说的,还有一点就是硬件加速不能关掉,关掉对面视频流就无法渲染了。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-feature android:name="android.hardware.camera.autofocus" />
除了静态权限外,在进行直播时还需要请求动态权限,经常做Android开发的朋友应该都明白,这里推荐的框架是Google的EasyPermissions框架,以后有机会会介绍一下
Manifest.permission.WRITE_EXTERNAL_STORAGE
Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.CAMERA
Manifest.permission.READ_PHONE_STATE
Manifest.permission.RECORD_AUDIO
3. 混淆配置
如果你的App到生产环境需要做混淆配置,可以参考官方的配置方式,方式也很简单到 proguard-rules.pro 和 gradle文件里文件里加一下就好
proguard-rules.pro
-keep class com.tencent.** { *; }
build.gradle
//android标签下
packagingOptions {
pickFirst '**/libc++_shared.so'
doNotStrip "*/armeabi/libYTCommon.so"
doNotStrip "*/armeabi-v7a/libYTCommon.so"
doNotStrip "*/x86/libYTCommon.so"
doNotStrip "*/arm64-v8a/libYTCommon.so"
}
4. 初始化SDK
在直播间进行SDK初始化,并配置加载SDK内部的回调,这里因为其回调的接口方法很多,SDK又没有提供实现类,所以推荐根据SDK源码,将实现类抽离出来进行开发,让代码看着更清爽整洁
TRTCCloud mTRTCCloud = TRTCCloud.sharedInstance(getApplicationContext());
mTRTCCloud.setListener(new TRTCCloudListener());
其中对于SDK的回调有几个方法需要重点关注一下
回调方法 | 含义 |
---|---|
onEnterRoom | 进房回调,result > 0 正常 <0异常 |
onExitRoom | 退出房间 |
onUserVideoAvailable | 用户视频可用性,userId远端用户ID,available 开启或关闭 |
onUserAudioAvailable | 用户音频可用性,userId远端用户ID,available 开启或关闭 |
onError | 错误回调: SDK不可恢复的错误,一定要监听,并分情况给用户适当的界面提示 |
5. 主播端开启摄像头预览和麦克风
SDK 默认不开启麦克风,当用户需要发布本地音频时,需要调用该接口开启麦克风采集,并将音频编码并发布到当前的房间中。 开启本地音频的采集和发布后,房间中的其他用户会收到 onUserAudioAvailable(userId, true) 的通知。
//本地视频推流配置,决定了其他用户观看的效果
TRTCCloudDef.TRTCVideoEncParam param = new TRTCCloudDef.TRTCVideoEncParam();
param.enableAdjustRes = true; //是否允许动态调整分辨率
param.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_LANDSCAPE; //分辨率模式
param.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_960_540; //分辨率
param.videoBitrate = 1200; //目标码率
//开启本地视频的采集与发布
mTRTCCloud.setVideoEncoderParam(encParam);
mTRTCCloud.startLocalAudio();
//开启本地音频的采集和发布
trtcCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT);
//开启本地摄像头的预览画面 true前置false后置
trtcCloud.startLocalPreview(true,TXCloudVideoView);
6. 主播端创建房间并开始推流
在进入房间enterRoom时需要传入一个参数,用来指定需要进入的房间
TRTCCloudDef.TRTCParams trtcParams = new TRTCCloudDef.TRTCParams(sdkAppId, userId
, userSig, roomId "", "");
mTrtcCloud.enterRoom(trtcParams,classScene);
- sdkAppId : 在腾讯云控制台生成的AppID
- userId : 用户标识
- userSig :基于userId 算出的验证签名
- roomId : 数字类型的房间号
- classScene : 课堂场景 0为实时通话模式,1000人以下场景低延时;1为直播模式,支持1000人以上场景,会增加600ms左右延时
进房成功会在onEnterRoom中接收到回调
对于直播模式,需要设置TRTCParams的role即当前角色,如果当前为主播则设置为TRTCCloudDef.TRTCRoleAnchor,为观众则设置为TRTCCloudDef.TRTCRoleAudience
7. 观众端进入房间观看直播
观众端进房和主播端进房操作是一样的,只需要设置role为TRTCCloudDef.TRTCRoleAudience即可。
观看主播画面:
- 如果观众端事先知道主播的 userId,直接在进房成功后使用主播
userId
调用 startRemoteView(userId, view) 即可显示主播的画面。 - 如果观众端不知道主播的 userId,观众端在进房成功后会收到 onUserVideoAvailable() 事件通知,使用回调中获取的主播
userId
调用 startRemoteView(userId, view) 便可显示主播的画面。
8. 观众跟主播连麦
//示例代码:观众上麦
mTrtcCloud.switchRole(TRTCCloudDef.TRTCRoleAnchor);
mTrtcCloud.startLocalAudio();
mTrtcCloud.startLocalPreview(mIsFrontCamera, localView);
//示例代码:观众下麦
mTrtcCloud.switchRole(TRTCCloudDef.TRTCRoleAudience);
mTrtcCloud.stopLocalAudio();
mTrtcCloud.stopLocalPreview();
由于视频直播和语音聊天室需要支持多达10万名观众同时观看,所以设定了“只有主播才能发布自己的音视频”的规则。 因此,当有些观众希望发布自己的音视频流(以便能跟主播互动)时,就需要先把自己的角色切换成“主播”。
9. 退出当前房间
mTRTCCloud.exitRoom()
@Override
public void onExitRoom(int reason) {
//exitRoom并不是真正意义上的退出,只有该回调调用后才是真正退出直播
}