产品动态
产品近期公告
关于 TRTC Live 正式上线的公告
关于TRTC Conference 正式版上线的公告
Conference 商业化版本即将推出
关于多人音视频 Conference 开启内测公告
关于音视频通话 Call 正式版上线的公告
关于腾讯云音视频终端 SDK 播放升级及新增授权校验的公告
关于 TRTC 应用订阅套餐服务上线的相关说明
所属平台 | 示例代码 |
Windows(MFC) | |
Windows(Duilib) | |
Windows(C#) |
TRTCCloud的单例对象,并注册监听 SDK 事件的回调。ITRTCCloudCallback事件回调接口类,重写关键事件的回调接口,包括本地用户进房/退房事件、远端用户加入/退出事件、错误事件和警告事件等。addCallback接口注册监听 SDK 事件。addCallback注册 N 次,同一个事件, SDK 就会触发 N 次回调,建议只调用一次 addCallback。// TRTCMainViewController.h// 继承 ITRTCCloudCallback 事件回调接口类class TRTCMainViewController : public ITRTCCloudCallback{public:TRTCMainViewController();virtual ~TRTCMainViewController();virtual void onError(TXLiteAVError errCode, const char* errMsg, void* arg);virtual void onWarning(TXLiteAVWarning warningCode, const char* warningMsg, void* arg);virtual void onEnterRoom(uint64_t elapsed);virtual void onExitRoom(int reason);virtual void onRemoteUserEnterRoom(const char* userId);virtual void onRemoteUserLeaveRoom(const char* userId, int reason);virtual void onUserVideoAvailable(const char* userId, bool available);virtual void onUserAudioAvailable(const char* userId, bool available);...private:ITRTCCloud * m_pTRTCSDK = NULL;...}// TRTCMainViewController.cppTRTCMainViewController::TRTCMainViewController(){// 创建 TRTCCloud 实例m_pTRTCSDK = getTRTCShareInstance();// 注册 SDK 回调事件m_pTRTCSDK->addCallback(this);}TRTCMainViewController::~TRTCMainViewController(){// 取消监听 SDK 事件if(m_pTRTCSDK) {m_pTRTCSDK->removeCallback(this);}// 释放 TRTCCloud 实例if(m_pTRTCSDK != NULL) {destroyTRTCShareInstance();m_pTRTCSDK = null;}}// 错误通知是需要监听的,错误通知意味着 SDK 无法继续运行virtual void TRTCMainViewController::onError(TXLiteAVError errCode, const char* errMsg, void* arg){if (errCode == ERR_ROOM_ENTER_FAIL) {LOGE(L"onError errorCode[%d], errorInfo[%s]", errCode, UTF82Wide(errMsg).c_str());exitRoom();}}
// TRTCMainForm.cs// 继承 ITRTCCloudCallback 事件回调接口类public partial class TRTCMainForm : Form, ITRTCCloudCallback, ITRTCLogCallback{...private ITRTCCloud mTRTCCloud;...public TRTCMainForm(TRTCLoginForm loginForm){InitializeComponent();this.Disposed += new EventHandler(OnDisposed);// 创建 TRTCCloud 实例mTRTCCloud = ITRTCCloud.getTRTCShareInstance();// 注册 SDK 回调事件mTRTCCloud.addCallback(this);...}private void OnDisposed(object sender, EventArgs e){if (mTRTCCloud != null){// 取消监听 SDK 事件mTRTCCloud.removeCallback(this);// 释放 TRTCCloud 实例ITRTCCloud.destroyTRTCShareInstance();mTRTCCloud = null;}...}...// 错误通知是需要监听的,错误通知意味着 SDK 无法继续运行public void onError(TXLiteAVError errCode, string errMsg, IntPtr arg){if (errCode == TXLiteAVError.ERR_ROOM_ENTER_FAIL) {exitRoom();}...}...}
startLocalPreview 可以开启本地的摄像头并显示预览画面,stopLocalPreview 则会关闭。setLocalViewFillMode 指定视频显示模式为 Fill 或 Fit 模式。两种模式下视频尺寸都是等比缩放,区别在于:Fill 模式优先保证视窗被填满。如果缩放后的视频尺寸与显示视窗尺寸不一致,多出的视频将被截掉。Fit 模式则优先保证视频内容全部显示。如果缩放后的视频尺寸与显示视窗尺寸不一致,未被填满的视窗区域将使用黑色填充。void TRTCMainViewController::onEnterRoom(uint64_t elapsed){// 获取渲染窗口的句柄。CWnd *pLocalVideoView = GetDlgItem(IDC_LOCAL_VIDEO_VIEW);HWND hwnd = pLocalVideoView->GetSafeHwnd();if(m_pTRTCSDK){// 调用 SDK 接口设置渲染模式和渲染窗口。m_pTRTCSDK->setLocalViewFillMode(TRTCVideoFillMode_Fit);m_pTRTCSDK->startLocalPreview(hwnd);}}
// TRTCMainForm.cspublic void onEnterRoom(int result){...// 获取渲染窗口的句柄。IntPtr ptr = GetHandle();if (mTRTCCloud != null){// 调用 SDK 接口设置渲染模式和渲染窗口。mTRTCCloud.setLocalViewFillMode(TRTCVideoFillMode_Fit);mTRTCCloud.startLocalPreview(ptr);}...}
startLocalAudio 可以开启本地的声音采集并将音视频数据广播出去,stopLocalAudio 则会关闭。您可以在 startLocalPreview 之后继续调用 startLocalAudio。startLocalAudio 会检查麦克风使用权限,如果没有麦克风权限,SDK 会向用户申请开启。enterRoom 创建一个音视频房间,参数 TRTCParams 中的 roomId 用于指定房间号,同时,我们还需要将 role 字段指定为 TRTCRoleAnchor(主播)。appScene 参数指定 SDK 的应用场景,本文档中我们使用 TRTCAppSceneLIVE(在线直播)。onEnterRoom 接口,参数:elapsed 代表进入耗时,单位:ms。onError 接口,参数:errCode(错误码 ERR_ROOM_ENTER_FAIL,错误码可参考 TXLiteAVCode.h)、errMsg(错误原因)、extraInfo(保留参数)。// TRTCMainViewController.cppvoid TRTCMainViewController::startBroadCasting(){// TRTCParams 定义参考头文件 TRTCCloudDef.hTRTCParams params;params.sdkAppId = sdkappid;params.userId = userid;params.userSig = usersig;params.roomId = 908; // 输入您想进入的房间params.role = TRTCRoleAnchor; //主播if(m_pTRTCSDK){m_pTRTCSDK->enterRoom(params, TRTCAppSceneLIVE);}}void TRTCMainViewController::onError(TXLiteAVError errCode, const char* errMsg, void* arg){if(errCode == ERR_ROOM_ENTER_FAIL){LOGE(L"onError errorCode[%d], errorInfo[%s]", errCode, UTF82Wide(errMsg).c_str());// 检查 userSig 是否合法、网络是否正常等}}...void TRTCMainViewController::onEnterRoom(uint64_t elapsed){LOGI(L"onEnterRoom elapsed[%lld]", elapsed);// 启动本地的视频预览,请参考下文设置视频编码参数和预览本地摄像头画面的内容}
// TRTCMainForm.cspublic void createRoom(){// TRTCParams 定义参考头文件TRTCCloudDef.hTRTCParams @params = new TRTCParams();@params.sdkAppId = sdkappid;@params.userId = userid;@params.userSig = usersig;@params.roomId = 908; // 输入您想进入的房间@params.role = TRTCRoleAnchor; //主播if(mTRTCCloud != null){mTRTCCloud.enterRoom(@params, TRTCAppSceneLIVE);}}...public void onError(TXLiteAVError errCode, string errMsg, IntPtr arg){if(errCode == TXLiteAVError.ERR_ROOM_ENTER_FAIL){Log.E(String.Format("errCode : {0}, errMsg : {1}, arg = {2}", errCode, errMsg, arg));// 检查 userSig 是否合法、网络是否正常等}}...public void onEnterRoom(int result){// 启动本地的视频预览,请参考下文设置视频编码参数和预览本地摄像头画面的内容}
muteLocalVideo 屏蔽本地的视频采集,调用 muteLocalAudio 屏蔽本地的音频采集。enterRoom 可以进入一个音视频房间,参数 TRTCParams 中的 roomId 用于指定房间号。
appScene 同样填写 TRTCAppSceneLIVE(在线直播),但 role 字段需要指定为 TRTCRoleAudience(观众)。void TRTCMainViewController::startPlaying(){// TRTCParams 定义参考头文件 TRTCCloudDef.hTRTCParams params;params.sdkAppId = sdkappid;params.userId = userid;params.userSig = usersig;params.roomId = 908; // 输入您想进入的房间params.role = TRTCRoleAudience; //观众if(m_pTRTCSDK){m_pTRTCSDK->enterRoom(params, TRTCAppSceneLIVE);}}
public void startPlaying(){// TRTCParams 定义参考头文件TRTCCloudDef.hTRTCParams @params = new TRTCParams();@params.sdkAppId = sdkappid;@params.userId = userid;@params.userSig = usersig;@params.roomId = 908; // 输入您想进入的房间@params.role = TRTCRoleAudience; //观众if(mTRTCCloud != null){mTRTCCloud.enterRoom(@params, TRTCAppSceneLIVE);}}
onUserVideoAvailable 回调获知主播的 userid。然后观众可以调用 startRemoteView 方法来显示主播的视频画面。setRemoteViewFillMode 可以指定视频显示模式为 Fill 或 Fit 模式。两种模式下视频尺寸都是等比缩放,区别在于:Fill 模式:优先保证视窗被填满。如果缩放后的视频尺寸与显示视窗尺寸不一致,多出的视频将被截掉。Fit 模式:优先保证视频内容全部显示。如果缩放后的视频尺寸与显示视窗尺寸不一致,未被填满的视窗区域将使用黑色填充。void TRTCMainViewController::onUserVideoAvailable(const char* userId, bool available){if (available) {// 获取渲染窗口的句柄。CWnd *pRemoteVideoView = GetDlgItem(IDC_REMOTE_VIDEO_VIEW);HWND hwnd = pRemoteVideoView->GetSafeHwnd();// 设置远端用户视频的渲染模式。m_pTRTCSDK->setRemoteViewFillMode(TRTCVideoFillMode_Fill);// 调用 SDK 接口播放远端用户流。m_pTRTCSDK->startRemoteView(userId, hwnd);} else {m_pTRTCSDK->stopRemoteView(userId);}}
public void onUserVideoAvailable(string userId, bool available){if (available){// 获取窗口句柄IntPtr ptr = GetHandleAndSetUserId(pos, userId, false);SetVisableInfoView(pos, false);// 设置远端用户视频的渲染模式。mTRTCCloud.setRemoteViewFillMode(userId, TRTCVideoFillMode.TRTCVideoFillMode_Fit);// 调用 SDK 接口播放远端用户流。mTRTCCloud.startRemoteView(userId, ptr);}else{mTRTCCloud.stopRemoteView(userId);...}}
switchRole 进行角色间的相互切换,最常见的场景是观众跟主播连麦:观众可以通过该接口切换成“小主播”,然后跟房间里原来的“大主播”进行连麦互动。exitRoom 方法退出房间。无论当前是否还在通话中,调用该方法会把视频通话相关的所有资源释放掉。在您调用 exitRoom 之后,SDK 会进入一个复杂的退房握手流程,当 SDK 回调 onExitRoom 方法时才算真正完成资源的释放。// TRTCMainViewController.cppvoid TRTCMainViewController::exitRoom(){if(m_pTRTCSDK){m_pTRTCSDK->exitRoom();}}....void TRTCMainViewController::onExitRoom(int reason){// 退房成功,reason 参数保留,暂未使用。}
// TRTCMainForm.cspublic void OnExit(){if(mTRTCCloud != null){mTRTCCloud.exitRoom();}}...public void onExitRoom(int reason){// 退房成功...}
文档反馈