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

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

相关资源

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即可。
观看主播画面:

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并不是真正意义上的退出,只有该回调调用后才是真正退出直播
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容