实时音视频V2常见问题


实时音视频 V1 和 V2 的差别

发布时间:2019年2月25日 更新时间:2019年2月25日 贡献者:yyuanchen

版本区别

差异项 旧版本 V1 新版本 V2
内核架构 iLiveSDK LiteAVSDK
IM SDK 内嵌 不内嵌
API 接口 V1 V2
CDN推流 使用RESTAPI开启 支持客户端开启
云端线路 V1线路 V2线路

旧版本下载

对应平台 下载地址 最新版本
iOS 平台 DOWNLOAD 1.9.6
Android 平台 DOWNLOAD 1.9.6
Windows 平台 DOWNLOAD 1.9.6
Mac 平台 DOWNLOAD 1.9.6

升级方案

情况一:如果您的项目从未集成过TRTC SDK

强烈推荐 V2,因为 V2 在通话质量、线路规格、接入难度以及功能扩展上均有优势。

情况二:如果您的项目已经稳定并且没有问题

由于V1 和 V2 的云端线路目前是不互通的,所以如果您的项目已经进入稳定运营阶段,可以暂时不升级。

情况三:如果您的项目正在对接旧版本V1

推荐您可以直接对接一下V2版本,V2版本的 API 接口采用全新设计,对接时间上相比于旧版本要减少很多。

情况三:如果您已经在使用旧版本V1并希望提升通话质量

由于V1 和 V2 的云端线路目前是不互通的,所以升级新版本SDK需要经过一个SDK集成=>放量铺开=>云端切换的过程,大致步骤如下:

  • step1:在现有的项目中集成新版本的 SDK,并通过测试。

  • step2:在房间列表中增加 SDK 版本号字段,APP 根据服务端的字段决定使用 V1 版本还是 V2 版本。

  • step3:发布新版本 APP 并等待版本逐渐覆盖您的用户群。

  • step4:将房间列表中的 SDK 版本号字段从 V1 切换到 V2,完成线路的切换。


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

发布时间:2019年2月26日 更新时间:2019年3月5日 贡献者:yyuanchen chaoli

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

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

1.初始化 SDK

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

  • 先继承TRTCCloudListener抽象类并重写您需要监听的事件(用户加入房间、用户退出房间、警告信息、错误信息等)。
  • 创建TRTCCloud实例对象,调用 setListener 方法设置TRTCCloudListener回调。

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 参数

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的相关代码。

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 方法时才算真正完成资源的释放。


private void exitRoom() {
    if (trtcCloud != null) {
        trtcCloud.exitRoom();
    }
}
...
@Override
public void onExitRoom(int reason) {
    TRTCMainActivity activity = mContext.get();
    if (activity != null) {
        activity.finishActivity();
    }
}

iOS端设置视频编码输出的方向没有效果?

发布时间:2019年2月28日 更新时间:2019年2月28日 贡献者:zilongye

问题描述:调用以下接口没有效果

/**
 * 2.13 设置视频编码输出的(也就是远端用户观看到的,以及服务器录制下来的)画面方向
 * @param rotation 支持 0 和 180 两个旋转角度
 */
- (void)setVideoEncoderRotation:(TRTCVideoRotation)rotation;

解决方案:

调用setVideoEncoderRotation:接口的前提,需要设置setGSensorMode:接口参数类型TRTCGSensorModeTRTCGSensorMode_Disable,否则远端用户观看到的画面没有变化。


TRTC v2版本SDK如何实现纯语音(纯音频)视频通话?

发布时间:2019年2月28日 更新时间:2019年2月28日 贡献者:zilongye

在进房enterRoom接口之前调用startLocalAudio接口打开本地麦克风采集。

注意:TRTC SDK 并不会默认打开本地的麦克风采集,另外startLocalPreview接口开启本地视频的预览画面纯语音场景下不需要调用。


通话前网络测速的实例代码

发布时间:2019年3月6日 更新时间:2019年3月6日 贡献者:yyuanchen

因为用户的网络环境各不相同,所以推荐您在用户首次通话前先进行一次测速,这将有助于我们选择最佳的服务器。具体实现代码如下:

