美文网首页Android 知识
【Android】腾讯云TRTC技术实现在线直播

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

作者: 鲨鲨指挥官 | 来源:发表于2022-03-28 11:36 被阅读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);
    
    • 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并不是真正意义上的退出,只有该回调调用后才是真正退出直播
    }
    

    相关文章

      网友评论

        本文标题:【Android】腾讯云TRTC技术实现在线直播

        本文链接:https://www.haomeiwen.com/subject/zuqpjrtx.html