Android 知识

【Android】腾讯云TRTC技术实现在线直播

2022-03-28  本文已影响0人  鲨鲨指挥官

受当前新冠疫情影响,面对线下业务受疫情因素难以开展的今天,越来越多的厂商开始着眼于线上直播业务的部署,如在线教育、电商、大型在线社区等。把握当前风口,把直播业务快速稳定地接入进项目中去,才能更快更好的实现业务的拓展。那么接下来我们跟着腾讯的官方文档看一下如何接入直播业务吧。

相关资源

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);

进房成功会在onEnterRoom中接收到回调
对于直播模式,需要设置TRTCParams的role即当前角色,如果当前为主播则设置为TRTCCloudDef.TRTCRoleAnchor,为观众则设置为TRTCCloudDef.TRTCRoleAudience

7. 观众端进入房间观看直播

观众端进房和主播端进房操作是一样的,只需要设置role为TRTCCloudDef.TRTCRoleAudience即可。
观看主播画面:

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并不是真正意义上的退出,只有该回调调用后才是真正退出直播
}
上一篇下一篇

猜你喜欢

热点阅读