1.初始化

创建一个 TRTCCloud 的实例对象,并注册监听 SDK 事件的回调

Android

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

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

// 继承 TRTCCloudListener 回调 
static class TRTCCloudListenerImpl extends TRTCCloudListener {
    private WeakReference<TRTCMainActivity> mContext;
    public TRTCCloudListenerImpl(TRTCMainActivity activity) {
        super();
        mContext = new WeakReference<>(activity);
    }
    ....
    // 错误通知是要监听的,错误通知意味着 SDK 不能继续运行了
    @Override
    public void onError(int errCode, String errMsg, Bundle extraInfo) {
        Log.d(TAG, "sdk callback onError");
    }
}
2.获取进视频通话房间的参数

获取网络测速的三个必要字段: SDKAppiduserIduserSig

Android

// 创建 trtcCloud 实例
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ....
    trtcListener = new TRTCCloudListenerImpl(this);
    trtcCloud = TRTCCloud.sharedInstance(this);
    trtcCloud.setListener(trtcListener);

    // TRTC SDK 视频通话房间进入所必须的参数
    Intent intent       = getIntent();
    int sdkAppId        = intent.getIntExtra("sdkAppId", 0);
    int roomId          = intent.getIntExtra("roomId", 0);
    String selfUserId   = intent.getStringExtra("userId");
    String userSig      = intent.getStringExtra("userSig");
    // 测速
    trtcCloud.startSpeedTest(sdkAppId, selfUserId, userSig);
}
3. 监听回调

实现 TRTCCloudListener 回调中的方法 onSpeedTest()

Android

// 继承 TRTCCloudListener 回调 
static class TRTCCloudListenerImpl extends TRTCCloudListener {
    private WeakReference<TRTCMainActivity> mContext;
    public TRTCCloudListenerImpl(TRTCMainActivity activity) {
        super();
        mContext = new WeakReference<>(activity);
    }
    ....
    // 错误通知是要监听的,错误通知意味着 SDK 不能继续运行了
    @Override
    public void onError(int errCode, String errMsg, Bundle extraInfo) {
        Log.d(TAG, "sdk callback onError");
    }

    /**
     * 服务器测速的回调,SDK 对多个服务器IP做测速,每个IP的测速结果通过这个回调通知
     * @param currentResult 当前完成的测速结果
     * @param finishedCount 已完成测速的服务器数量
     * @param totalCount 需要测速的服务器总数量
     */
    public void onSpeedTest(TRTCCloudDef.TRTCSpeedTestResult currentResult, int finishedCount, int totalCount) {
        Log.i(TAG, "ip = "+currentResult.ip + " | quality = "+currentResult.quality
                + " | upLostRate = "+currentResult.upLostRate + " | upLostRate = "+currentResult.upLostRate
                + " | rtt = "+currentResult.rtt  + " ||| finishedCount = "+finishedCount  + " | totalCount = "+totalCount);
    }
}

具体细节见文档: 通话前网络测速


TRTC 如何打印日志?

发布时间:2019年3月25日 更新时间:2019年3月25日 贡献者:yyuanchen

1.设置 Log 输出

  • iOS&Mac:
//设置输出 Log 级别为 Debug
[TRTCCloud setLogLevel:TRTCLogLevelDebug]
//启用控制台日志打印
[TRTCCloud setConsoleEnabled:YES]
//启用或禁用 Log 的本地压缩
[TRTCCloud setLogCompressEnabled:YES]
  • Android
//设置输出 Log 级别为 Debug
trtcCloud.setLogLevel(TRTCCloudDef.TRTC_LOG_LEVEL_DEBUG);
//启用控制台日志打印
trtcCloud.setConsoleEnabled(true);
//启用或禁用 Log 的本地压缩
trtcCloud.setLogCompressEnabled(false);
  • Windows
ITRTCCloud* getTRTCCloud()
{
    if (TRTCMainViewController::g_cloud == nullptr)
    {
        TRTCMainViewController::g_cloud = getTRTCShareInstance();
    }
    return TRTCMainViewController::g_cloud;
}

