实时音视频SDK,如何实现类似微信的纯语音通话功能?

2019-04-24 14:27:20 浏览数 (2)

简介

实时音视频TRTCSDK适用的业务场景是视频会议、坐席视频、在线教育等,如果您希望实现类似微信的语音通话、语音会议功能,TRTCSDK也是支持的,只需要微调几个参数就可以实现,将采集音视频的api,换成只采集音频。

官网开发文档已经给出了音视频会议场景的调用时序,参考官网开发文档,做如下修改即可。

1.初始化 SDK

使用 TRTC SDK 的第一步,是先创建一个 TRTCCloud 的实例对象,并注册监听 SDK 事件的回调。

  • 先继承TRTCCloudListener抽象类并重写您需要监听的事件(用户加入房间、用户退出房间、警告信息、错误信息等)。
  • 创建TRTCCloud实例对象,调用 setListener 方法设置TRTCCloudListener回调。
代码语言:javascript复制
public class TRTCMainActivity extends Activity{

    private TRTCCloud trtcCloud;              /// TRTC SDK 实例对象
    private TRTCCloudListener trtcListener;    /// TRTC SDK 回调监听

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ....
        trtcListener = new TRTCCloudListenerImpl(this);
        trtcCloud = TRTCCloud.sharedInstance(this);
        trtcCloud.setListener(trtcListener);        
    }

    //静态内部类,重写监听事件
    static class TRTCCloudListenerImpl extends TRTCCloudListener {

        private WeakReference<TRTCMainActivity> mContext;
        public TRTCCloudListenerImpl(TRTCMainActivity activity) {
            super();
            mContext = new WeakReference<>(activity);
        }
     @Override
        public void onEnterRoom(long elapsed) {
            //TODO
        }
     @Override
        public void onExitRoom(int reason) {
            //TODO
        }
     @Override
        public void onError(int errCode, String errMsg, Bundle extraInfo) {
            //TODO
        }
     @Override
        public void onWarning(int warningCode, String warningMsg, Bundle extraInfo) {
            //TODO
        }
     @Override
        public void onUserEnter(String userId) {
            //TODO
        }
    }

    // 销毁 trtcCloud 实例
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //销毁 trtc 实例
        if (trtcCloud != null) {
            trtcCloud.setListener(null);
            trtcCloud.destroy();
        }
        trtcCloud = null;
    }
}

2.组装 TRTCParams

TRTCParams 是 SDK 最关键的一个参数,它包含如下四个必填的字段 SDKAppid,userId,userSig 和 roomId

  • SDKAppid

进入腾讯云实时音视频控制台,如果您还没有应用,请创建一个,即可看到 SDKAppid。

  • userId

您可以随意指定,由于是字符串类型,可以直接跟您现有的账号体系保持一致,但请注意,同一个音视频房间里不应该有两个同名的 userId

  • userSig

基于 sdkAppId 和 userId 可以计算出 userSig,计算方法请参考如何计算UserSig。

  • roomId

房间号是数字类型,您可以随意指定,但请注意,同一个应用里的两个音视频房间不能分配同一个 roomId。

3.进入音频通话房间

调用 enterRoom 函数进入房间时,需要上文的 TRTCParams 参数

代码语言:javascript复制
void enterRoom() {

     // 预览前配置默认参数
     setTRTCCloudParam();

    //TRTCParams 定义参考头文件TRTCCloudDef.java
    trtcParams = new TRTCCloudDef.TRTCParams();
    trtcParams.sdkAppId = sdkappid;
    trtcParams.userId   = userid;
    trtcParams.userSig  = usersig;
    trtcParams.roomId   = 908; //输入你想进入的房间
    trtcCloud.enterRoom(trtcParams, TRTC_APP_SCENE_VIDEOCALL);
}

4.开启本地声音采集,不打开本地视频采集。

TRTC SDK 并不会默认打开本地的麦克风采集,startLocalAudio可以开启本地的声音采集并将音视频数据广播出去,stopLocalAudio则会关闭之。 startLocalAudio 会检查麦克风使用权限,如果没有麦克风权限,SDK 会向用户申请开启。

TRTC SDK 并不会默认打开本地的摄像头采集,startLocalPreview 可以开启本地的摄像头并显示预览画面,stopLocalPreview 则会关闭之。

做音视频通话需要调用startLocalPreview,对于纯音频通话,则不需要调用startLocalPreview,您可以直接注释掉我们官方demo的相关代码。

代码语言:javascript复制
void setTRTCCloudParam() {
     // 大画面的编码器参数设置
        // 设置视频编码参数,包括分辨率、帧率、码率等等,这些编码参数来自于 TRTCSettingDialog 的设置
        // 注意(1):不要在码率很低的情况下设置很高的分辨率,会出现较大的马赛克
        // 注意(2):不要设置超过25FPS以上的帧率,因为电影才使用24FPS,我们一般推荐15FPS,这样能将更多的码率分配给画质
/*        TRTCCloudDef.TRTCVideoEncParam encParam = new TRTCCloudDef.TRTCVideoEncParam();
        encParam.videoResolution = settingDlg.getResolution();
        encParam.videoFps = settingDlg.getVideoFps();
        encParam.videoBitrate = settingDlg.getVideoBitrate();
        encParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;
        trtcCloud.setVideoEncoderParam(encParam);*/

        // 不开启视频采集预览
       /* TXCloudVideoView localVideoView = mVideoViewLayout.getCloudVideoViewByIndex(0);
        localVideoView.setUserId(trtcParams.userId);
        localVideoView.setVisibility(View.VISIBLE);
        trtcCloud.setLocalViewFillMode(TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL);
        trtcCloud.startLocalPreview(true, localVideoView);*/
        //只开启音频采集
        trtcCloud.startLocalAudio();
        trtcCloud.setGSensorMode(TRTCCloudDef.TRTC_GSENSOR_MODE_UIFIXLAYOUT);
}

5.退出房间

调用exitRoom方法退出房间。不论当前是否还在通话中,调用该方法会把音频通话相关的所有资源释放掉。

在您调用exitRoom之后,SDK 会进入一个复杂的退房握手流程,当 SDK 回调 onExitRoom 方法时才算真正完成资源的释放。

代码语言:javascript复制
private void exitRoom() {
    if (trtcCloud != null) {
        trtcCloud.exitRoom();
    }
}
...
@Override
public void onExitRoom(int reason) {
    TRTCMainActivity activity = mContext.get();
    if (activity != null) {
        activity.finishActivity();
    }
}

0 人点赞