//设置输出 Log 级别为 Debug
getTRTCCloud()->setLogLevel(TRTC_LOG_LEVEL_DEBUG);
//启用控制台日志打印
getTRTCCloud()->setConsoleEnabled(true);
//启用或禁用 Log 的本地压缩
getTRTCCloud()->setLogCompressEnabled(false);

2. 日志文件的默认路径:

iOS&Mac: sandbox的Documents/log
Android: /sdcard/log/tencent/liteav
Windows: %appdata%/tencent/liteav/log
Web: 打开浏览器控制台,或使用vConsole记录 SDK 打印信息
小程序: 启用<live-pusher><live-player>标签的debug属性,使用vConsole记录打印信息

详情见文档: iOS&Mac > TRTCCloud > LOG相关接口函数
Android > TRTCCloud > LOG相关接口函数
Windows > TRTCCloud > LOG相关接口函数



iOS端调用exitRoom接口退出房间没有收到onExitRoom监听回调?

发布时间:2019年4月9日 更新时间:2019年4月9日 贡献者:zilongye

TXLiteAVSDK_TRTC 6.2版本有这个问题,原因是SDK内部没有把这个事件抛出来,在 6.3版本已修复。

/**
 * 离开房间
 * 离开房间成功的回调
 * @param reason 离开房间原因
 */
- (void)onExitRoom:(NSInteger)reason;

iOS端收不到onUserEnter监听回调?

发布时间:2019年4月9日 更新时间:2019年4月9日 贡献者:zilongye

如果加入房间的成员没有上行数据(没有打开视频和音频采集),即使进房成功,房间里的其它成员也不会触发进房通知的回调。所以进房需要保证startLocalPreview和startLocalAudio至少调用一个才能收到onUserEnter监听回调。

/**
 * userid对应的成员的进房通知,您可以在这个回调中调用 startRemoteView 显示该 userid 的视频画面
 * @param userId 用户标识
 */
- (void)onUserEnter:(NSString *)userId;

集成iOS端SDK编译报错符号冲突duplicate symbols?

发布时间:2019年4月9日 更新时间:2019年4月9日 贡献者:zilongye

请先确认other linker flags没有设置 -all_load 和 -force_load。如果依然有问题报类似上图的错误,可以尝试:

  1. 检查 Xcode 工程配置,确保Linking里面 Dead Code Stripping 设置为 YES;
  2. 或者更新 6.4 SDK版本。

为什么使用前摄像头进行视频通话,本地预览和远端观众画面是左右颠倒?

发布时间:2019年5月13日 更新时间:2019年5月13日 贡献者:yyuanchen

使用前摄像头进行视频通话,会有镜像效果,所以本地预览和远端观众画面是左右颠倒。如果开发者想让两端画面一致,TRTCSDK 提供两个接口供你使用选择使用

  • 方案一:改变本地预览画面

改变本地预览接口是通过接口setLocalViewMirror(mirrorType) 来改变本地预览画面镜像方式。如果开发者只想让前摄像头保持镜像,mirrorType 的值建议设置为 ATUO。

trtcCloud.setLocalViewMirror(TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_AUTO);

接口具体用法见文档

  • 方案二:改变远端观众画面

这种方案是通过设置编码器画面镜像来改变远端画面,从而实现两端画面一致。

trtcCloud.setVideoEncoderMirror(true);

接口具体用法见文档


TRTC动效没有效果,动效路径传错?

发布时间:2019年5月30日 更新时间:2019年5月30日 贡献者:zilongye

TXLiteAVSDK_Enterprise在6.4版本加上了selectMotionTmpl添加动效接口,如果动效路径传错,会导致动效无法生效。以iOS端接口调用代码为例:

//动效所在沙盒的完整路径,如:/var/mobile/Containers/Data/Application/12F57EE8-F33C-452A-9FBE-6F7E716FA493/Documents/packages/video_nihongshu
    NSString *localPackageDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/packages/video_nihongshu"];
    [_trtc selectMotionTmpl:localPackageDir];

results matching ""

    No results matching ""