wangguolei

remove pay

Too many changes to show.

To preserve performance only 16 of 16+ files are displayed.

Pod::Spec.new do |s|
s.name = "HHVDoctorSDK"
s.version = "3.1.4.062820"
s.version = "3.1.2.080214"
s.summary = "和缓视频医生 SDK"
s.description = <<-DESC
... ...
No preview for this file type
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
/*
/**
* Module: TRTCCloudDelegate @ TXLiteAVSDK
*
* Function: 腾讯云视频通话功能的事件回调接口
*
* Function: 腾讯云实时音视频的事件回调接口
*/
/// @defgroup TRTCCloudDelegate_ios TRTCCloudDelegate
/// 腾讯云实时音视频的事件回调接口
/// @{
#import <Foundation/Foundation.h>
#import "TRTCCloudDef.h"
#import "TXLiteAVCode.h"
... ... @@ -14,58 +14,61 @@ NS_ASSUME_NONNULL_BEGIN
@class TRTCCloud;
@class TRTCStatistics;
/// @defgroup TRTCCloudDelegate_ios TRTCCloudDelegate
/// 腾讯云视频通话功能的事件回调接口
/// @{
@protocol TRTCCloudDelegate <NSObject>
@optional
/////////////////////////////////////////////////////////////////////////////////
//
// (一)错误事件和警告事件
// 错误事件和警告事件
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 错误事件和警告事件
/// @{
/**
* 1.1 错误回调,表示 SDK 不可恢复的错误,一定要监听并分情况给用户适当的界面提示。
* 1.1 错误事件回调
*
* 错误事件,表示 SDK 抛出的不可恢复的错误,比如进入房间失败或设备开启失败等。
* 参考文档:[错误码表](https://cloud.tencent.com/document/product/647/32257)
*
* @param errCode 错误码
* @param errMsg 错误信息
* @param extInfo 扩展信息字段,个别错误码可能会带额外的信息帮助定位问题
*/
- (void)onError:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg extInfo:(nullable NSDictionary*)extInfo;
- (void)onError:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg extInfo:(nullable NSDictionary *)extInfo;
/**
* 1.2 警告回调,用于告知您一些非严重性问题,例如出现了卡顿或者可恢复的解码失败。
* 1.2 警告事件回调
*
* 警告事件,表示 SDK 抛出的提示性问题,比如视频出现卡顿或 CPU 使用率太高等。
* 参考文档:[错误码表](https://cloud.tencent.com/document/product/647/32257)
*
* @param warningCode 警告码
* @param warningMsg 警告信息
* @param extInfo 扩展信息字段,个别警告码可能会带额外的信息帮助定位问题
*/
- (void)onWarning:(TXLiteAVWarning)warningCode warningMsg:(nullable NSString *)warningMsg extInfo:(nullable NSDictionary*)extInfo;
- (void)onWarning:(TXLiteAVWarning)warningCode warningMsg:(nullable NSString *)warningMsg extInfo:(nullable NSDictionary *)extInfo;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (二)房间事件回调
// 房间相关事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 房间事件回调
/// @name 房间相关事件回调
/// @{
/**
* 2.1 已加入房间的回调
* 2.1 进入房间成功与否的事件回调
*
* 调用 TRTCCloud 中的 enterRoom() 接口执行进房操作后,会收到来自 SDK 的 onEnterRoom(result) 回调:
* 调用 TRTCCloud 中的 enterRoom() 接口执行进房操作后,会收到来自 TRTCCloudDelegate 的 onEnterRoom(result) 回调:
* - 如果加入成功,回调 result 会是一个正数(result > 0),代表进入房间所消耗的时间,单位是毫秒(ms)。
* - 如果加入失败,回调 result 会是一个负数(result < 0),代表失败原因的错误码。
* 进房失败的错误码含义请参见[错误码表](https://cloud.tencent.com/document/product/647/32257)。
*
* - 如果加入成功,result 会是一个正数(result > 0),代表加入房间的时间消耗,单位是毫秒(ms)。
* - 如果加入失败,result 会是一个负数(result < 0),代表进房失败的错误码。
* 进房失败的错误码含义请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
*
* @note 在 Ver6.6 之前的版本,只有进房成功会抛出 onEnterRoom(result) 回调,进房失败由 onError() 回调抛出。
* 在 Ver6.6 及之后改为:进房成功返回正的 result,进房失败返回负的 result,同时进房失败也会有 onError() 回调抛出。
* @note
* 1. 在 Ver6.6 之前的版本,只有进房成功会抛出 onEnterRoom(result) 回调,进房失败由 onError() 回调抛出。
* 2. 在 Ver6.6 之后的版本:无论进房成功或失败,均会抛出 onEnterRoom(result) 回调,同时进房失败也会有 onError() 回调抛出。
*
* @param result result > 0 时为进房耗时(ms),result < 0 时为进房错误码。
*/
... ... @@ -75,12 +78,12 @@ NS_ASSUME_NONNULL_BEGIN
* 2.2 离开房间的事件回调
*
* 调用 TRTCCloud 中的 exitRoom() 接口会执行退出房间的相关逻辑,例如释放音视频设备资源和编解码器资源等。
* 待资源释放完毕,SDK 会通过 onExitRoom() 回调通知到您。
* 待 SDK 占用的所有资源释放完毕后,SDK 会抛出 onExitRoom() 回调通知到您。
*
* 如果您要再次调用 enterRoom() 或者切换到其他的音视频 SDK,请等待 onExitRoom() 回调到来之后再执行相关操作。
* 否则可能会遇到音频设备(例如 iOS 里的 AudioSession)被占用等各种异常问题。
* 如果您要再次调用 enterRoom() 或者切换到其他的音视频 SDK,请等待 onExitRoom() 回调到来后再执行相关操作。
* 否则可能会遇到例如摄像头、麦克风设备被强占等各种异常问题。
*
* @param reason 离开房间原因,0:主动调用 exitRoom 退;1:被服务器踢出当前房间;2:当前房间整个被解散。
* @param reason 离开房间原因,0:主动调用 exitRoom 退出房间;1:被服务器踢出当前房间;2:当前房间整个被解散。
*/
- (void)onExitRoom:(NSInteger)reason;
... ... @@ -96,320 +99,370 @@ NS_ASSUME_NONNULL_BEGIN
- (void)onSwitchRole:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
/**
* 2.4 请求跨房通话(主播 PK)的结果回调
* 2.4 切换房间的结果回调
*
* 调用 TRTCCloud 中的 connectOtherRoom() 接口会将两个不同房间中的主播拉通视频通话,也就是所谓的“主播PK”功能。
* 调用者会收到 onConnectOtherRoom() 回调来获知跨房通话是否成功,
* 如果成功,两个房间中的所有用户都会收到 PK 主播的 onUserVideoAvailable() 回调。
* 调用 TRTCCloud 中的 switchRoom() 接口可以让用户快速地从一个房间切换到另一个房间,
* 待 SDK 切换完成后,会抛出 onSwitchRoom() 事件回调。
*
* @param userId 要 PK 的目标主播 userid。
* @param errCode 错误码,ERR_NULL 代表切换成功,其他请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
* @param errMsg 错误信息。
*/
- (void)onConnectOtherRoom:(NSString*)userId errCode:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
- (void)onSwitchRoom:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
/**
* 2.5 结束跨房通话(主播 PK)的结果回调
* 2.5 请求跨房通话的结果回调
*
* 调用 TRTCCloud 中的 connectOtherRoom() 接口会将两个不同房间中的主播拉通视频通话,也就是所谓的“主播PK”功能。
* 调用者会收到 onConnectOtherRoom() 回调来获知跨房通话是否成功,
* 如果成功,两个房间中的所有用户都会收到来自另一个房间中的 PK 主播的 onUserVideoAvailable() 回调。
*
* @param userId 要跨房通话的另一个房间中的主播的用户 ID。
* @param errCode 错误码,ERR_NULL 代表切换成功,其他请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
* @param errMsg 错误信息。
*/
- (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
- (void)onConnectOtherRoom:(NSString *)userId errCode:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
/**
* 2.6 切换房间 (switchRoom) 的结果回调
* 2.6 结束跨房通话的结果回调
*/
- (void)onSwitchRoom:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
- (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (三)成员事件回调
// 用户相关事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 成员事件回调
/// @name 用户相关事件回调
/// @{
/**
* 3.1 有用户加入当前房间
*
* 出于性能方面的考虑,在两种不同的应用场景下,该通知的行为会有差别:
* - 通话场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下用户没有角色的区别,任何用户进入房间都会触发该通知。
* - 直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):该场景不限制观众的数量,如果任何用户进出都抛出回调会引起很大的性能损耗,所以该场景下只有主播进入房间时才会触发该通知,观众进入房间不会触发该通知。
* 出于性能方面的考虑,在 TRTC 两种不同的应用场景(即 AppScene,在 enterRoom 时通过第二个参数指定)下,该通知的行为会有差别:
* - 直播类场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):该场景下的用户区分主播和观众两种角色,只有主播进入房间时才会触发该通知,观众进入房间时不会触发该通知。
* - 通话类场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下的用户没有角色的区分(可认为都是主播),任何用户进入房间都会触发该通知。
*
*
* @note 注意 onRemoteUserEnterRoom 和 onRemoteUserLeaveRoom 只适用于维护当前房间里的“成员列表”,如果需要显示远程画面,建议使用监听 onUserVideoAvailable() 事件回调。
*
* @param userId 用户标识
* @note
* 1. 事件回调 onRemoteUserEnterRoom 和 onRemoteUserLeaveRoom 只适用于维护当前房间里的“用户列表”,有此事件回调不代表一定有视频画面。
* 2. 如果需要显示远程画面,请监听代表某个用户是否有视频画面的 onUserVideoAvailable() 事件回调。
* @param userId 远端用户的用户标识
*/
- (void)onRemoteUserEnterRoom:(NSString *)userId;
/**
* 3.2 有用户离开当前房间
*
* 与 onRemoteUserEnterRoom 相对应,在两种不同的应用场景下,该通知的行为会有差别:
* - 通话场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下用户没有角色的区别,任何用户的离开都会触发该通知。
* - 直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):只有主播离开房间时才会触发该通知,观众离开房间不会触发该通知。
* 与 onRemoteUserEnterRoom 相对应,在两种不同的应用场景(即 AppScene,在 enterRoom 时通过第二个参数指定)下,该通知的行为会有差别:
* - 直播类场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):只有主播离开房间时才会触发该通知,观众离开房间不会触发该通知。
* - 通话类场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下用户没有角色的区别,任何用户的离开都会触发该通知。
*
* @param userId 用户标识
* @param reason 离开原因,0 表示用户主动退出房间,1 表示用户超时退出,2 表示被踢出房间。
* @param userId 远端用户的用户标识
* @param reason 离开原因,0表示用户主动退出房间,1表示用户超时退出,2表示被踢出房间。
*/
- (void)onRemoteUserLeaveRoom:(NSString *)userId reason:(NSInteger)reason;
/**
* 3.3 远端用户是否存在可播放的主路画面(一般用于摄像头)
* 3.3 某远端用户发布/取消了主路视频画面
*
* 当您收到 onUserVideoAvailable(userid, YES) 通知时,表示该路画面已经有可用的视频数据帧到达。
* 此时,您需要调用 startRemoteView(userid) 接口加载该用户的远程画面。
* 然后,您会收到名为 onFirstVideoFrame(userid) 的首帧画面渲染回调。
* “主路画面”一般被用于承载摄像头画面。当您收到 onUserVideoAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。
* 此时,您需要调用 {@link startRemoteView} 接口订阅该用户的远程画面,订阅成功后,您会继续收到该用户的首帧画面渲染回调 onFirstVideoFrame(userid)。
*
* 当您收到 onUserVideoAvailable(userid, NO) 通知时,表示该路远程画面已被关闭,
* 可能由于该用户调用了 muteLocalVideo() 或 stopLocalPreview()。
* 当您收到 onUserVideoAvailable(userId, false) 通知时,表示该路远程画面已经被关闭,关闭的原因可能是该用户调用了 {@link muteLocalVideo} 或 {@link stopLocalPreview}。
*
* @param userId 用户标识
* @param available 画面是否开启
* @param userId 远端用户的用户标识
* @param available 该用户是否发布(或取消发布)了主路视频画面,true: 发布;false:取消发布。
*/
- (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available;
/**
* 3.4 远端用户是否存在可播放的辅路画面(一般用于屏幕分享)
* 3.4 某远端用户发布/取消了辅路视频画面
*
* @note 显示辅路画面使用的函数是 startRemoteSubStreamView() 而非 startRemoteView()。
* @param userId 用户标识
* @param available 屏幕分享是否开启
* “辅路画面”一般被用于承载屏幕分享的画面。当您收到 onUserSubStreamAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。
* 此时,您需要调用 {@link startRemoteSubStreamView} 接口订阅该用户的远程画面,订阅成功后,您会继续收到该用户的首帧画面渲染回调 onFirstVideoFrame(userid)。
*
* @note 显示辅路画面使用的函数是 {@link startRemoteSubStreamView} 而非 {@link startRemoteView}。
*
* @param userId 远端用户的用户标识
* @param available 该用户是否发布(或取消发布)了辅路视频画面,true: 发布;false:取消发布。
*/
- (void)onUserSubStreamAvailable:(NSString *)userId available:(BOOL)available;
/**
* 3.5 远端用户是否存在可播放的音频数据
* 3.5 某远端用户发布/取消了自己的音频
*
* @param userId 用户标识
* @param available 声音是否开启
* 当您收到 onUserAudioAvailable(userId, true) 通知时,表示该用户发布了自己的声音,此时 SDK 的表现为:
* - 在自动订阅模式下,您无需做任何操作,SDK 会自动播放该用户的声音。
* - 在手动订阅模式下,您可以通过 {@link muteRemoteAudio}(userid, false) 来播放该用户的声音。
*
* @note SDK 默认使用自动订阅模式,您可以通过 {@link setDefaultStreamRecvMode} 设置为手动订阅,但需要在您进入房间之前调用才生效。
*
* @param userId 远端用户的用户标识
* @param available 该用户是否发布(或取消发布)了自己的音频,true: 发布;false:取消发布。
*/
- (void)onUserAudioAvailable:(NSString *)userId available:(BOOL)available;
/**
* 3.6 开始渲染本地或远程用户的首帧画面
* 3.6 SDK 开始渲染自己本地或远端用户的首帧画面
*
* 如果 userId == nil,代表开始渲染本地采集的摄像头画面,需要您先调用 startLocalPreview 触发。
* 如果 userId != nil,代表开始渲染远程用户的首帧画面,需要您先调用 startRemoteView 触发。
* SDK 会在渲染自己本地或远端用户的首帧画面时抛出该事件,您可以通过回调事件中的 userId 参数来判断事件来自于“本地”还是来自于“远端”。
* - 如果 userId 为空值,代表 SDK 已经开始渲染自己本地的视频画面,不过前提是您已经调用了 {@link startLocalPreview} 或 {@link startScreenCapture}。
* - 如果 userId 不为空,代表 SDK 已经开始渲染远端用户的视频画面,不过前提是您已经调用了 {@link startRemoteView} 订阅了该用户的视频画面。
*
* @note 只有当您调用 startLocalPreivew()、startRemoteView() 或 startRemoteSubStreamView() 之后,才会触发该回调。
* @note
* 1. 只有当您调用了 {@link startLocalPreview} 或 {@link startScreenCapture} 之后,才会触发自己本地的首帧画面事件回调。
* 2. 只有当您调用了 {@link startRemoteView} 或 {@link startRemoteSubStreamView} 之后,才会触发远端用户的首帧画面事件回调。
*
* @param userId 本地或远程用户 ID,如果 userId == nil 代表本地,userId != nil 代表远程。
* @param streamType 视频流类型:摄像头或屏幕分享。
* @param width 画面宽度
* @param height 画面高度
* @param userId 本地或远端的用户标识,如果 userId 为空值代表自己本地的首帧画面已到来,userId 不为空则代表远端用户的首帧画面已到来。
* @param streamType 视频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
* @param width 画面的宽度。
* @param height 画面的高度。
*/
- (void)onFirstVideoFrame:(NSString*)userId streamType:(TRTCVideoStreamType)streamType width:(int)width height:(int)height;
- (void)onFirstVideoFrame:(NSString *)userId streamType:(TRTCVideoStreamType)streamType width:(int)width height:(int)height;
/**
* 3.7 开始播放远程用户的首帧音频(本地声音暂不通知)
* 3.7 SDK 开始播放远端用户的首帧音频
*
* SDK 会在播放远端用户的首帧音频时抛出该事件,本地音频的首帧事件暂不抛出。
*
* @param userId 远程用户 ID。
* @param userId 远端用户的用户标识
*/
- (void)onFirstAudioFrame:(NSString*)userId;
- (void)onFirstAudioFrame:(NSString *)userId;
/**
* 3.8 首帧本地视频数据已经被送出
* 3.8 自己本地的首个视频帧已被发布出去
*
* SDK 会在 enterRoom() 并 startLocalPreview() 成功后开始摄像头采集,并将采集到的画面进行编码。
* 当 SDK 成功向云端送出第一帧视频数据后,会抛出这个回调事件。
* 当您成功进入房间并通过 {@link startLocalPreview} 或 {@link startScreenCapture} 开启本地视频采集之后(开启采集和进入房间的先后顺序无影响),
* SDK 就会开始进行视频编码,并通过自身的网络模块向云端发布自己本地的视频数据。
* 当 SDK 成功地向云端送出自己的第一帧视频数据帧以后,就会抛出 onSendFirstLocalVideoFrame 事件回调。
*
* @param streamType 视频流类型,主画面、小画面或辅流画面(屏幕分享)
* @param streamType 视频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
*/
- (void)onSendFirstLocalVideoFrame: (TRTCVideoStreamType)streamType;
- (void)onSendFirstLocalVideoFrame:(TRTCVideoStreamType)streamType;
/**
* 3.9 首帧本地音频数据已经被送出
* 3.9 自己本地的首个音频帧已被发布出去
*
* SDK 会在 enterRoom() 并 startLocalAudio() 成功后开始麦克风采集,并将采集到的声音进行编码。
* 当 SDK 成功向云端送出第一帧音频数据后,会抛出这个回调事件。
* 当您成功进入房间并通过 {@link startLocalAudio} 开启本地音频采集之后(开启采集和进入房间的先后顺序无影响),
* SDK 就会开始进行音频编码,并通过自身的网络模块向云端发布自己本地的音频数据。
* 当 SDK 成功地向云端送出自己的第一帧音频数据帧以后,就会抛出 onSendFirstLocalAudioFrame 事件回调。
*/
- (void)onSendFirstLocalAudioFrame;
/**
* 3.10 废弃接口:有主播加入当前房间
*
* 该回调接口可以被看作是 onRemoteUserEnterRoom 的废弃版本,不推荐使用。请使用 onUserVideoAvailable 或 onRemoteUserEnterRoom 进行替代。
*
* @note 该接口已被废弃,不推荐使用
*
* @param userId 用户标识
*/
- (void)onUserEnter:(NSString *)userId DEPRECATED_ATTRIBUTE;
/**
* 3.11 废弃接口:有主播离开当前房间
*
* 该回调接口可以被看作是 onRemoteUserLeaveRoom 的废弃版本,不推荐使用。请使用 onUserVideoAvailable 或 onRemoteUserLeaveRoom 进行替代。
*
* @note 该接口已被废弃,不推荐使用
* 3.10 远端视频状态变化的事件回调
*
* 您可以通过此事件回调获取远端每一路画面的播放状态(包括 Playing、Loading 和 Stopped 三种状态),从而进行相应的 UI 展示。
* @param userId 用户标识
* @param reason 离开原因。
* @param streamType 视频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
* @param status 视频状态:包括 Playing、Loading 和 Stopped 三种状态。
* @param reason 视频状态改变的原因
* @param extrainfo 额外信息
*/
- (void)onUserExit:(NSString *)userId reason:(NSInteger)reason DEPRECATED_ATTRIBUTE;
- (void)onRemoteVideoStatusUpdated:(NSString *)userId streamType:(TRTCVideoStreamType)streamType streamStatus:(TRTCAVStatusType)status reason:(TRTCAVStatusChangeReason)reason extrainfo:(nullable NSDictionary *)info;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (四)统计和质量回调
// 网络和技术指标统计回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 统计和质量回调
/// @name 网络和技术指标统计回调
/// @{
/**
* 4.1 网络质量,该回调每2秒触发一次,统计当前网络的上行和下行质量
* 4.1 网络质量的实时统计回调
*
* 该统计回调每间隔2秒抛出一次,用于通知 SDK 感知到的当前网络的上行和下行质量。
* SDK 会使用一组内嵌的自研算法对当前网络的延迟高低、带宽大小以及稳定情况进行评估,并计算出一个的评估结果:
* 如果评估结果为 1(Excellent) 代表当前的网络情况非常好,如果评估结果为 6(Down)代表当前网络无法支撑 TRTC 的正常通话。
*
* @note userId == nil 代表自己当前的视频质量
* @note 回调参数 localQuality 和 remoteQuality 中的 userId 如果为空置,代表本组数据统计的是自己本地的网络质量,否则是代表远端用户的网络质量。
*
* @param localQuality 上行网络质量
* @param remoteQuality 下行网络质量
*/
- (void)onNetworkQuality: (TRTCQualityInfo*)localQuality remoteQuality:(NSArray<TRTCQualityInfo*>*)remoteQuality;
- (void)onNetworkQuality:(TRTCQualityInfo *)localQuality remoteQuality:(NSArray<TRTCQualityInfo *> *)remoteQuality;
/**
* 4.2 技术指标统计回调
* 4.2 音视频技术指标的实时统计回调
*
* 如果您是熟悉音视频领域相关术语,可以通过这个回调获取 SDK 的所有技术指标。
* 如果您是首次开发音视频相关项目,可以只关注 onNetworkQuality 回调。
* 该统计回调每间隔2秒抛出一次,用于通知 SDK 内部音频、视频以及网络相关的专业技术指标,这些信息在 {@link TRTCStatistics} 均有罗列:
* - 视频统计信息:视频的分辨率(resolution)、帧率(FPS)和比特率(bitrate)等信息。
* - 音频统计信息:音频的采样率(samplerate)、声道(channel)和比特率(bitrate)等信息。
* - 网络统计信息:SDK 和云端一次往返(SDK => Cloud => SDK)的网络耗时(rtt)、丢包率(loss)、上行流量(sentBytes)和下行流量(receivedBytes)等信息。
*
* @param statistics 统计数据,包括本地和远程的
* @note 每2秒回调一次
* @note 如果您只需要获知当前网络质量的好坏,并不需要花太多时间研究本统计回调,更推荐您使用 {@link onNetworkQuality} 来解决问题。
* @param statistics 统计数据,包括自己本地的统计信息和远端用户的统计信息,详情请参考 {@link TRTCStatistics}。
*/
- (void)onStatistics: (TRTCStatistics *)statistics;
- (void)onStatistics:(TRTCStatistics *)statistics;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (五)服务器事件回调
// 与云端连接情况的事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 服务器事件回调
/// @name 与云端连接情况的事件回调
/// @{
/**
* 5.1 SDK 跟服务器的连接断开
* 5.1 SDK 与云端的连接已经断开
*
* SDK 会在跟云端的连接断开时抛出此事件回调,导致断开的原因大多是网络不可用或者网络切换所致,比如用户在通话中走进电梯时就可能会遇到此事件。
* 在抛出此事件之后,SDK 会努力跟云端重新建立连接,重连过程中会抛出 {@link onTryToReconnect},连接恢复后会抛出 {@link onConnectionRecovery} 。
* 所以,SDK 会在如下三个连接相关的事件中按如下规律切换:
* <pre>
* [onConnectionLost] =====> [onTryToReconnect] =====> [onConnectionRecovery]
* /|\ |
* |------------------------------------------------------|
* </pre>
*/
- (void)onConnectionLost;
/**
* 5.2 SDK 尝试重新连接到服务器
* 5.2 SDK 正在尝试重新连接到云端
*
* SDK 会在跟云端的连接断开时抛出 {@link onConnectionLost},之后会努力跟云端重新建立连接并抛出本事件,连接恢复后会抛出 {@link onConnectionRecovery}。
*/
- (void)onTryToReconnect;
/**
* 5.3 SDK 跟服务器的连接恢复
* 5.3 SDK 与云端的连接已经恢复
*
* SDK 会在跟云端的连接断开时抛出 {@link onConnectionLost},之后会努力跟云端重新建立连接并抛出{@link onTryToReconnect},连接恢复后会抛出本事件回调。
*/
- (void)onConnectionRecovery;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (六)硬件设备事件回调
// 硬件设备相关事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 硬件设备事件回调
/// @name 硬件设备相关事件回调
/// @{
/**
* 6.1 摄像头准备就绪
*
* 当您调用 {@link startLocalPreivew} 之后,SDK 会尝试启动摄像头,如果摄像头能够启动成功就会抛出本事件。
* 如果启动失败,大概率是因为当前应用没有获得访问摄像头的权限,或者摄像头当前正在被其他程序独占使用中。
* 您可以通过捕获 {@link onError} 事件回调获知这些异常情况并通过 UI 界面提示用户。
*/
- (void)onCameraDidReady;
/**
* 6.2 麦克风准备就绪
*
* 当您调用 {@link startLocalAudio} 之后,SDK 会尝试启动麦克风,如果麦克风能够启动成功就会抛出本事件。
* 如果启动失败,大概率是因为当前应用没有获得访问麦克风的权限,或者麦克风当前正在被其他程序独占使用中。
* 您可以通过捕获 {@link onError} 事件回调获知这些异常情况并通过 UI 界面提示用户。
*/
- (void)onMicDidReady;
#if TARGET_OS_IPHONE
/**
* 6.3 音频路由发生变化(仅 iOS),音频路由即声音由哪里输出(扬声器或听筒)
* 6.3 当前音频路由发生变化(仅适用于移动设备)
*
* 所谓“音频路由”,是指声音是从手机的扬声器还是从听筒中播放出来,音频路由变化也就是声音的播放位置发生了变化。
* - 当音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
* - 当音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
*
* @param route 当前音频路由
* @param fromRoute 变更前的音频路由
* @param route 音频路由,即声音由哪里输出(扬声器、听筒)。
* @param fromRoute 变更前的音频路由。
*/
#if TARGET_OS_IPHONE
- (void)onAudioRouteChanged:(TRTCAudioRoute)route fromRoute:(TRTCAudioRoute)fromRoute;
#endif
/**
* 6.4 用于提示音量大小的回调,包括每个 userId 的音量和远端总音量
* 6.4 音量大小的反馈回调
*
* SDK 可以评估每一路音频的音量大小,并每隔一段时间抛出该事件回调,您可以根据音量大小在 UI 上做出相应的提示,比如“波形图”或“音量槽”。
* 要完成这个功能, 您需要先调用 {@link enableAudioVolumeEvaluation} 开启这个能力并设定事件抛出的时间间隔。
* 需要补充说明的是,无论当前房间中是否有人说话,SDK 都会按照您设定的时间间隔定时抛出此事件回调,只不过当没有人说话时,userVolumes 为空,totalVolume 为 0。
*
* 您可以通过调用 TRTCCloud 中的 enableAudioVolumeEvaluation 接口来开关这个回调或者设置它的触发间隔。
* 需要注意的是,调用 enableAudioVolumeEvaluation 开启音量回调后,无论频道内是否有人说话,都会按设置的时间间隔调用这个回调;
* 如果没有人说话,则 userVolumes 为空,totalVolume 为 0。
* @note userVolumes 为一个数组,对于数组中的每一个元素,当 userId 为空时表示本地麦克风采集的音量大小,当 userId 不为空时代表远端用户的音量大小。
*
* @param userVolumes 所有正在说话的房间成员的音量,取值范围 0 - 100。
* @param totalVolume 所有远端成员的总音量, 取值范围 0 - 100。
* @note userId 为 nil 时表示自己的音量,userVolumes 内仅包含正在说话(音量不为 0 )的用户音量信息。
* @param userVolumes 是一个数组,用于承载所有正在说话的用户的音量大小,取值范围 0 - 100。
* @param totalVolume 所有远端用户的总音量大小, 取值范围 0 - 100。
*/
- (void)onUserVoiceVolume:(NSArray<TRTCVolumeInfo *> *)userVolumes totalVolume:(NSInteger)totalVolume;
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
/**
* 6.5 本地设备通断回调
* 6.5 本地设备的通断状态发生变化(仅适用于桌面系统)
*
* 当本地设备(包括摄像头、麦克风以及扬声器)被插入或者拔出时,SDK 便会抛出此事件回调。
*
* @param deviceId 设备 ID
* @param deviceType 设备类型
* @param state 0:设备断开;1:设备连接
* @param state 通断状态,0:设备断开;1:设备连接。
*/
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
- (void)onDevice:(NSString *)deviceId type:(TRTCMediaDeviceType)deviceType stateChanged:(NSInteger)state;
#endif
/**
* 6.6 当前音频采集设备音量变化回调
* 6.6 当前麦克风的系统采集音量发生变化
*
* @note 使用 enableAudioVolumeEvaluation(interval>0)开启,(interval == 0)关闭
* 在 Mac 或 Windows 这样的桌面操作系统上,用户可以在设置中心找到声音相关的设置面板,并设置麦克风的采集音量大小。
* 用户将麦克风的采集音量设置得越大,麦克风采集到的声音的原始音量也就会越大,反之就会越小。
* 在有些型号的键盘以及笔记本电脑上,用户还可以通过按下“禁用麦克风”按钮(图标是一个话筒上上叠加了一道代表禁用的斜线)来将麦克风静音。
*
* @param volume 音量 取值范围 0 - 100
* @param muted 当前采集音频设备是否被静音:YES 被静音了,NO 未被静音
* 当用户通过系统设置界面或者通过键盘上的快捷键设定操作系统的麦克风采集音量时,SDK 便会抛出此事件。
*
* @note 您需要调用 {@link enableAudioVolumeEvaluation} 接口并设定(interval>0)开启次事件回调,设定(interval == 0)关闭此事件回调。
*
* @param volume 系统采集音量,取值范围 0 - 100,用户可以在系统的声音设置面板上进行拖拽调整。
* @param muted 麦克风是否被用户禁用了:true 被禁用,false 被启用。
*/
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
- (void)onAudioDeviceCaptureVolumeChanged:(NSInteger)volume muted:(BOOL)muted;
#endif
/**
* 6.7 当前音频播放设备音量变化回调
* 6.7 当前系统的播放音量发生变化
*
* 在 Mac 或 Windows 这样的桌面操作系统上,用户可以在设置中心找到声音相关的设置面板,并设置系统的播放音量大小。
* 在有些型号的键盘以及笔记本电脑上,用户还可以通过按下“静音”按钮(图标是一个喇叭上叠加了一道代表禁用的斜线)来将系统静音。
*
* @note 使用 enableAudioVolumeEvaluation(interval>0)开启,(interval == 0)关闭
* 当用户通过系统设置界面或者通过键盘上的快捷键设定操作系统的播放音量时,SDK 便会抛出此事件。
*
* @param volume 音量 取值范围 0 - 100
* @param muted 当前音频播放设备是否被静音:YES 被静音了,NO 未被静音
* @note 您需要调用 {@link enableAudioVolumeEvaluation} 接口并设定(interval>0)开启次事件回调,设定(interval == 0)关闭此事件回调。
*
* @param volume 系统播放音量,取值范围 0 - 100,用户可以在系统的声音设置面板上进行拖拽调整。
* @param muted 系统是否被用户静音了:true 被静音,false 已恢复。
*/
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
- (void)onAudioDevicePlayoutVolumeChanged:(NSInteger)volume muted:(BOOL)muted;
#endif
/**
* 6.8 系统声音采集结果回调
* 6.8 系统声音采集是否被成功开启的事件回调(仅适用于 Mac 系统)
*
* 系统声音采集接口 startSystemAudioLoopback 会触发这个回调
* 在 Mac 系统上,您可以通过调用 {@link startSystemAudioLoopback} 为当前系统安装一个音频驱动,并让 SDK 通过该音频驱动捕获当前 Mac 系统播放出的声音。
* 当用于播片教学或音乐直播中,比如老师端可以使用此功能,让 SDK 能够采集老师所播放的电影中的声音,使同房间的学生端也能听到电影中的声音。
* SDK 会将统声音采集是否被成功开启的结果,通过本事件回调抛出,需要您关注参数中的错误码。
*
* @param err ERR_NULL 表示成功,其余值表示失败
* @param err ERR_NULL 表示成功,其余值表示失败
*/
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
- (void)onSystemAudioLoopbackError:(TXLiteAVError)err;
#endif
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (七)自定义消息的接收回调
// 自定义消息的接收事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 自定义消息的接收回调
/// @name 自定义消息的接收事件回调
/// @{
/**
* 7.1 收到自定义消息回调
* 7.1 收到自定义消息的事件回调
*
* 当房间中的某个用户使用 sendCustomCmdMsg 发送自定义消息时,房间中的其它用户可以通过 onRecvCustomCmdMsg 接口接收消息
* 当房间中的某个用户使用 {@link sendCustomCmdMsg} 发送自定义 UDP 消息时,房间中的其它用户可以通过 onRecvCustomCmdMsg 事件回调接收到该条消息。
*
* @param userId 用户标识
* @param cmdID 命令 ID
... ... @@ -419,9 +472,9 @@ NS_ASSUME_NONNULL_BEGIN
- (void)onRecvCustomCmdMsgUserId:(NSString *)userId cmdID:(NSInteger)cmdID seq:(UInt32)seq message:(NSData *)message;
/**
* 7.2 自定义消息丢失回调
* 7.2 自定义消息丢失的事件回调
*
* 实时音视频使用 UDP 通道,即使设置了可靠传输(reliable),也无法确保100@%不丢失,只是丢消息概率极低,能满足常规可靠性要求。
* 当您使用 {@link sendCustomCmdMsg} 发送自定义 UDP 消息时,即使设置了可靠传输(reliable),也无法确保100@%不丢失,只是丢消息概率极低,能满足常规可靠性要求。
* 在发送端设置了可靠运输(reliable)后,SDK 都会通过此回调通知过去时间段内(通常为5s)传输途中丢失的自定义消息数量统计信息。
*
* @note 只有在发送端设置了可靠传输(reliable),接收方才能收到消息的丢失回调
... ... @@ -435,318 +488,401 @@ NS_ASSUME_NONNULL_BEGIN
/**
* 7.3 收到 SEI 消息的回调
*
* 当房间中的某个用户使用 sendSEIMsg 发送数据时,房间中的其它用户可以通过 onRecvSEIMsg 接口接收数据
* 当房间中的某个用户使用 {@link sendSEIMsg} 借助视频数据帧发送 SEI 消息时,房间中的其它用户可以通过 onRecvSEIMsg 事件回调接收到该条消息
*
* @param userId 用户标识
* @param message 数据
*/
- (void)onRecvSEIMsg:(NSString *)userId message:(NSData*)message;
- (void)onRecvSEIMsg:(NSString *)userId message:(NSData *)message;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (八)CDN 旁路回调
// CDN 相关事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name CDN 旁路转推回调
/// @name CDN 相关事件回调
/// @{
/**
* 8.1 开始向腾讯云的直播 CDN 推流的回调,对应于 TRTCCloud 中的 startPublishing() 接口
* 8.1 开始向腾讯云直播 CDN 上发布音视频流的事件回调
*
* 当您调用 {@link startPublishing} 开始向腾讯云直播 CDN 上发布音视频流时,SDK 会立刻将这一指令同步给云端服务器。
* 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
*
* @param err 0表示成功,其余值表示失败
* @param errMsg 具体错误原因
*/
- (void)onStartPublishing:(int)err errMsg:(NSString*)errMsg;
- (void)onStartPublishing:(int)err errMsg:(NSString *)errMsg;
/**
* 8.2 停止向腾讯云的直播 CDN 推流的回调,对应于 TRTCCloud 中的 stopPublishing() 接口
* 8.2 停止向腾讯云直播 CDN 上发布音视频流的事件回调
*
* 当您调用 {@link stopPublishing} 停止向腾讯云直播 CDN 上发布音视频流时,SDK 会立刻将这一指令同步给云端服务器。
* 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
*
* @param err 0表示成功,其余值表示失败
* @param errMsg 具体错误原因
*/
- (void)onStopPublishing:(int)err errMsg:(NSString*)errMsg;
- (void)onStopPublishing:(int)err errMsg:(NSString *)errMsg;
/**
* 8.3 启动旁路推流到 CDN 完成的回调
* 8.3 开始向非腾讯云 CDN 上发布音视频流的事件回调
*
* 对应于 TRTCCloud 中的 startPublishCDNStream() 接口
* 当您调用 {@link startPublishCDNStream} 开始向非腾讯云直播 CDN 上发布音视频流时,SDK 会立刻将这一指令同步给云端服务器。
* 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
*
* @note Start 回调如果成功,只能说明转推请求已经成功告知给腾讯云,如果目标 CDN 有异常,还是有可能会转推失败。
* @note 当您收到成功的事件回调时,只是说明您的发布指令已经同步到腾讯云后台服务器,但如果目标 CDN 厂商的服务器不接收该条视频流,依然可能导致发布失败。
* @param err 0表示成功,其余值表示失败
* @param errMsg 具体错误原因
*/
- (void)onStartPublishCDNStream:(int)err errMsg:(NSString *)errMsg;
/**
* 8.4 停止旁路推流到 CDN 完成的回调
* 8.4 停止向非腾讯云 CDN 上发布音视频流的事件回调
*
* 对应于 TRTCCloud 中的 stopPublishCDNStream() 接口
* 当您调用 {@link stopPublishCDNStream} 开始向非腾讯云直播 CDN 上发布音视频流时,SDK 会立刻将这一指令同步给云端服务器。
* 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
*
* @param err 0表示成功,其余值表示失败
* @param errMsg 具体错误原因
*/
- (void)onStopPublishCDNStream:(int)err errMsg:(NSString *)errMsg;
/**
* 8.5 设置云端的混流转码参数的回调,对应于 TRTCCloud 中的 setMixTranscodingConfig() 接口
* 8.5 设置云端混流的排版布局和转码参数的事件回调
*
* @param err 0表示成功,其余值表示失败
* @param errMsg 具体错误原因
* 当您调用 {@link setMixTranscodingConfig} 调整云端混流的排版布局和转码参数时,SDK 会立刻将这一调整指令同步给云端服务器。
* 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
*
* @param err 错误码:0表示成功,其余值表示失败。
* @param errMsg 具体的错误原因。
*/
- (void)onSetMixTranscodingConfig:(int)err errMsg:(NSString*)errMsg;
- (void)onSetMixTranscodingConfig:(int)err errMsg:(NSString *)errMsg;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (九)音效回调
// 屏幕分享相关事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 音效回调
/// @name 屏幕分享相关事件回调
/// @{
/**
* 播放音效结束回调
*
* @param effectId 音效 ID
* @param code 0 表示播放正常结束;其他表示异常结束
* @note 该接口已不再维护,推荐使用 TXAudioEffectManager.startPlayMusic 及相关回调
*/
- (void)onAudioEffectFinished:(int) effectId code:(int) code DEPRECATED_ATTRIBUTE;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (十)屏幕分享回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 屏幕分享回调
/// @{
/**
* 10.1 当屏幕分享开始时,SDK 会通过此回调通知
* 9.1 屏幕分享开启的事件回调
*
* 当您通过 {@link startScreenCapture} 等相关接口启动屏幕分享时,SDK 便会抛出此事件回调。
*/
- (void)onScreenCaptureStarted;
/**
* 10.2 当屏幕分享暂停时,SDK 会通过此回调通知
* 9.2 屏幕分享暂停的事件回调
*
* @param reason 原因,0:用户主动暂停;1:屏幕窗口不可见暂停
* 当您通过 {@link pauseScreenCapture} 暂停屏幕分享时,SDK 便会抛出此事件回调。
* @param reason 原因。
* - 0:用户主动暂停。
* - 1:注意此字段的含义在 MAC 和 Windows 平台有稍微差异。屏幕窗口不可见暂停(Mac)。表示设置屏幕分享参数导致的暂停(Windows)。
* - 2:表示屏幕分享窗口被最小化导致的暂停(仅 Windows)。
* - 3:表示屏幕分享窗口被隐藏导致的暂停(仅 Windows)。
*/
- (void)onScreenCapturePaused:(int)reason;
/**
* 10.3 当屏幕分享恢复时,SDK 会通过此回调通知
* 9.3 屏幕分享恢复的事件回调
*
* @param reason 恢复原因,0:用户主动恢复;1:屏幕窗口恢复可见从而恢复分享
* 当您通过 {@link resumeScreenCapture} 恢复屏幕分享时,SDK 便会抛出此事件回调。
* @param reason 恢复原因。
* - 0:用户主动恢复。
* - 1:注意此字段的含义在 MAC 和 Windows 平台有稍微差异。屏幕窗口恢复可见从而恢复分享(Mac)。屏幕分享参数设置完毕后自动恢复(Windows)
* - 2:表示屏幕分享窗口从最小化被恢复(仅 Windows)。
* - 3:表示屏幕分享窗口从隐藏被恢复(仅 Windows)。
*/
- (void)onScreenCaptureResumed:(int)reason;
/**
* 10.4 当屏幕分享停止时,SDK 会通过此回调通知
* 9.4 屏幕分享停止的事件回调
*
* @param reason 停止原因,0:用户主动停止;1:屏幕窗口关闭导致停止
* 当您通过 {@link stopScreenCapture} 停止屏幕分享时,SDK 便会抛出此事件回调。
* @param reason 停止原因,0:用户主动停止;1:屏幕窗口关闭导致停止;2:表示屏幕分享的显示屏状态变更(如接口被拔出、投影模式变更等)。
*/
- (void)onScreenCaptureStoped:(int)reason;
/// @}
#if TARGET_OS_IPHONE
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (十一)媒体录制回调
// 本地录制和本地截图的事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 媒体录制回调
/// @name 本地录制和本地截图的事件回调
/// @{
/**
* 11.1 媒体录制回调
* 10.1 本地录制任务已经开始的事件回调
*
* 当您调用 {@link startLocalRecording} 启动本地媒体录制任务时,SDK 会抛出该事件回调,用于通知您录制任务是否已经顺利启动。
* @param errCode 错误码 0:初始化录制成功;-1:初始化录制失败;-2: 文件后缀名有误。
* @param storagePath 录制文件存储路径
*/
#if TARGET_OS_IPHONE
- (void)onLocalRecordBegin:(NSInteger)errCode storagePath:(NSString *)storagePath;
#endif
/**
* 11.2 录制信息更新回调
* 10.2 本地录制任务正在进行中的进展事件回调
*
* 当您调用 {@link startLocalRecording} 成功启动本地媒体录制任务后,SDK 变会定时地抛出本事件回调。
* 您可通过捕获该事件回调来获知录制任务的健康状况。
* 您可以在 {@link startLocalRecording} 时设定本事件回调的抛出间隔。
*
* @param duration 已经录制的累计时长,单位毫秒
* @param storagePath 录制文件存储路径
* @param duration 录制时长,单位毫秒
*/
#if TARGET_OS_IPHONE
- (void)onLocalRecording:(NSInteger)duration storagePath:(NSString *)storagePath;
#endif
/**
* 11.2 录制任务已结束
* 10.3 本地录制任务已经结束的事件回调
*
* 当您调用 {@link stopLocalRecording} 停止本地媒体录制任务时,SDK 会抛出该事件回调,用于通知您录制任务的最终结果。
* @param errCode 错误码 0:录制成功;-1:录制失败;-2:切换分辨率或横竖屏导致录制结束。
* @param storagePath 录制文件存储路径
*/
#if TARGET_OS_IPHONE
- (void)onLocalRecordComplete:(NSInteger)errCode storagePath:(NSString *)storagePath;
///@}
#endif
@end
/// @}
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (十二)自定义视频渲染回调
// 废弃的事件回调(建议使用对应的新回调)
//
/////////////////////////////////////////////////////////////////////////////////
#pragma mark - TRTCVideoRenderDelegate
/// @addtogroup TRTCCloudDelegate_ios
/// @name 废弃的事件回调(建议使用对应的新回调)
/// @{
/**
* 视频数据帧的自定义处理回调
* 有主播加入当前房间(已废弃)
*
* @deprecated 新版本开始不推荐使用,建议使用 {@link onRemoteUserEnterRoom} 替代之。
*/
@protocol TRTCVideoRenderDelegate <NSObject>
- (void)onUserEnter:(NSString *)userId __attribute__((deprecated("use onRemoteUserLeaveRoom instead")));
/**
* 自定义视频渲染回调
* 有主播离开当前房间(已废弃)
*
* @param frame 待渲染的视频帧信息
* @param userId 视频源的 userId,如果是本地视频回调(setLocalVideoRenderDelegate),该参数可以忽略
* @param streamType 视频源类型,例如,使用摄像头画面或屏幕分享画面等
* @deprecated 新版本开始不推荐使用,建议使用 {@link onRemoteUserLeaveRoom} 替代之。
*/
@optional
- (void) onRenderVideoFrame:(TRTCVideoFrame * _Nonnull)frame userId:(NSString* __nullable)userId streamType:(TRTCVideoStreamType)streamType;
- (void)onUserExit:(NSString *)userId reason:(NSInteger)reason __attribute__((deprecated("use onRemoteUserLeaveRoom instead")));
@end
/**
* 音效播放已结束(已废弃)
*
* @deprecated 新版本开始不推荐使用,建议使用 {@link ITXAudioEffectManager} 接口替代之。
* 新的接口中不再区分背景音乐和音效,而是统一用 {@link startPlayMusic} 取代之。
*/
- (void)onAudioEffectFinished:(int)effectId code:(int)code __attribute__((deprecated("use ITXAudioEffectManager.startPlayMusic instead")));
/// @}
@end // End of class TRTCCloudDelegate
/////////////////////////////////////////////////////////////////////////////////
//
// (十三)第三方美颜回调
// 视频数据自定义回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 视频数据自定义回调
/// @{
@protocol TRTCVideoRenderDelegate <NSObject>
/**
* 自定义视频渲染回调
*
* 当您设置了本地或者远端的视频自定义渲染回调之后,SDK 就会将原本要交给渲染控件进行渲染的视频帧通过此回调接口抛送给您,以便于您进行自定义渲染。
* @param frame 待渲染的视频帧信息
* @param userId 视频源的 userId,如果是本地视频回调(setLocalVideoRenderDelegate),该参数可以忽略
* @param streamType 频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
*/
@optional
- (void)onRenderVideoFrame:(TRTCVideoFrame *_Nonnull)frame userId:(NSString *__nullable)userId streamType:(TRTCVideoStreamType)streamType;
@end // End of class TRTCVideoRenderDelegate
@protocol TRTCVideoFrameDelegate <NSObject>
/**
* 用于对接第三方美颜组件的视频处理回调
*
* 如果您选购了第三方美颜组件,就需要在 TRTCCloud 中设置第三方美颜回调,之后 TRTC 就会将原本要进行预处理的视频帧通过此回调接口抛送给您。
* 之后您就可以将 TRTC 抛出的视频帧交给第三方美颜组件进行图像处理,由于抛出的数据是可读且可写的,因此第三方美颜的处理结果也可以同步给 TRTC 进行后续的编码和发送。
*
* @param srcFrame 用于承载 TRTC 采集到的摄像头画面
* @param dstFrame 用于接收第三方美颜处理过的视频画面
* @note 目前仅支持 OpenGL 纹理方案
*
* 情况一:美颜组件自身会产生新的纹理
* 如果您使用的美颜组件会在处理图像的过程中产生一帧全新的纹理(用于承载处理后的图像),那请您在回调函数中将 dstFrame.textureId 设置为新纹理的 ID:
* <pre>
* uint32_t onProcessVideoFrame(TRTCVideoFrame * _Nonnull)srcFrame dstFrame:(TRTCVideoFrame * _Nonnull)dstFrame{
* self.frameID += 1;
* dstFrame.pixelBuffer = [[FURenderer shareRenderer] renderPixelBuffer:srcFrame.pixelBuffer
* withFrameId:self.frameID
* items:self.renderItems
* itemCount:self.renderItems.count];
* return 0;
* }
* </pre>
*
*
* 情况二:美颜组件需要您提供目标纹理
* 如果您使用的第三方美颜模块并不生成新的纹理,而是需要您设置给该模块一个输入纹理和一个输出纹理,则可以考虑如下方案:
* ```ObjectiveC
* uint32_t onProcessVideoFrame(TRTCVideoFrame * _Nonnull)srcFrame dstFrame:(TRTCVideoFrame * _Nonnull)dstFrame{
* thirdparty_process(srcFrame.textureId, srcFrame.width, srcFrame.height, dstFrame.textureId);
* return 0;
* }
* ```
* ```java
* int onProcessVideoFrame(TRTCCloudDef.TRTCVideoFrame srcFrame, TRTCCloudDef.TRTCVideoFrame dstFrame) {
* thirdparty_process(srcFrame.texture.textureId, srcFrame.width, srcFrame.height, dstFrame.texture.textureId);
* return 0;
* }
* ```
*/
@optional
- (uint32_t)onProcessVideoFrame:(TRTCVideoFrame *_Nonnull)srcFrame dstFrame:(TRTCVideoFrame *_Nonnull)dstFrame;
/**
* 第三方美颜的视频数据回调,需要使用 TRTCCloud 中的 setLocalVideoProcessDelegete 接口进行设置
*
* @param srcFrame 用于承载 TRTC 采集到的摄像头画面
* @param dstFrame 用于接收第三方美颜处理过的视频画面
* @note 目前仅支持 OpenGL 纹理方案
*
* 【使用相芯】
* 由于相芯的美颜模块会在处理图像的过程中产生一个全新的纹理,因此需要您在回调函数中将 dstFrame.textureId 设置为相芯处理后的新纹理。
* <pre>
* uint32_t onProcessVideoFrame(TRTCVideoFrame * _Nonnull)srcFrame dstFrame:(TRTCVideoFrame * _Nonnull)dstFrame
* {
* uint32_t dstTextureId = renderItemWithTexture(srcFrame.textureId, srcFrame.width, srcFrame.height);
* dstFrame.textureId = dstTextureId;
* return 0;
* }
* </pre>
*
* 【其他方案】
* 如果您使用的第三方美颜模块并不生成新的纹理,而是需要您设置给该模块一个输入纹理和一个输出纹理,则可以考虑如下方案:
* <pre>
* uint32_t onProcessVideoFrame(TRTCVideoFrame * _Nonnull)srcFrame dstFrame:(TRTCVideoFrame * _Nonnull)dstFrame
* {
* thirdparty_process(srcFrame.textureId, srcFrame.width, srcFrame.height, dstFrame.textureId);
* return 0;
* }
* </pre>
*
**/
- (uint32_t)onProcessVideoFrame:(TRTCVideoFrame * _Nonnull)srcFrame dstFrame:(TRTCVideoFrame * _Nonnull)dstFrame;
/**
* SDK 内部的 OpenGL 环境的销毁通知
* SDK 内部 OpenGL 环境被销的通知
*/
@optional
- (void)onGLContextDestory;
@end
@end // End of class TRTCVideoFrameDelegate
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (十四)音频数据回调
// 音频数据自定义回调
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 声音数据帧的自定义处理回调
*/
/// @name 音频数据自定义回调
/// @{
@protocol TRTCAudioFrameDelegate <NSObject>
@optional
/**
* 本地麦克风采集到的原始音频数据回调
*
* @param frame 音频数据
* @note - 请不要在此回调函数中做任何耗时操作,建议直接拷贝到另一线程进行处理,否则会导致各种声音问题。
* @note - 此接口回调出的音频数据 **不包含** 背景音、音效、混响等前处理效果,延迟极低。
* - 此接口回调出的音频数据支持修改。
* 当您设置完音频数据自定义回调之后,SDK 内部会把刚从麦克风采集到的原始音频数据,以 PCM 格式的形式通过本接口回调给您。
* - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
* - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
* - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
*
* @param frame PCM 格式的音频数据帧
* @note
* 1. 请不要在此回调函数中做任何耗时操作,由于 SDK 每隔 20ms 就要处理一帧音频数据,如果您的处理时间超过 20ms,就会导致声音异常。
* 2. 此接口回调出的音频数据是可读写的,也就是说您可以在回调函数中同步修改音频数据,但请保证处理耗时。
* 3. 此接口回调出的音频数据**不包含**背景音、音效、混响等前处理效果,延迟极低。
*/
- (void) onCapturedRawAudioFrame:(TRTCAudioFrame *)frame;
- (void)onCapturedRawAudioFrame:(TRTCAudioFrame *)frame;
/**
* 本地采集并经过音频模块前处理后的音频数据回调
*
* @param frame 音频数据
* @note - 请不要在此回调函数中做任何耗时操作,建议直接拷贝到另一线程进行处理,否则会导致各种声音问题。
* @note - 此接口回调出的音频数据包含背景音、音效、混响等前处理效果,延迟较高。
* @note - 此接口回调出的音频数据支持修改。
* @note - 此接口回调出的音频时间帧长固定为 0.02s。
由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
以SDK默认的音频录制格式 48000 采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
* 当您设置完音频数据自定义回调之后,SDK 内部会把刚采集到并经过前处理(ANS、AEC、AGC)之后的数据,以 PCM 格式的形式通过本接口回调给您。
* - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
* - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
* - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
*
* 特殊说明:
* 您可以通过设置接口中的 `TRTCAudioFrame.extraData` 字段,达到传输信令的目的。
* 由于音频帧头部的数据块不能太大,建议您写入 `extraData` 时,尽量将信令控制在几个字节的大小,如果超过 100 个字节,写入的数据不会被发送。
* 房间内其他用户可以通过 {@link TRTCAudioFrameDelegate} 中的 `onRemoteUserAudioFrame` 中的 `TRTCAudioFrame.extraData` 字段回调接收数据。
*
* @param frame PCM 格式的音频数据帧
* @note
* 1. 请不要在此回调函数中做任何耗时操作,由于 SDK 每隔 20ms 就要处理一帧音频数据,如果您的处理时间超过 20ms,就会导致声音异常。
* 2. 此接口回调出的音频数据是可读写的,也就是说您可以在回调函数中同步修改音频数据,但请保证处理耗时。
* 3. 此接口回调出的数据已经经过了回声抑制(AEC)处理,但声音的延迟相比于 {@link onCapturedRawAudioFrame} 要高一些。
*/
- (void) onLocalProcessedAudioFrame:(TRTCAudioFrame *)frame;
- (void)onLocalProcessedAudioFrame:(TRTCAudioFrame *)frame;
/**
* 混音前的每一路远程用户的音频数据,即混音前的各路原始数据。例如,对某一路音频进行文字转换时,您必须使用该路音频的原始数据
* 混音前的每一路远程用户的音频数据
*
* @param frame 音频数据
* 当您设置完音频数据自定义回调之后,SDK 内部会把远端的每一路原始数据,在最终混音之前,以 PCM 格式的形式通过本接口回调给您。
* - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
* - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
* - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
*
* @param frame PCM 格式的音频数据帧
* @param userId 用户标识
* @note - 此接口回调出的音频数据是只读的,不支持修改。
* @note 此接口回调出的音频数据是只读的,不支持修改
*/
- (void) onRemoteUserAudioFrame:(TRTCAudioFrame *)frame userId:(NSString *)userId;
- (void)onRemoteUserAudioFrame:(TRTCAudioFrame *)frame userId:(NSString *)userId;
/**
* 各路音频数据混合后的音频数据
* 将各路待播放音频混合之后并在最终提交系统播放之前的数据回调
*
* 当您设置完音频数据自定义回调之后,SDK 内部会把各路待播放的音频混合之后的音频数据,在提交系统播放之前,以 PCM 格式的形式通过本接口回调给您。
* - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
* - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
* - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
*
* @param frame 音频数据
* @note - 请不要在此回调函数中做任何耗时操作,建议直接拷贝到另一线程进行处理,否则会导致各种声音问题。
* @note - 此接口回调出的音频数据支持修改。
* @note - 此接口回调出的音频时间帧长固定为 0.02s。
由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
以SDK默认的音频播放格式 48000 采样率、双声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 2 × 16bit = 30720bit = 3840字节】。
* @note - 此接口回调出的音频数据是各路音频播放数据的混合,不包含耳返的音频数据。
* @param frame PCM 格式的音频数据帧
* @note
* 1. 请不要在此回调函数中做任何耗时操作,由于 SDK 每隔 20ms 就要处理一帧音频数据,如果您的处理时间超过 20ms,就会导致声音异常。
* 2. 此接口回调出的音频数据是可读写的,也就是说您可以在回调函数中同步修改音频数据,但请保证处理耗时。
* 3. 此接口回调出的是对各路待播放音频数据的混合,但其中并不包含耳返的音频数据。
*/
- (void) onMixedPlayAudioFrame:(TRTCAudioFrame *)frame;
- (void)onMixedPlayAudioFrame:(TRTCAudioFrame *)frame;
/**
* SDK所有音频数据混合后的数据回调(包括采集音频数据和所有播放音频数据)
*
* @param frame 音频数据
* @note - 此接口回调出的音频数据不支持修改。
* @note - 此接口回调出的音频时间帧长固定为 0.02s。音频格式固定为48000采样率、单声道、16采样点位宽。
由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
因此回调的字节帧长固定为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
* @note - 此接口回调出的是SDK所有音频数据的混合数据,包括:经过特效(包括混响、变声等)处理后的本地麦克风采集数据,
所有远程用户的数据,所有背景音和音效数据。不包括耳返数据。
*/
- (void) onMixedAllAudioFrame:(TRTCAudioFrame *)frame;
* SDK 所有音频混合后的音频数据(包括采集到的和待播放的)
*
* 当您设置完音频数据自定义回调之后,SDK 内部会把所有采集到的和待播放的音频数据混合起来,以 PCM 格式的形式通过本接口回调给您,便于您进行自定义录制。
* - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
* - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
* - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
*
* @param frame PCM 格式的音频数据帧
* @note
* 1. 此接口回调出的是SDK所有音频数据的混合数据,包括:经过 3A 前处理、特效叠加以及背景音乐混音后的本地音频,所有远端音频,但不包括耳返音频。
* 2. 此接口回调出的音频数据不支持修改。
*/
- (void)onMixedAllAudioFrame:(TRTCAudioFrame *)frame;
@end
@end // End of class TRTCAudioFrameDelegate
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (十五)Log 信息回调
// 更多事件回调接口
//
/////////////////////////////////////////////////////////////////////////////////
/**
* 日志相关回调
*
* 建议在比较早初始化的类中设置回调委托对象,例如 AppDelegate
*/
/// @name 更多事件回调接口
/// @{
@protocol TRTCLogDelegate <NSObject>
@optional
/**
* 有日志打印时的回调
* 本地 LOG 的打印回调
*
* 如果您希望捕获 SDK 的本地日志打印行为,可以通过设置日志回调,让 SDK 将要打印的日志都通过本回调接口抛送给您。
* @param log 日志内容
* @param level 日志等级,参见 TRTCLogLevel
* @param module 值暂无具体意义,目前为固定值 TXLiteAVSDK
* @param level 日志等级 参见 TRTC_LOG_LEVEL
* @param module 保留字段,暂无具体意义,目前为固定值 TXLiteAVSDK
*/
@optional
-(void) onLog:(nullable NSString*)log LogLevel:(TRTCLogLevel)level WhichModule:(nullable NSString*)module;
- (void)onLog:(nullable NSString *)log LogLevel:(TRTCLogLevel)level WhichModule:(nullable NSString *)module;
@end
@end // End of class TRTCLogDelegate
/// @}
NS_ASSUME_NONNULL_END
/// @}
... ...
/*
* Module: TRTCStatistics @ TXLiteAVSDK
*
* Function: 腾讯云视频通话功能的质量统计相关接口
*
/**
* Module: TRTC 音视频统计指标(只读)
* Function: TRTC SDK 会以两秒钟一次的频率向您汇报当前实时的音视频指标(帧率、码率、卡顿情况等)
*/
///@addtogroup TRTCCloudDef_ios
///@{
/// @defgroup TRTCStatisic_ios TRTCStatisic
/// TRTC 音视频统计指标
/// @{
/////////////////////////////////////////////////////////////////////////////////
//
// 本地的音视频统计指标
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 本地的音视频统计指标
/// @{
/// 自己本地的音视频统计信息
@interface TRTCLocalStatistics : NSObject
/// 视频宽度
@property (nonatomic, assign) uint32_t width;
///【字段含义】本地视频的宽度,单位 px
@property(nonatomic, assign) uint32_t width;
/// 视频高度
@property (nonatomic, assign) uint32_t height;
///【字段含义】本地视频的高度,单位 px
@property(nonatomic, assign) uint32_t height;
/// 帧率(fps)
@property (nonatomic, assign) uint32_t frameRate;
///【字段含义】本地视频的帧率,即每秒钟会有多少视频帧,单位:FPS
@property(nonatomic, assign) uint32_t frameRate;
/// 视频发送码率(Kbps)
@property (nonatomic, assign) uint32_t videoBitrate;
///【字段含义】远端视频的码率,即每秒钟新产生视频数据的多少,单位 Kbps
@property(nonatomic, assign) uint32_t videoBitrate;
/// 音频采样率(Hz)
@property (nonatomic, assign) uint32_t audioSampleRate;
///【字段含义】远端音频的采样率,单位 Hz
@property(nonatomic, assign) uint32_t audioSampleRate;
/// 音频发送码率(Kbps)
@property (nonatomic, assign) uint32_t audioBitrate;
///【字段含义】本地音频的码率,即每秒钟新产生音频数据的多少,单位 Kbps
@property(nonatomic, assign) uint32_t audioBitrate;
/// 流类型(大画面 | 小画面 | 辅路画面)
@property (nonatomic, assign) TRTCVideoStreamType streamType;
///【字段含义】视频流类型(高清大画面|低清小画面|辅流画面)
@property(nonatomic, assign) TRTCVideoStreamType streamType;
/// 音频设备采集状态,用于检测外接音频设备的健康度
///【字段含义】音频设备采集状态(用于检测音频外设的健康度)
/// 0:采集设备状态正常;1:检测到长时间静音;2:检测到破音;3:检测到声音异常间断。
@property (nonatomic, assign) uint32_t audioCaptureState;
@property(nonatomic, assign) uint32_t audioCaptureState;
@end
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 远端的音视频统计指标
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 远端的音视频统计指标
/// @{
/// 远端成员的音视频统计信息
@interface TRTCRemoteStatistics : NSObject
/// 用户 ID,指定是哪个用户的视频流
@property (nonatomic, retain) NSString* userId;
/// 该线路的总丢包率(%)
/// 这个值越小越好,例如,丢包率为0表示网络很好。
/// 丢包率是该线路的 userId 从上行到服务器再到下行的总丢包率。
/// 如果 downLoss 为0,但是 finalLoss 不为0,说明该 userId 上行时出现了无法恢复的丢包。
@property (nonatomic, assign) uint32_t finalLoss;
///【字段含义】用户 ID
@property(nonatomic, retain) NSString* userId;
/// 视频宽度
@property (nonatomic, assign) uint32_t width;
///【字段含义】该路音视频流的总丢包率(%)
/// finalLoss 代表该路音视频流历经“主播 => 云端 => 观众”这样一条完整的传输链路后,最终在观众端统计到的丢包率。
/// finalLoss 越小越好,丢包率为0即表示该路音视频流的所有数据均已经完整地到达了观众端。
///如果出现了 downLoss == 0 但 finalLoss != 0 的情况,说明该路音视频流在“云端=>观众”这一段链路上没有出现丢包,但是在“主播=>云端”这一段链路上出现了不可恢复的丢包。
@property(nonatomic, assign) uint32_t finalLoss;
/// 视频高度
@property (nonatomic, assign) uint32_t height;
///【字段含义】远端视频的宽度,单位 px
@property(nonatomic, assign) uint32_t width;
/// 接收帧率(fps)
@property (nonatomic, assign) uint32_t frameRate;
///【字段含义】远端视频的高度,单位 px
@property(nonatomic, assign) uint32_t height;
/// 视频码率(Kbps)
@property (nonatomic, assign) uint32_t videoBitrate;
///【字段含义】远端视频的帧率,单位:FPS
@property(nonatomic, assign) uint32_t frameRate;
/// 音频采样率(Hz)
@property (nonatomic, assign) uint32_t audioSampleRate;
///【字段含义】远端视频的码率,单位 Kbps
@property(nonatomic, assign) uint32_t videoBitrate;
/// 音频码率(Kbps)
@property (nonatomic, assign) uint32_t audioBitrate;
///【字段含义】本地音频的采样率,单位 Hz
@property(nonatomic, assign) uint32_t audioSampleRate;
/// 播放时延(ms)
@property (nonatomic, assign) uint32_t jitterBufferDelay;
///【字段含义】本地音频的码率,单位 Kbps
@property(nonatomic, assign) uint32_t audioBitrate;
/// 端对端延迟(ms)
/// 该字段为全链路延迟统计,链路包含:采集->编码->网络传输->接收->缓冲->解码->播放
/// 延迟以 audio 为基准进行计算。需要本地和远端均为8.5版本以上时才生效
/// 若远端用户为低版本,对应延迟会回调为0,此时代表无效值
@property (nonatomic, assign) uint32_t point2PointDelay;
///【字段含义】播放延迟,单位 ms
///为了避免网络抖动和网络包乱序导致的声音和画面卡顿,TRTC 会在播放端管理一个播放缓冲区,用于对接收到的网络数据包进行整理,
///该缓冲区的大小会根据当前的网络质量进行自适应调整,该缓冲区的大小折算成以毫秒为单位的时间长度,也就是 jitterBufferDelay。
@property(nonatomic, assign) uint32_t jitterBufferDelay;
/// 音频播放卡顿累计时长(ms)
@property (nonatomic, assign) uint32_t audioTotalBlockTime;
///【字段含义】端到端延迟,单位 ms
/// point2PointDelay 代表 “主播=>云端=>观众” 的延迟,更准确地说,它代表了“采集=>编码=>网络传输=>接收=>缓冲=>解码=>播放” 全链路的延迟。
/// point2PointDelay 需要本地和远端的 SDK 均为 8.5 及以上的版本才生效,若远端用户为 8.5 以前的版本,此数值会一直为0,代表无意义。
@property(nonatomic, assign) uint32_t point2PointDelay;
/// 音频播放卡顿率,音频卡顿的累计时长占音频总播放时长的百分比 (%)
@property (nonatomic, assign) uint32_t audioBlockRate;
///【字段含义】音频播放的累计卡顿时长,单位 ms
@property(nonatomic, assign) uint32_t audioTotalBlockTime;
/// 视频播放卡顿累计时长(ms)
@property (nonatomic, assign) uint32_t videoTotalBlockTime;
///【字段含义】音频播放卡顿率,单位 (%)
///音频播放卡顿率(audioBlockRate) = 音频播放的累计卡顿时长(audioTotalBlockTime) / 音频播放的总时长
@property(nonatomic, assign) uint32_t audioBlockRate;
/// 音频播放卡顿率,视频卡顿累计时长占视频总播放时长的百分比(%)
@property (nonatomic, assign) uint32_t videoBlockRate;
///【字段含义】视频播放的累计卡顿时长,单位 ms
@property(nonatomic, assign) uint32_t videoTotalBlockTime;
/// 流类型(大画面 | 小画面 | 辅路画面)
@property (nonatomic, assign) TRTCVideoStreamType streamType;
///【字段含义】视频播放卡顿率,单位 (%)
///视频播放卡顿率(videoBlockRate) = 视频播放的累计卡顿时长(videoTotalBlockTime) / 视频播放的总时长
@property(nonatomic, assign) uint32_t videoBlockRate;
///【字段含义】视频流类型(高清大画面|低清小画面|辅流画面)
@property(nonatomic, assign) TRTCVideoStreamType streamType;
@end
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 网络和性能的汇总统计指标
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 网络和性能的汇总统计指标
/// @{
/// 统计数据
@interface TRTCStatistics : NSObject
/// C -> S 上行丢包率(%),
/// 该值越小越好,例如,丢包率为 0 表示网络很好,
/// 丢包率为 30@% 则意味着 SDK 向服务器发送的数据包中会有 30@% 丢失在上行传输中。
@property (nonatomic, assign) uint32_t upLoss;
///【字段含义】当前应用的 CPU 使用率,单位 (%)
@property(nonatomic, assign) uint32_t appCpu;
///【字段含义】当前系统的 CPU 使用率,单位 (%)
@property(nonatomic, assign) uint32_t systemCpu;
/// S -> C 下行丢包率(%),
/// 该值越小越好,例如,丢包率为0表示网络很好,
/// 丢包率为 30@% 则意味着 SDK 向服务器发送的数据包中会有 30@% 丢失在下行传输中。
@property (nonatomic, assign) uint32_t downLoss;
///【字段含义】从 SDK 到云端的上行丢包率,单位 (%)
///该数值越小越好,如果 upLoss 为 0%,则意味着上行链路的网络质量很好,上传到云端的数据包基本不发生丢失。
///如果 upLoss 为 30%,则意味着 SDK 向云端发送的音视频数据包中,会有 30% 丢失在传输链路中。
@property(nonatomic, assign) uint32_t upLoss;
/// 当前 App 的 CPU 使用率(%)
@property (nonatomic, assign) uint32_t appCpu;
///【字段含义】从云端到 SDK 的下行丢包率,单位 (%)
///该数值越小越好,如果 downLoss 为 0%,则意味着下行链路的网络质量很好,从云端接收的数据包基本不发生丢失。
///如果 downLoss 为 30%,则意味着云端向 SDK 传输的音视频数据包中,会有 30% 丢失在传输链路中。
@property(nonatomic, assign) uint32_t downLoss;
/// 当前系统的 CPU 使用率(%)
@property (nonatomic, assign) uint32_t systemCpu;
///【字段含义】从 SDK 到云端的往返延时,单位 ms
///该数值代表从 SDK 发送一个网络包到云端,再从云端回送一个网络包到 SDK 的总计耗时,也就是一个网络包经历 “SDK=>云端=>SDK” 的总耗时。
///该数值越小越好:如果 rtt < 50ms,意味着较低的音视频通话延迟;如果 rtt > 200ms,则意味着较高的音视频通话延迟。
///需要特别解释的是,rtt 代表 “SDK=>云端=>SDK” 的总耗时,所不需要区分 upRtt 和 downRtt。
@property(nonatomic, assign) uint32_t rtt;
/// 延迟(毫秒),
/// 指 SDK 到腾讯云服务器的一次网络往返时间,该值越小越好。
/// 一般低于 50ms 的 rtt 相对理想,而高于 100ms 的 rtt 会引入较大的通话延时。
/// 由于数据上下行共享一条网络连接,所以 local 和 remote 的 rtt 相同。
@property (nonatomic, assign) uint32_t rtt;
///【字段含义】从 SDK 到本地路由器的往返时延,单位 ms
///该数值代表从 SDK 发送一个网络包到本地路由器网关,再从网关回送一个网络包到 SDK 的总计耗时,也就是一个网络包经历 “SDK=>网关=>SDK” 的总耗时。
///该数值越小越好:如果 gatewayRtt < 50ms,意味着较低的音视频通话延迟;如果 gatewayRtt > 200ms,则意味着较高的音视频通话延迟。
///当网络类型为蜂窝网时,该值无效。
@property(nonatomic, assign) uint32_t gatewayRtt;
/// 总接收字节数(包含信令及音视频)
@property (nonatomic, assign) uint64_t receivedBytes;
///【字段含义】总发送字节数(包含信令数据和音视频数据),单位:字节数(Bytes)
@property(nonatomic, assign) uint64_t sentBytes;
/// 总发送字节数(包含信令及音视频)
@property (nonatomic, assign) uint64_t sentBytes;
///【字段含义】总接收字节数(包含信令数据和音视频数据),单位:字节数(Bytes)
@property(nonatomic, assign) uint64_t receivedBytes;
/// 自己本地的音视频统计信息,可能有主画面、小画面以及辅路画面等多路的情况,因此是一个数组
@property (nonatomic, strong) NSArray<TRTCLocalStatistics*>* localStatistics;
///【字段含义】本地的音视频统计信息
///由于本地可能有三路音视频流(即高清大画面,低清小画面,以及辅流画面),因此本地的音视频统计信息是一个数组。
@property(nonatomic, strong) NSArray<TRTCLocalStatistics*>* localStatistics;
///【字段含义】远端的音视频统计信息
///因为同时可能有多个远端用户,而且每个远端用户同时可能有多路音视频流(即高清大画面,低清小画面,以及辅流画面),因此远端的音视频统计信息是一个数组。
@property(nonatomic, strong) NSArray<TRTCRemoteStatistics*>* remoteStatistics;
/// 远端成员的音视频统计信息,可能有主画面、小画面以及辅路画面等多路的情况,因此是一个数组
@property (nonatomic, strong) NSArray<TRTCRemoteStatistics*>* remoteStatistics;
@end
///@}
/// @}
/// @}
... ...
/*
* Module: TXAudioEffectManager 音乐和人声设置类
*
* Function: 用于音乐、短音效和人声效果功能的使用
*
*/
/**
* Module: TRTC 背景音乐、短音效和人声特效的管理类
* Function: 用于对背景音乐、短音效和人声特效进行设置的管理类
*/
/// @defgroup TXAudioEffectManager_ios TXAudioEffectManager
/// TRTC 背景音乐、短音效和人声特效的管理类
/// @{
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/////////////////////////////////////////////////////////////////////////////////
//
// 音效相关的枚举值定义
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 音效相关的枚举值定义
/// @{
/**
* 1.1 混响特效
*
* 混响特效可以作用于人声之上,通过声学算法对声音进行叠加处理,模拟出各种不同环境下的临场感受,目前支持如下几种混响效果:
* 0:关闭;1:KTV;2:小房间;3:大会堂;4:低沉;5:洪亮;6:金属声;7:磁性。
*/
typedef NS_ENUM(NSInteger, TXVoiceReverbType) {
TXVoiceReverbType_0 = 0, ///< disable
TXVoiceReverbType_1 = 1, ///< KTV
TXVoiceReverbType_2 = 2, ///< small room
TXVoiceReverbType_3 = 3, ///< great hall
TXVoiceReverbType_4 = 4, ///< deep voice
TXVoiceReverbType_5 = 5, ///< loud voice
TXVoiceReverbType_6 = 6, ///< metallic sound
TXVoiceReverbType_7 = 7, ///< magnetic sound
};
/**
* 1.2 变声特效
*
* 变声特效可以作用于人声之上,通过声学算法对人声进行二次处理,以获得与原始声音所不同的音色,目前支持如下几种变声特效:
* 0:关闭;1:熊孩子;2:萝莉;3:大叔;4:重金属;5:感冒;6:外语腔;7:困兽;8:肥宅;9:强电流;10:重机械;11:空灵。
*/
typedef NS_ENUM(NSInteger, TXVoiceChangeType) {
TXVoiceChangeType_0 = 0, ///< disable
TXVoiceChangeType_1 = 1, ///< naughty kid
TXVoiceChangeType_2 = 2, ///< Lolita
TXVoiceChangeType_3 = 3, ///< uncle
TXVoiceChangeType_4 = 4, ///< heavy metal
TXVoiceChangeType_5 = 5, ///< catch cold
TXVoiceChangeType_6 = 6, ///< foreign accent
TXVoiceChangeType_7 = 7, ///< caged animal trapped beast
TXVoiceChangeType_8 = 8, ///< indoorsman
TXVoiceChangeType_9 = 9, ///< strong current
TXVoiceChangeType_10 = 10, ///< heavy machinery
TXVoiceChangeType_11 = 11, ///< intangible
};
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 背景音乐的播放事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 背景音乐的事件回调接口
/// @{
// Playback progress block of background music
///背景音乐开始播放
typedef void (^TXAudioMusicStartBlock)(NSInteger errCode);
///背景音乐的播放进度
typedef void (^TXAudioMusicProgressBlock)(NSInteger progressMs, NSInteger durationMs);
///背景音乐已经播放完毕
typedef void (^TXAudioMusicCompleteBlock)(NSInteger errCode);
@class TXAudioMusicParam;
typedef NS_ENUM(NSInteger, TXVoiceChangeType);
typedef NS_ENUM(NSInteger, TXVoiceReverbType);
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 背景音乐的播放控制信息
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 背景音乐的播放控制信息
/// @{
/**
* 背景音乐的播放控制信息
*
* 该信息用于在接口 {@link startPlayMusic} 中指定背景音乐的相关信息,包括播放 ID、文件路径和循环次数等:
* 1. 如果要多次播放同一首背景音乐,请不要每次播放都分配一个新的 ID,我们推荐使用相同的 ID。
* 2. 若您希望同时播放多首不同的音乐,请为不同的音乐分配不同的 ID 进行播放。
* 3. 如果使用同一个 ID 播放不同音乐,SDK 会先停止播放旧的音乐,再播放新的音乐。
*/
@interface TXAudioMusicParam : NSObject
///【字段含义】音乐 ID <br/>
///【特殊说明】SDK 允许播放多路音乐,因此需要使用 ID 进行标记,用于控制音乐的开始、停止、音量等。
@property(nonatomic) int32_t ID;
///【字段含义】音效文件的完整路径或 URL 地址。支持的音频格式包括 MP3、AAC、M4A、WAV
@property(nonatomic, copy) NSString *path;
///【字段含义】音乐循环播放的次数 <br/>
///【推荐取值】取值范围为0 - 任意正整数,默认值:0。0表示播放音乐一次;1表示播放音乐两次;以此类推
@property(nonatomic) NSInteger loopCount;
///【字段含义】是否将音乐传到远端 <br/>
///【推荐取值】YES:音乐在本地播放的同时,远端用户也能听到该音乐;NO:主播只能在本地听到该音乐,远端观众听不到。默认值:NO。
@property(nonatomic) BOOL publish;
///【字段含义】播放的是否为短音乐文件 <br/>
///【推荐取值】YES:需要重复播放的短音乐文件;NO:正常的音乐文件。默认值:NO
@property(nonatomic) BOOL isShortFile;
///【字段含义】音乐开始播放时间点,单位:毫秒。
@property(nonatomic) NSInteger startTimeMS;
///【字段含义】音乐结束播放时间点,单位毫秒,0表示播放至文件结尾。
@property(nonatomic) NSInteger endTimeMS;
@end
/// @}
// Definition of audio effect management module
@interface TXAudioEffectManager : NSObject
/// TXAudioEffectManager对象不可直接创建
/// 要通过 `TRTCCloud` 或 `TXLivePush` 的 `getAudioEffectManager` 接口获取
/**
* TXAudioEffectManager对象不可直接被创建
* 要通过 `TRTCCloud` 或 `TXLivePush` 中的 `getAudioEffectManager` 接口获取
*/
- (instancetype)init NS_UNAVAILABLE;
/////////////////////////////////////////////////////////////////////////////////
//
// (一)人声相关特效函数
// 人声相关的特效接口
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 人声相关特效函数
/// @name 人声相关的特效接口
/// @{
/**
* 1.1 开启耳返
*
* 开启后会在耳机里听到自己的声音
* 主播开启耳返后,可以在耳机里听到麦克风采集到的自己发出的声音,该特效适用于主播唱歌的应用场景中
*
* @note 仅在戴耳机时有效,暂时仅支持部分采集延迟较低的机型
* @param enable true:开启;false:关闭
* 需要您注意的是,由于蓝牙耳机的硬件延迟非常高,所以在主播佩戴蓝牙耳机时无法开启此特效,请尽量在用户界面上提示主播佩戴有线耳机。
* 同时也需要注意,并非所有的手机开启此特效后都能达到优秀的耳返效果,我们已经对部分耳返效果不佳的手机屏蔽了该特效。
*
* @note 仅在主播佩戴耳机时才能开启此特效,同时请您提示主播佩戴有线耳机。
* @param enable true:开启;false:关闭。
*/
- (void)enableVoiceEarMonitor:(BOOL)enable;
/**
* 1.2 设置耳返音量
*
* @param volume 音量大小,100为原始音量,范围是:[0 ~ 150],默认值为100
* 通过该接口您可以设置耳返特效中声音的音量大小。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
- (void)setVoiceEarMonitorVolume:(NSInteger)volume;
/**
* 1.3 设置人声的混响效果(KTV、小房间、大会堂、低沉、洪亮...)
* 1.3 设置人声的混响效果
*
* 通过该接口您可以设置人声的混响效果,具体特效请参考枚举定义{@link TXVoiceReverbType}。
*
* @note 设置的效果在退房后会失效,如果下次进房还需要对应特效,需要调用此接口再次设置。
* @note 设置的效果在退出房间后会自动失效,如果下次进房还需要对应特效,需要调用此接口再次进行设置。
*/
- (void)setVoiceReverbType:(TXVoiceReverbType)reverbType;
/**
* 1.4 设置人声的变声特效(萝莉、大叔、重金属、外国人...)
* 1.4 设置人声的变声特效
*
* @note 设置的效果在退房后会失效,如果下次进房还需要对应特效,需要调用此接口再次设置。
* 通过该接口您可以设置人声的变声特效,具体特效请参考枚举定义{@link TXVoiceChangeType}。
*
* @note 设置的效果在退出房间后会自动失效,如果下次进房还需要对应特效,需要调用此接口再次进行设置。
*/
- (void)setVoiceChangerType:(TXVoiceChangeType)changerType;
/**
* 1.5 设置麦克风采集人声的音量
* 1.5 设置语音音量
*
* @param volume 音量大小,100为原始音量,范围是:[0 ~ 150],默认值为100
* 该接口可以设置语音音量的大小,一般配合音乐音量的设置接口 {@link setAllMusicVolume} 协同使用,用于调谐语音和音乐在混音前各自的音量占比。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
- (void)setVoiceVolume:(NSInteger)volume;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (二)背景音乐特效函数
// 背景音乐的相关接口
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 人声相关特效函数
/// @name 背景音乐的相关接口
/// @{
/**
* 2.1 开始播放背景音乐
*
* 每个音乐都需要您指定具体的 ID,您可以通过该 ID 对音乐的开始、停止、音量等进行设置。
*
* @note 若您想同时播放多个音乐,请分配不同的 ID 进行播放。
* 如果使用同一个 ID 播放不同音乐,SDK 会先停止播放旧的音乐,再播放新的音乐。
* @note
* 1. 如果要多次播放同一首背景音乐,请不要每次播放都分配一个新的 ID,我们推荐使用相同的 ID。
* 2. 若您希望同时播放多首不同的音乐,请为不同的音乐分配不同的 ID 进行播放。
* 3. 如果使用同一个 ID 播放不同音乐,SDK 会先停止播放旧的音乐,再播放新的音乐。
*
* @param musicParam 音乐参数
* @param startBlock 播放开始回调
* @param progressBlock 播放进度回调
* @param completeBlock 播放结束回调
*/
- (void)startPlayMusic:(TXAudioMusicParam *)musicParam
onStart:(TXAudioMusicStartBlock _Nullable)startBlock
onProgress:(TXAudioMusicProgressBlock _Nullable)progressBlock
onComplete:(TXAudioMusicCompleteBlock _Nullable)completeBlock;
- (void)startPlayMusic:(TXAudioMusicParam *)musicParam onStart:(TXAudioMusicStartBlock _Nullable)startBlock onProgress:(TXAudioMusicProgressBlock _Nullable)progressBlock onComplete:(TXAudioMusicCompleteBlock _Nullable)completeBlock;
/**
* 2.2 停止播放背景音乐
... ... @@ -123,33 +235,38 @@ typedef NS_ENUM(NSInteger, TXVoiceReverbType);
- (void)resumePlayMusic:(int32_t)id;
/**
* 2.5 设置背景音乐的远端音量大小,即主播可以通过此接口设置远端观众能听到的背景音乐的音量大小。
* 2.5 设置所有背景音乐的本地音量和远端音量的大小
*
* @param id 音乐 ID
* @param volume 音量大小,100为原始音量,范围是:[0 ~ 150],默认值为100
* 该接口可以设置所有背景音乐的本地音量和远端音量。
* - 本地音量:即主播本地可以听到的背景音乐的音量大小。
* - 远端音量:即观众端可以听到的背景音乐的音量大小。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
- (void)setMusicPublishVolume:(int32_t)id volume:(NSInteger)volume;
- (void)setAllMusicVolume:(NSInteger)volume;
/**
* 2.6 设置背景音乐的本地音量大小,即主播可以通过此接口设置主播自己本地的背景音乐的音量大小。
* 2.6 设置某一首背景音乐的远端音量的大小
*
* @param id 音乐 ID
* @param volume 音量大小,100为原始音量,范围是:[0 ~ 150],默认值为100
* 该接口可以细粒度地控制每一首背景音乐的远端音量,也就是观众端可听到的背景音乐的音量大小。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param id 音乐 ID
* @param volume 音量大小,取值范围为0 - 100;默认值:100
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
- (void)setMusicPlayoutVolume:(int32_t)id volume:(NSInteger)volume;
- (void)setMusicPublishVolume:(int32_t)id volume:(NSInteger)volume;
/**
* 2.7 设置全局背景音乐的本地和远端音量的大小
* 2.7 设置某一首背景音乐的本地音量的大小
*
* @param volume 音量大小,100为原始音量,范围是:[0 ~ 150],默认值为100
* 该接口可以细粒度地控制每一首背景音乐的本地音量,也就是主播本地可以听到的背景音乐的音量大小。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param id 音乐 ID
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
- (void)setAllMusicVolume:(NSInteger)volume;
- (void)setMusicPlayoutVolume:(int32_t)id volume:(NSInteger)volume;
/**
* 2.8 调整背景音乐的音调高低
... ... @@ -168,7 +285,7 @@ typedef NS_ENUM(NSInteger, TXVoiceReverbType);
- (void)setMusicSpeedRate:(int32_t)id speedRate:(double)speedRate;
/**
* 2.10 获取背景音乐当前的播放进度(单位:毫秒)
* 2.10 获取背景音乐的播放进度(单位:毫秒)
*
* @param id 音乐 ID
* @return 成功返回当前播放时间,单位:毫秒,失败返回-1
... ... @@ -176,82 +293,25 @@ typedef NS_ENUM(NSInteger, TXVoiceReverbType);
- (NSInteger)getMusicCurrentPosInMS:(int32_t)id;
/**
* 2.11 设置背景音乐的播放进度(单位:毫秒)
*
* @note 请尽量避免频繁地调用该接口,因为该接口可能会再次读写音乐文件,耗时稍高。
* 当配合进度条使用时,请在进度条拖动完毕的回调中调用,而避免在拖动过程中实时调用。
* 2.11 获取景音乐的总时长(单位:毫秒)
*
* @param id 音乐 ID
* @param pts 单位: 毫秒
* @param path 音乐文件路径,如果 path 为空,那么返回当前正在播放的 music 时长。
* @return 成功返回时长,失败返回-1
*/
- (void)seekMusicToPosInMS:(int32_t)id pts:(NSInteger)pts;
- (NSInteger)getMusicDurationInMS:(NSString *)path;
/**
* 2.12 获取景音乐文件的总时长(单位:毫秒)
* 2.12 设置背景音乐的播放进度(单位:毫秒)
*
* @param path 音乐文件路径,如果 path 为空,那么返回当前正在播放的 music 时长。
* @return 成功返回时长,失败返回-1
* @note 请尽量避免过度频繁地调用该接口,因为该接口可能会再次读写音乐文件,耗时稍高。
* 因此,当用户拖拽音乐的播放进度条时,请在用户完成拖拽操作后再调用本接口。
* 因为 UI 上的进度条控件往往会以很高的频率反馈用户的拖拽进度,如不做频率限制,会导致较差的用户体验。
*
* @param id 音乐 ID
* @param pts 单位: 毫秒
*/
- (NSInteger)getMusicDurationInMS:(NSString *)path;
- (void)seekMusicToPosInMS:(int32_t)id pts:(NSInteger)pts;
/// @}
@end
@interface TXAudioMusicParam : NSObject
/// 【字段含义】音乐 ID
/// 【特殊说明】SDK 允许播放多路音乐,因此需要音乐 ID 进行标记,用于控制音乐的开始、停止、音量等
@property (nonatomic) int32_t ID;
/// 【字段含义】音乐文件的绝对路径
@property (nonatomic, copy) NSString *path;
/// 【字段含义】音乐循环播放的次数
/// 【推荐取值】取值范围为0 - 任意正整数,默认值:0。0表示播放音乐一次;1表示播放音乐两次;以此类推
@property (nonatomic) NSInteger loopCount;
/// 【字段含义】是否将音乐传到远端
/// 【推荐取值】YES:音乐在本地播放的同时,会上行至云端,因此远端用户也能听到该音乐;NO:音乐不会上行至云端,因此只能在本地听到该音乐。默认值:NO
@property (nonatomic) BOOL publish;
/// 【字段含义】播放的是否为短音乐文件
/// 【推荐取值】YES:需要重复播放的短音乐文件;NO:正常的音乐文件。默认值:NO
@property (nonatomic) BOOL isShortFile;
/// 【字段含义】音乐开始播放时间点,单位毫秒
@property (nonatomic) NSInteger startTimeMS;
/// 【字段含义】音乐结束播放时间点,单位毫秒,0或者-1表示播放至文件结尾。
@property (nonatomic) NSInteger endTimeMS;
@end
typedef NS_ENUM(NSInteger, TXVoiceReverbType) {
TXVoiceReverbType_0 = 0, ///< 关闭混响
TXVoiceReverbType_1 = 1, ///< KTV
TXVoiceReverbType_2 = 2, ///< 小房间
TXVoiceReverbType_3 = 3, ///< 大会堂
TXVoiceReverbType_4 = 4, ///< 低沉
TXVoiceReverbType_5 = 5, ///< 洪亮
TXVoiceReverbType_6 = 6, ///< 金属声
TXVoiceReverbType_7 = 7, ///< 磁性
};
typedef NS_ENUM(NSInteger, TXVoiceChangeType) {
TXVoiceChangeType_0 = 0, ///< 关闭变声
TXVoiceChangeType_1 = 1, ///< 熊孩子
TXVoiceChangeType_2 = 2, ///< 萝莉
TXVoiceChangeType_3 = 3, ///< 大叔
TXVoiceChangeType_4 = 4, ///< 重金属
TXVoiceChangeType_5 = 5, ///< 感冒
TXVoiceChangeType_6 = 6, ///< 外国人
TXVoiceChangeType_7 = 7, ///< 困兽
TXVoiceChangeType_8 = 8, ///< 死肥仔
TXVoiceChangeType_9 = 9, ///< 强电流
TXVoiceChangeType_10 = 10, ///< 重机械
TXVoiceChangeType_11 = 11, ///< 空灵
};
NS_ASSUME_NONNULL_END
@end // End of interface TXAudioEffectManager
/// @}
... ...
/*
/**
* Module: 美颜与图像处理参数设置类
*
* Function: 修改美颜、滤镜、绿幕等参数
*
*/
#import <Foundation/Foundation.h>
#import <TargetConditionals.h>
#if TARGET_OS_IPHONE
... ... @@ -18,236 +15,287 @@ typedef NSImage TXImage;
NS_ASSUME_NONNULL_BEGIN
/// @defgroup TXBeautyManager_ios TXBeautyManager
/// 美颜及动效参数管理
/// 美颜与图像处理参数设置类
/// @{
/**
* 美颜(磨皮)算法
* SDK 内置了多种不同的磨皮算法,您可以选择最适合您产品定位的方案。
* TRTC 内置多种不同的磨皮算法,您可以选择最适合您产品定位的方案。
*/
typedef NS_ENUM(NSInteger, TXBeautyStyle) {
TXBeautyStyleSmooth = 0, ///< 光滑,适用于美女秀场,效果比较明显。
TXBeautyStyleNature = 1, ///< 自然,磨皮算法更多地保留了面部细节,主观感受上会更加自然。
TXBeautyStylePitu = 2 ///< 由上海优图实验室提供的美颜算法,磨皮效果介于光滑和自然之间,比光滑保留更多皮肤细节,比自然磨皮程度更高。
///光滑,算法比较激进,磨皮效果比较明显,适用于秀场直播。
TXBeautyStyleSmooth = 0,
///自然,算法更多地保留了面部细节,磨皮效果更加自然,适用于绝大多数直播场景。
TXBeautyStyleNature = 1,
///优图,由优图实验室提供,磨皮效果介于光滑和自然之间,比光滑保留更多皮肤细节,比自然磨皮程度更高。
TXBeautyStylePitu = 2
};
/// 美颜及动效参数管理
@interface TXBeautyManager : NSObject
/**
* 设置美颜(磨皮)算法
*
* SDK 内部集成了两套风格不同的磨皮算法,一套我们取名叫“光滑”,适用于美女秀场,效果比较明显。
* 另一套我们取名“自然”,磨皮算法更多地保留了面部细节,主观感受上会更加自然。
* TRTC 内置多种不同的磨皮算法,您可以选择最适合您产品定位的方案:
*
* @param beautyStyle 美颜风格,光滑或者自然,光滑风格磨皮更加明显,适合娱乐场景
* @param beautyStyle 美颜风格,TXBeautyStyleSmooth:光滑;TXBeautyStyleNature:自然;TXBeautyStylePitu:优图
*/
- (void)setBeautyStyle:(TXBeautyStyle)beautyStyle;
/**
* 设置美颜级别
* @param level 美颜级别,取值范围0 - 9; 0表示关闭,1 - 9值越大,效果越明显。
*
* @param beautyLevel 美颜级别,取值范围0 - 9; 0表示关闭,9表示效果最明显。
*/
- (void)setBeautyLevel:(float)level;
- (void)setBeautyLevel:(float)beautyLevel;
/**
* 设置美白级别
*
* @param level 美白级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param whitenessLevel 美白级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setWhitenessLevel:(float)level;
- (void)setWhitenessLevel:(float)whitenessLevel;
/**
* 开启清晰度增强
*
* @param enable YES:开启清晰度增强;NO:关闭清晰度增强。默认值:YES
*/
- (void)enableSharpnessEnhancement:(BOOL)enable;
/**
* 设置红润级别
*
* @param level 红润级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param ruddyLevel 红润级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setRuddyLevel:(float)level;
- (void)setRuddyLevel:(float)ruddyLevel;
/**
* 设置指定素材滤镜特效
* 设置色彩滤镜效果
*
* @param image 指定素材,即颜色查找表图片。**必须使用 png 格式**
* 色彩滤镜,是一副包含色彩映射关系的颜色查找表图片,您可以在我们提供的官方 Demo 中找到预先准备好的几张滤镜图片。
* SDK 会根据该查找表中的映射关系,对摄像头采集出的原始视频画面进行二次处理,以达到预期的滤镜效果。
* @param image 包含色彩映射关系的颜色查找表图片,必须是 png 格式。
*/
- (void)setFilter:(nullable TXImage *)image;
/**
* 设置滤镜浓
* 设置色彩滤镜的强
*
* 在美女秀场等应用场景里,滤镜浓度的要求会比较高,以便更加突显主播的差异。
* 我们默认的滤镜浓度是0.5,如果您觉得滤镜效果不明显,可以使用下面的接口进行调节。
* 该数值越高,色彩滤镜的作用强度越明显,经过滤镜处理后的视频画面跟原画面的颜色差异越大。
* 我默认的滤镜浓度是0.5,如果您觉得默认的滤镜效果不明显,可以设置为 0.5 以上的数字,最大值为1。
*
* @param strength 从0到1,越大滤镜效果越明显,默认值为0.5。
* @param strength 从0到1,数值越大滤镜效果越明显,默认值为0.5。
*/
- (void)setFilterStrength:(float)strength;
/**
* 设置绿幕背景视频,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* 此处的绿幕功能并非智能抠背,需要被拍摄者的背后有一块绿色的幕布来辅助产生特效
* 此接口所开启的绿幕功能不具备智能去除背景的能力,需要被拍摄者的背后有一块绿色的幕布来辅助产生特效。
*
* @param file 视频文件路径。支持 MP4; nil 表示关闭特效。
* @param path MP4格式的视频文件路径; 设置空值表示关闭特效。
*/
- (void)setGreenScreenFile:(nullable NSString *)file;
- (void)setGreenScreenFile:(nullable NSString *)path;
#if TARGET_OS_IPHONE
/**
* 设置大眼级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 大眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param eyeScaleLevel 大眼级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setEyeScaleLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setEyeScaleLevel:(float)eyeScaleLevel;
#endif
/**
* 设置瘦脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 瘦脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param faceSlimLevel 瘦脸级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setFaceSlimLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setFaceSlimLevel:(float)faceSlimLevel;
#endif
/**
*设置 V 脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置 V 脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level V脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param faceVLevel V脸级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setFaceVLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setFaceVLevel:(float)faceVLevel;
#endif
/**
* 设置下巴拉伸或收缩,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 下巴拉伸或收缩级别,取值范围-9 - 9;0 表示关闭,小于0表示收缩,大于0表示拉伸。
* @param chinLevel 下巴拉伸或收缩级别,取值范围-9 - 9;0 表示关闭,小于0表示收缩,大于0表示拉伸。
*/
- (void)setChinLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setChinLevel:(float)chinLevel;
#endif
/**
* 设置短脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 短脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param faceShortLevel 短脸级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setFaceShortLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setFaceShortLevel:(float)faceShortLevel;
#endif
/**
* 设置窄脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 短脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param level 窄脸级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setFaceNarrowLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setFaceNarrowLevel:(float)faceNarrowLevel;
#endif
/**
* 设置瘦鼻级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 瘦鼻级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param noseSlimLevel 瘦鼻级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setNoseSlimLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setNoseSlimLevel:(float)noseSlimLevel;
#endif
/**
* 设置亮眼 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置亮眼级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 亮眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param eyeLightenLevel 亮眼级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setEyeLightenLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setEyeLightenLevel:(float)eyeLightenLevel;
#endif
/**
* 设置白牙 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置牙齿美白级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 白牙级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param toothWhitenLevel 白牙级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setToothWhitenLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setToothWhitenLevel:(float)toothWhitenLevel;
#endif
/**
* 设置祛皱 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置祛皱级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 祛皱级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param wrinkleRemoveLevel 祛皱级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setWrinkleRemoveLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setWrinkleRemoveLevel:(float)wrinkleRemoveLevel;
#endif
/**
* 设置祛眼袋 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置祛眼袋级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 祛眼袋级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param pounchRemoveLevel 祛眼袋级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setPounchRemoveLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setPounchRemoveLevel:(float)pounchRemoveLevel;
#endif
/**
* 设置法令纹 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置法令纹去除级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 法令纹级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
* @param smileLinesRemoveLevel 法令纹级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
*/
- (void)setSmileLinesRemoveLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setSmileLinesRemoveLevel:(float)smileLinesRemoveLevel;
#endif
/**
* 设置发际线 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置发际线调整级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 发际线级别,取值范围-9 - 9;0表示关闭,小于0表示抬高,大于0表示降低
* @param foreheadLevel 发际线级别,取值范围-9 - 9;0表示关闭,9表示效果最明显
*/
- (void)setForeheadLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setForeheadLevel:(float)foreheadLevel;
#endif
/**
* 设置眼距 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置眼距,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 眼距级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
* @param eyeDistanceLevel 眼距级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
*/
- (void)setEyeDistanceLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setEyeDistanceLevel:(float)eyeDistanceLevel;
#endif
/**
* 设置眼角 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置眼角调整级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 眼角级别,取值范围-9 - 9;0表示关闭,小于0表示降低,大于0表示抬高
* @param eyeAngleLevel 眼角调整级别,取值范围-9 - 9;0表示关闭,9表示效果最明显
*/
- (void)setEyeAngleLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setEyeAngleLevel:(float)eyeAngleLevel;
#endif
/**
* 设置嘴型 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置嘴型调整级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 嘴型级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
* @param mouthShapeLevel 嘴型级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
*/
- (void)setMouthShapeLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setMouthShapeLevel:(float)mouthShapeLevel;
#endif
/**
* 设置鼻翼 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 设置鼻翼调整级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param level 鼻翼级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
* @param noseWingLevel 鼻翼调整级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
*/
- (void)setNoseWingLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setNoseWingLevel:(float)noseWingLevel;
#endif
/**
* 设置鼻子位置 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* @param level 鼻子位置级别,取值范围-9 - 9;0表示关闭,小于0表示抬高,大于0表示降低。
* 设置鼻子位置,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param nosePositionLevel 鼻子位置级别,取值范围-9 - 9;0表示关闭,小于0表示抬高,大于0表示降低。
*/
- (void)setNosePositionLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setNosePositionLevel:(float)nosePositionLevel;
#endif
/**
* 设置嘴唇厚度 ,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* @param level 嘴唇厚度级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
* 设置嘴唇厚度,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param lipsThicknessLevel 嘴唇厚度级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
*/
- (void)setLipsThicknessLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setLipsThicknessLevel:(float)lipsThicknessLevel;
#endif
/**
* 设置脸型,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* @param level 美型级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
*
* @param faceBeautyLevel 美型级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
*/
- (void)setFaceBeautyLevel:(float)level;
#if TARGET_OS_IPHONE
- (void)setFaceBeautyLevel:(float)faceBeautyLevel;
#endif
/**
* 选择 AI 动效挂件,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* @param tmplName 动效名称
* @param tmplDir 动效所在目录
* @param tmplName 动效挂件名称
* @param tmplDir 动效素材文件所在目录
*/
#if TARGET_OS_IPHONE
- (void)setMotionTmpl:(nullable NSString *)tmplName inDir:(nullable NSString *)tmplDir;
#endif
/**
* 设置动效静音,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
*
* 是否在动效素材播放时静音,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
* 有些挂件本身会有声音特效,通过此 API 可以关闭这些特效播放时所带的声音效果。
*
* @param motionMute YES:静音;NO:不静音。
*/
#if TARGET_OS_IPHONE
- (void)setMotionMute:(BOOL)motionMute;
#endif
... ...
/*
* Module: TXDeviceManager 设备管理类
*
* Function: 用于管理 iOS / Mac 的硬件设备
*
*/
/**
* Module: TRTC 音视频设备管理模块
* Function: 用于管理摄像头、麦克风和扬声器等音视频相关的硬件设备
*/
/// @defgroup TXDeviceManager_ios TXDeviceManager
/// TRTC 音视频设备管理模块
/// @{
#import <Foundation/Foundation.h>
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#elif TARGET_OS_MAC
#import <AppKit/AppKit.h>
#endif
NS_ASSUME_NONNULL_BEGIN
/////////////////////////////////////////////////////////////////////////////////
//
// 音视频设备相关的类型定义
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 音视频设备相关的类型定义
/// @{
/**
* 系统音量类型(仅适用于移动设备)
*
* 现代智能手机中一般都具备两套系统音量类型,即“通话音量”和“媒体音量”。
* - 通话音量:手机专门为接打电话所设计的音量类型,自带回声抵消(AEC)功能,并且支持通过蓝牙耳机上的麦克风进行拾音,缺点是音质比较一般。
* 当您通过手机侧面的音量按键下调手机音量时,如果无法将其调至零(也就是无法彻底静音),说明您的手机当前出于通话音量。
* - 媒体音量:手机专门为音乐场景所设计的音量类型,无法使用系统的 AEC 功能,并且不支持通过蓝牙耳机的麦克风进行拾音,但具备更好的音乐播放效果。
* 当您通过手机侧面的音量按键下调手机音量时,如果能够将手机音量调至彻底静音,说明您的手机当前出于媒体音量。
*
* SDK 目前提供了三种系统音量类型的控制模式:自动切换模式、全程通话音量模式、全程媒体音量模式。
*/
#if TARGET_OS_IPHONE
typedef NS_ENUM(NSInteger, TXSystemVolumeType) {
/// 系统音量类型
typedef NS_ENUM(NSInteger, TXSystemVolumeType);
/// 声音播放模式(音频路由)
typedef NS_ENUM(NSInteger, TXAudioRoute);
///自动切换模式:
///也被称为“麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。
TXSystemVolumeTypeAuto = 0,
#elif TARGET_OS_MAC
///全程媒体音量:
///通话全程使用媒体音量,并不是非常常用的音量类型,适用于对音质要求比较苛刻的音乐场景中。
///如果您的用户大都使用外接设备(比如外接声卡)为主,可以使用该模式,否则请慎用。
TXSystemVolumeTypeMedia = 1,
/// 设备类型
typedef NS_ENUM(NSInteger, TXMediaDeviceType);
/// 设备描述
@class TXMediaDeviceInfo;
///全程通话音量:
///该方案的优势在于用户在上下麦时音频模块无需切换工作模式,可以做到无缝上下麦,适合于用户需要频繁上下麦的应用场景。
TXSystemVolumeTypeVOIP = 2,
};
#endif
/**
* 音频路由(即声音的播放模式)
*
* 音频路由,即声音是从手机的扬声器还是从听筒中播放出来,因此该接口仅适用于手机等移动端设备。
* 手机有两个扬声器:一个是位于手机顶部的听筒,一个是位于手机底部的立体声扬声器。
* - 设置音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
* - 设置音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
*/
#if TARGET_OS_IPHONE
typedef NS_ENUM(NSInteger, TXAudioRoute) {
@interface TXDeviceManager : NSObject
/// Speakerphone:使用扬声器播放(即“免提”),扬声器位于手机底部,声音偏大,适合外放音乐。
TXAudioRouteSpeakerphone = 0,
- (instancetype)init NS_UNAVAILABLE;
/// Earpiece:使用听筒播放,听筒位于手机顶部,声音偏小,适合需要保护隐私的通话场景。
TXAudioRouteEarpiece = 1,
#if TARGET_OS_IPHONE
};
#endif
/**
* 判断当前是否为前置摄像头
* 设备类型(仅适用于桌面平台)
*
* 该枚举值用于定义三种类型的音视频设备,即摄像头、麦克风和扬声器,以便让一套设备管理接口可以操控三种不同类型的设备。
*/
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
typedef NS_ENUM(NSInteger, TXMediaDeviceType) {
TXMediaDeviceTypeUnknown = -1, ///< undefined device type
TXMediaDeviceTypeAudioInput = 0, ///< microphone
TXMediaDeviceTypeAudioOutput = 1, ///< speaker or earpiece
TXMediaDeviceTypeVideoCamera = 2, ///< camera
};
#endif
/**
* 音视频设备的相关信息(仅适用于桌面平台)
*
* 该结构体用于描述一个音视频设备的关键信息,比如设备ID、设备名称等等,以便用户能够在用户界面上选择自己期望使用的音视频设备。
*/
#if TARGET_OS_MAC && !TARGET_OS_IPHONE
@interface TXMediaDeviceInfo : NSObject
/// device type
@property(assign, nonatomic) TXMediaDeviceType type;
/// device id
@property(copy, nonatomic, nullable) NSString *deviceId;
/// device name
@property(copy, nonatomic, nullable) NSString *deviceName;
@end
#endif
/// @}
@interface TXDeviceManager : NSObject
/////////////////////////////////////////////////////////////////////////////////
//
// 移动端设备操作接口(iOS Android)
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 移动端设备操作接口
/// @{
/**
* 1.1 判断当前是否为前置摄像头(仅适用于移动端)
*/
#if TARGET_OS_IPHONE
- (BOOL)isFrontCamera;
/**
* 切换摄像头
* 1.2 切换前置或后置摄像头(仅适用于移动端)
*/
- (NSInteger)switchCamera:(BOOL)frontCamera;
/**
* 查询当前摄像头是否支持缩放
* 1.3 查询当前摄像头是否支持缩放(仅适用于移动端)
*/
- (BOOL)isCameraZoomSupported;
/**
* 查询当前摄像头支持的最大缩放比例
* 1.3 获取摄像头的最大缩放倍数(仅适用于移动端)
*/
- (CGFloat)getCameraZoomMaxRatio;
/**
* 设置当前摄像头的缩放比例
* 1.4 设置摄像头的缩放倍数(仅适用于移动端)
*
* @param zoomRatio 取值范围1 - 5,取值为1表示最远视角(正常镜头),取值为5表示最近视角(放大镜头)。
* 最大值推荐为5,若超过5,视频数据会变得模糊不清。默认值为1。
*/
- (NSInteger)setCameraZoomRatio:(CGFloat)zoomRatio;
/**
* 查询是否支持自动识别人脸位置
* 1.5 查询是否支持自动识别人脸位置(仅适用于移动端)
*/
- (BOOL)isAutoFocusEnabled;
/**
* 设置人脸自动识别
* 1.6 开启自动对焦功能(仅适用于移动端)
*
* @param enabled YES: 开启;NO:关闭,默认值:YES
* 开启后,SDK 会自动检测画面中的人脸位置,并将摄像头的焦点始终对焦在人脸位置上。
*/
- (NSInteger)enableCameraAutoFocus:(BOOL)enabled;
/**
* 设置摄像头焦点
* 1.7 设置摄像头的对焦位置(仅适用于移动端)
*
* @param position 对焦位置
* 您可以通过该接口实现如下交互:
* 1. 在本地摄像头的预览画面上,允许用户单击操作。
* 2. 在用户的单击位置显示一个矩形方框,以示摄像头会在此处对焦。
* 3. 随后将用户点击位置的坐标通过本接口传递给 SDK,之后 SDK 会操控摄像头按照用户期望的位置进行对焦。
* @note 使用该接口的前提是先通过 {@link enableCameraAutoFocus} 关闭自动对焦功能。
* @param position 对焦位置,请传入期望对焦点的坐标值
* @return 0:操作成功;负数:操作失败。
*/
- (NSInteger)setCameraFocusPosition:(CGPoint)position;
/**
* 查询是否支持开关闪光灯(手电筒模式
* 1.8 查询是否支持开启闪光灯(仅适用于移动端
*/
- (BOOL)isCameraTorchSupported;
/**
* 开关闪光灯
*
* enabled YES:开启;NO:关闭,默认值:NO
* 1.8 开启/关闭闪光灯,也就是手电筒模式(仅适用于移动端)
*/
- (NSInteger)enableCameraTorch:(BOOL)enabled;
/**
* 设置通话时使用的系统音量类型
*
* @note
* 1. 需要在调用 startLocalAudio() 之前调用该接口。
* 2. 如无特殊需求,不推荐您自行设置,您只需通过 enterRoom 设置好适合您的场景,SDK 内部会自动选择相匹配的音量类型。
* 1.9 设置音频路由(仅适用于移动端)
*
* @param type 系统音量类型,参见 TXSystemVolumeType 说明。如无特殊需求,不推荐您自行设置。
* 手机有两个音频播放设备:一个是位于手机顶部的听筒,一个是位于手机底部的立体声扬声器。
* 设置音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
* 设置音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
*/
- (NSInteger)setSystemVolumeType:(TXSystemVolumeType)type;
- (NSInteger)setAudioRoute:(TXAudioRoute)route;
/**
* 设置音频路由
*
* 微信和手机 QQ 视频通话功能的免提模式就是基于音频路由实现的。
* 一般手机都有两个扬声器,一个是位于顶部的听筒扬声器,声音偏小;一个是位于底部的立体声扬声器,声音偏大。
* 设置音频路由的作用就是决定声音使用哪个扬声器播放。
*
* @param route 音频路由,即声音由哪里输出(扬声器、听筒),默认值:TXAudioRouteSpeakerphone
* 1.10 设置系统音量类型(仅适用于移动端)
*/
- (NSInteger)setAudioRoute:(TXAudioRoute)route;
- (NSInteger)setSystemVolumeType:(TXSystemVolumeType)type;
#endif
#elif TARGET_OS_MAC
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 桌面端设备操作接口(Windows Mac)
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 桌面端设备操作接口
/// @{
/**
* 获取设备列表
*
* @param type 设备类型
* 2.1 获取设备列表(仅适用于桌面端)
*/
- (NSArray<TXMediaDeviceInfo *> * _Nullable)getDevicesList:(TXMediaDeviceType)type;
#if !TARGET_OS_IPHONE && TARGET_OS_MAC
- (NSArray<TXMediaDeviceInfo *> *_Nullable)getDevicesList:(TXMediaDeviceType)type;
/**
* 设置要使用的设备
* 2.2 设置当前要使用的设备(仅适用于桌面端)
*
* @param type 设备类型
* @param deviceId 从 getDevicesList 中得到的设备 ID
* @param type 设备类型,详见 TXMediaDeviceType 定义。
* @param deviceId 设备ID,您可以通过接口 {@link getDevicesList} 获得设备 ID。
* @return 0:操作成功;负数:操作失败。
*/
- (NSInteger)setCurrentDevice:(TXMediaDeviceType)type deviceId:(NSString *)deviceId;
/**
* 获取当前的设备信息
*
* @param type 设备类型
* 2.3 获取当前正在使用的设备(仅适用于桌面端)
*/
- (TXMediaDeviceInfo * _Nullable)getCurrentDevice:(TXMediaDeviceType)type;
- (TXMediaDeviceInfo *_Nullable)getCurrentDevice:(TXMediaDeviceType)type;
/**
* 设置当前设备的音量
* 2.4 设置当前设备的音量(仅适用于桌面端)
*
* @param volume 音量值,范围0 - 100
* @param type 设备类型,仅支持 AudioInput 和 AudioOutput 类型。
* 这里的音量指的是麦克风的采集音量或者扬声器的播放音量,摄像头是不支持设置音量的。
*
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
- (NSInteger)setCurrentDeviceVolume:(NSInteger)volume deviceType:(TXMediaDeviceType)type;
/**
* 获取当前设备的音量
* 2.5 获取当前设备的音量(仅适用于桌面端)
*
* @param type 设备类型,仅支持 AudioInput 和 AudioOutput 类型
* 这里的音量指的是麦克风的采集音量或者扬声器的播放音量,摄像头是不支持获取音量的
*/
- (NSInteger)getCurrentDeviceVolume:(TXMediaDeviceType)type;
/**
* 设置当前设备的静音状态
* 2.6 设置当前设备的静音状态(仅适用于桌面端)
*
* @param mute 设置为 YES 时,麦克风设备静音
* @param type 设备类型,仅支持 AudioInput 和 AudioOutput 类型。
* 这里的音量指的是麦克风和扬声器,摄像头是不支持静音操作的。
*/
- (NSInteger)setCurrentDeviceMute:(BOOL)mute deviceType:(TXMediaDeviceType)type;
/**
* 获取当前设备的静音状态
* 2.7 获取当前设备的静音状态(仅适用于桌面端)
*
* @param type 设备类型,仅支持 AudioInput 和 AudioOutput 类型
* 这里的音量指的是麦克风和扬声器,摄像头是不支持静音操作的
*/
- (BOOL)getCurrentDeviceMute:(TXMediaDeviceType)type;
/**
* 开始摄像头测试
* 2.8 开始摄像头测试(仅适用于桌面端)
*
* @note 在测试过程中可以使用 setCurrentCameraDevice 接口切换摄像头。
* @param view 预览画面所在的父控件
* @note 在测试过程中可以使用 {@link setCurrentDevice} 接口切换摄像头。
*/
- (NSInteger)startCameraDeviceTest:(NSView *)view;
/**
* 结束摄像头测试
* 2.9 结束摄像头测试(仅适用于桌面端)
*/
- (NSInteger)stopCameraDeviceTest;
/**
* 开始麦克风测试
* 2.10 开始麦克风测试(仅适用于桌面端)
*
* 该方法测试麦克风是否能正常工作,volume 的取值范围为0 - 100。
* 该接口可以测试麦克风是否能正常工作,测试到的麦克风采集音量的大小,会以回调的形式通知给您,其中 volume 的取值范围为0 - 100。
* @param interval 麦克风音量的回调间隔。
*/
- (NSInteger)startMicDeviceTest:(NSInteger)interval testEcho:(void (^)(NSInteger volume))testEcho;
/**
* 结束麦克风测试
* 2.11 结束麦克风测试(仅适用于桌面端)
*/
- (NSInteger)stopMicDeviceTest;
/**
* 开始扬声器测试
* 2.12 开始扬声器测试(仅适用于桌面端)
*
* 该方法播放指定的音频文件测试播放设备是否能正常工作。如果能听到声音,说明播放设备能正常工作。
* 该接口通过播放指定的音频文件,用于测试播放设备是否能正常工作。如果用户在测试时能听到声音,说明播放设备能正常工作。
* @param filePath 声音文件的路径
*/
- (NSInteger)startSpeakerDeviceTest:(NSString *)audioFilePath onVolumeChanged:(void (^)(NSInteger volume, BOOL isLastFrame))volumeBlock;
/**
* 结束扬声器测试
* 2.13 结束扬声器测试(仅适用于桌面端)
*/
- (NSInteger)stopSpeakerDeviceTest;
#endif
/// @}
@end
#if TARGET_OS_IPHONE
/**
* 系统音量类型
*
* 智能手机一般具备两种系统音量类型,即通话音量类型和媒体音量类型。
* - 通话音量:手机专门为通话场景设计的音量类型,使用手机自带的回声抵消功能,音质相比媒体音量类型较差,
* 无法通过音量按键将音量调成零,但是支持蓝牙耳机上的麦克风。
*
* - 媒体音量:手机专门为音乐场景设计的音量类型,音质相比于通话音量类型要好,通过通过音量按键可以将音量调成零。
* 使用媒体音量类型时,如果要开启回声抵消(AEC)功能,SDK 会开启内置的声学处理算法对声音进行二次处理。
* 在媒体音量模式下,蓝牙耳机无法使用自带的麦克风采集声音,只能使用手机上的麦克风进行声音采集。
*
* SDK 目前提供了三种系统音量类型的控制模式,分别为:
* - Auto:“麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。
* 如果您在 enterRoom 时选择的场景为 TRTCAppSceneLIVE 或 TRTCAppSceneVoiceChatRoom,SDK 会自动选择该模式。
*
* - VOIP:全程使用通话音量,适合多人会议场景。
* 如果您在 enterRoom 时选择的场景为 TRTCAppSceneVideoCall 或 TRTCAppSceneAudioCall,SDK 会自动选择该模式。
*
* - Media:通话全程使用媒体音量,不常用,适合个别有特殊需求(如主播外接声卡)的应用场景。
*
*/
typedef NS_ENUM(NSInteger, TXSystemVolumeType) {
TXSystemVolumeTypeAuto = 0,
TXSystemVolumeTypeMedia = 1,
TXSystemVolumeTypeVOIP = 2,
};
/**
* 声音播放模式(音频路由)
*
* 微信和手机 QQ 里的视频通话功能,都有一个免提模式,开启后就不用把手机贴在耳朵上,这个功能就是基于音频路由实现的。
* 一般手机都有两个扬声器,设置音频路由的作用就是要决定声音从哪个扬声器播放出来:
* - Speakerphone:扬声器,位于手机底部,声音偏大,适合外放音乐。
* - Earpiece:听筒,位于手机顶部,声音偏小,适合通话。
*/
typedef NS_ENUM(NSInteger, TXAudioRoute) {
TXAudioRouteSpeakerphone = 0, ///< 扬声器
TXAudioRouteEarpiece = 1, ///< 听筒
};
#elif TARGET_OS_MAC
/**
* 设备类型(仅 Mac)
*
* 在 Mac 上,每一种类型的设备都可能有多个,TRTC SDK 的 Mac 版本提供了一系列函数用来操作这些设备。
*/
typedef NS_ENUM(NSInteger, TXMediaDeviceType) {
TXMediaDeviceTypeUnknown = -1, ///< 未定义
TXMediaDeviceTypeAudioInput = 0, ///< 麦克风
TXMediaDeviceTypeAudioOutput = 1, ///< 扬声器或听筒
TXMediaDeviceTypeVideoCamera = 2, ///< 摄像头
};
/**
* 设备描述
*
* 在 Mac 上,每一种类型的设备都可能有多个,TRTC SDK 的 Mac 版本提供了一系列函数用来操作这些设备。
*/
@interface TXMediaDeviceInfo : NSObject
/// 设备类型
@property (assign, nonatomic) TXMediaDeviceType type;
/// 设备ID
@property (copy, nonatomic, nullable) NSString *deviceId;
/// 设备名称
@property (copy, nonatomic, nullable) NSString *deviceName;
@end
#endif
NS_ASSUME_NONNULL_END
/// @}
... ...
... ... @@ -188,6 +188,7 @@ typedef enum TXLiteAVError
ERR_ROOM_REQUEST_CLOSE_VIDEO_TIMEOUT = -3313, ///< 请求关闭视频超时
ERR_ROOM_REQUEST_SET_RECEIVE_TIMEOUT = -3314, ///< 请求接收视频项超时
ERR_ROOM_REQUEST_TOKEN_INVALID_PARAMETER = -3315, ///< 请求 token 无效参数,请检查 TRTCParams.userSig 是否填写正确
ERR_ROOM_REQUEST_EXIT_ROOM_WHEN_ENTERING_ROOM = -3341, ///< 进房尚未成功时,收到了退房请求
ERR_ROOM_REQUEST_AES_TOKEN_RETURN_ERROR = -3329, ///< 请求 AES TOKEN 时,server 返回的内容是空的
ERR_ACCIP_LIST_EMPTY = -3331, ///< 请求接口机 IP 返回的列表为空的
... ... @@ -406,6 +407,8 @@ typedef enum TXLiteAVEvent
EVT_MIC_RELEASE_SUCC = 2029, ///< 释放麦克风占用
EVT_AUDIO_DEVICE_ROUTE_CHANGED = 2030, ///< 音频设备的route发生改变,即当前的输入输出设备发生改变,比如耳机被拔出
EVT_PLAY_GET_FLVSESSIONKEY = 2031, ///< TXLivePlayer 接收到http响应头中的 flvSessionKey 信息
EVT_AUDIO_SESSION_INTERRUPT = 2032, ///< Audio Session Interrupt事件
EVT_ROOM_ENTER = 1018, ///< 进入房间成功
EVT_ROOM_EXIT = 1019, ///< 退出房间
... ...
... ... @@ -30,6 +30,12 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) {
*/
- (void)onLog:(NSString*)log LogLevel:(int)level WhichModule:(NSString*)module;
/**
* @brief NTP 校时回调,调用 TXLiveBase updateNetworkTime 后会触发
* @param errCode 0:表示校时成功且偏差在30ms以内,1:表示校时成功但偏差可能在 30ms 以上,-1:表示校时失败
*/
- (void)onUpdateNetworkTime:(int)errCode message:(NSString *)errMsg;
@end
@interface TXLiveBase : NSObject
... ... @@ -50,9 +56,9 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) {
*/
+ (int)setGlobalEnv:(const char *)env_config;
/** 设置log输出级别
/**
* 设置 log 输出级别
* @param level 参见 LOGLEVEL
*
*/
+ (void)setLogLevel:(TX_Enum_Type_LogLevel)level;
... ... @@ -66,25 +72,56 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) {
+ (void)setAudioSessionDelegate:(id<TXLiveAudioSessionDelegate>)delegate;
/// 获取SDK版本信息
/**
* @brief 获取 SDK 版本信息
* @return SDK 版本信息
*/
+ (NSString *)getSDKVersionStr;
///  获取pitu版本信息
/**
* @brief 获取 pitu 版本信息
* @return pitu 版本信息
*/
+ (NSString *)getPituSDKVersion;
/// 设置appID,云控使用
/**
* @brief 设置 appID,云控使用
*/
+ (void)setAppID:(NSString*)appID;
/// 设置sdk的licence下载url和key
/**
* @brief 设置 sdk 的 Licence 下载 url 和 key
*/
+ (void)setLicenceURL:(NSString *)url key:(NSString *)key;
/// 设置userId,用于数据上报
/**
* @brief 设置 userId,用于数据上报
*/
+ (void)setUserId:(NSString *)userId;
/// 获取 Licence 信息
/**
* @brief 获取 Licence 信息
* @return Licence 信息
*/
+ (NSString *)getLicenceInfo;
/// 设置HEVC外部解码器工厂实例
/**
* @brief 设置 HEVC 外部解码器工厂实例
*/
+ (void)setExternalDecoderFactory:(id)decoderFactory;
/**
* 启动 NTP 校时服务
*
* @return 0:启动成功;< 0:启动失败
*/
+ (NSInteger)updateNetworkTime;
/**
* 获取 NTP 时间戳(毫秒),请在收到 onUpdateNetworkTime 回调后使用
*
* @return NTP 时间戳(毫秒),若返回 0:未启动 NTP 校时或校时失败,请重启校时
*/
+ (NSInteger)getNetworkTimestamp;
@end
... ...
... ... @@ -73,6 +73,8 @@ enum EventID
PLAY_EVT_STREAM_SWITCH_SUCC = EVT_PLAY_LIVE_STREAM_SWITCH_SUCC, ///< 直播,切流成功(切流可以播放不同画面大小的视频)
PLAY_EVT_GET_METADATA = EVT_PLAY_GET_METADATA, ///< TXLivePlayer 接收到视频流中的 metadata 头信息(一条视频流仅触发一次)
PLAY_EVT_GET_FLVSESSIONKEY = EVT_PLAY_GET_FLVSESSIONKEY, ///< TXLivePlayer 接收到http响应头中的 flvSessionKey 信息
PLAY_EVT_AUDIO_SESSION_INTERRUPT = EVT_AUDIO_SESSION_INTERRUPT, ///< Audio Session Interrupt事件
PLAY_ERR_NET_DISCONNECT = ERR_PLAY_LIVE_STREAM_NET_DISCONNECT, ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放
... ...
/**
* Module: TRTC 音视频统计指标(只读)
* Function: TRTC SDK 会以两秒钟一次的频率向您汇报当前实时的音视频指标(帧率、码率、卡顿情况等)
*/
/// @defgroup TRTCStatistic_cplusplus TRTCStatisic
/// Tencent Cloud TRTC :audio, video and network related statistical indicators
/// @{
#ifndef __TRTCSTATISTIC_H__
#define __TRTCSTATISTIC_H__
namespace trtc {
/////////////////////////////////////////////////////////////////////////////////
//
// 本地的音视频统计指标
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 本地的音视频统计指标
/// @{
struct TRTCLocalStatistics {
///【字段含义】本地视频的宽度,单位 px
uint32_t width;
///【字段含义】本地视频的高度,单位 px
uint32_t height;
///【字段含义】本地视频的帧率,即每秒钟会有多少视频帧,单位:FPS
uint32_t frameRate;
///【字段含义】远端视频的码率,即每秒钟新产生视频数据的多少,单位 Kbps
uint32_t videoBitrate;
///【字段含义】远端音频的采样率,单位 Hz
uint32_t audioSampleRate;
///【字段含义】本地音频的码率,即每秒钟新产生音频数据的多少,单位 Kbps
uint32_t audioBitrate;
///【字段含义】视频流类型(高清大画面|低清小画面|辅流画面)
TRTCVideoStreamType streamType;
///【字段含义】音频设备采集状态(用于检测音频外设的健康度)
/// 0:采集设备状态正常;1:检测到长时间静音;2:检测到破音;3:检测到声音异常间断。
uint32_t audioCaptureState;
TRTCLocalStatistics() : width(0), height(0), frameRate(0), videoBitrate(0), audioSampleRate(0), audioBitrate(0), streamType(TRTCVideoStreamTypeBig), audioCaptureState(0) {
}
};
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 远端的音视频统计指标
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 远端的音视频统计指标
/// @{
struct TRTCRemoteStatistics {
///【字段含义】用户 ID
const char* userId;
///【字段含义】该路音视频流的总丢包率(%)
/// finalLoss 代表该路音视频流历经“主播 => 云端 => 观众”这样一条完整的传输链路后,最终在观众端统计到的丢包率。
/// finalLoss 越小越好,丢包率为0即表示该路音视频流的所有数据均已经完整地到达了观众端。
///如果出现了 downLoss == 0 但 finalLoss != 0 的情况,说明该路音视频流在“云端=>观众”这一段链路上没有出现丢包,但是在“主播=>云端”这一段链路上出现了不可恢复的丢包。
uint32_t finalLoss;
///【字段含义】远端视频的宽度,单位 px
uint32_t width;
///【字段含义】远端视频的高度,单位 px
uint32_t height;
///【字段含义】远端视频的帧率,单位:FPS
uint32_t frameRate;
///【字段含义】远端视频的码率,单位 Kbps
uint32_t videoBitrate;
///【字段含义】本地音频的采样率,单位 Hz
uint32_t audioSampleRate;
///【字段含义】本地音频的码率,单位 Kbps
uint32_t audioBitrate;
///【字段含义】播放延迟,单位 ms
///为了避免网络抖动和网络包乱序导致的声音和画面卡顿,TRTC 会在播放端管理一个播放缓冲区,用于对接收到的网络数据包进行整理,
///该缓冲区的大小会根据当前的网络质量进行自适应调整,该缓冲区的大小折算成以毫秒为单位的时间长度,也就是 jitterBufferDelay。
uint32_t jitterBufferDelay;
///【字段含义】端到端延迟,单位 ms
/// point2PointDelay 代表 “主播=>云端=>观众” 的延迟,更准确地说,它代表了“采集=>编码=>网络传输=>接收=>缓冲=>解码=>播放” 全链路的延迟。
/// point2PointDelay 需要本地和远端的 SDK 均为 8.5 及以上的版本才生效,若远端用户为 8.5 以前的版本,此数值会一直为0,代表无意义。
uint32_t point2PointDelay;
///【字段含义】音频播放的累计卡顿时长,单位 ms
uint32_t audioTotalBlockTime;
///【字段含义】音频播放卡顿率,单位 (%)
///音频播放卡顿率(audioBlockRate) = 音频播放的累计卡顿时长(audioTotalBlockTime) / 音频播放的总时长
uint32_t audioBlockRate;
///【字段含义】视频播放的累计卡顿时长,单位 ms
uint32_t videoTotalBlockTime;
///【字段含义】视频播放卡顿率,单位 (%)
///视频播放卡顿率(videoBlockRate) = 视频播放的累计卡顿时长(videoTotalBlockTime) / 视频播放的总时长
uint32_t videoBlockRate;
///【字段含义】视频流类型(高清大画面|低清小画面|辅流画面)
TRTCVideoStreamType streamType;
TRTCRemoteStatistics()
: userId(nullptr),
finalLoss(0),
width(0),
height(0),
frameRate(0),
videoBitrate(0),
audioSampleRate(0),
audioBitrate(0),
jitterBufferDelay(0),
point2PointDelay(0),
audioTotalBlockTime(0),
audioBlockRate(0),
videoTotalBlockTime(0),
videoBlockRate(0),
streamType(TRTCVideoStreamTypeBig) {
}
};
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 网络和性能的汇总统计指标
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 网络和性能的汇总统计指标
/// @{
struct TRTCStatistics {
///【字段含义】当前应用的 CPU 使用率,单位 (%)
uint32_t appCpu;
///【字段含义】当前系统的 CPU 使用率,单位 (%)
uint32_t systemCpu;
///【字段含义】从 SDK 到云端的上行丢包率,单位 (%)
///该数值越小越好,如果 upLoss 为 0%,则意味着上行链路的网络质量很好,上传到云端的数据包基本不发生丢失。
///如果 upLoss 为 30%,则意味着 SDK 向云端发送的音视频数据包中,会有 30% 丢失在传输链路中。
uint32_t upLoss;
///【字段含义】从云端到 SDK 的下行丢包率,单位 (%)
///该数值越小越好,如果 downLoss 为 0%,则意味着下行链路的网络质量很好,从云端接收的数据包基本不发生丢失。
///如果 downLoss 为 30%,则意味着云端向 SDK 传输的音视频数据包中,会有 30% 丢失在传输链路中。
uint32_t downLoss;
///【字段含义】从 SDK 到云端的往返延时,单位 ms
///该数值代表从 SDK 发送一个网络包到云端,再从云端回送一个网络包到 SDK 的总计耗时,也就是一个网络包经历 “SDK=>云端=>SDK” 的总耗时。
///该数值越小越好:如果 rtt < 50ms,意味着较低的音视频通话延迟;如果 rtt > 200ms,则意味着较高的音视频通话延迟。
///需要特别解释的是,rtt 代表 “SDK=>云端=>SDK” 的总耗时,所不需要区分 upRtt 和 downRtt。
uint32_t rtt;
///【字段含义】从 SDK 到本地路由器的往返时延,单位 ms
///该数值代表从 SDK 发送一个网络包到本地路由器网关,再从网关回送一个网络包到 SDK 的总计耗时,也就是一个网络包经历 “SDK=>网关=>SDK” 的总耗时。
///该数值越小越好:如果 gatewayRtt < 50ms,意味着较低的音视频通话延迟;如果 gatewayRtt > 200ms,则意味着较高的音视频通话延迟。
///当网络类型为蜂窝网时,该值无效。
uint32_t gatewayRtt;
///【字段含义】总发送字节数(包含信令数据和音视频数据),单位:字节数(Bytes)
uint32_t sentBytes;
///【字段含义】总接收字节数(包含信令数据和音视频数据),单位:字节数(Bytes)
uint32_t receivedBytes;
///【字段含义】本地的音视频统计信息
///由于本地可能有三路音视频流(即高清大画面,低清小画面,以及辅流画面),因此本地的音视频统计信息是一个数组。
TRTCLocalStatistics* localStatisticsArray;
///【字段含义】数组 localStatisticsArray 的大小
uint32_t localStatisticsArraySize;
///【字段含义】远端的音视频统计信息
///因为同时可能有多个远端用户,而且每个远端用户同时可能有多路音视频流(即高清大画面,低清小画面,以及辅流画面),因此远端的音视频统计信息是一个数组。
TRTCRemoteStatistics* remoteStatisticsArray;
///【字段含义】数组 remoteStatisticsArray 的大小
uint32_t remoteStatisticsArraySize;
TRTCStatistics() : upLoss(0), downLoss(0), appCpu(0), systemCpu(0), rtt(0), gatewayRtt(0), receivedBytes(0), sentBytes(0), localStatisticsArray(nullptr), localStatisticsArraySize(0), remoteStatisticsArray(nullptr), remoteStatisticsArraySize(0) {
}
};
/// @}
} // namespace trtc
#ifdef _WIN32
using namespace trtc;
#endif
#endif / *__TRTCSTATISTIC_H__* /
/// @}
... ...
/**
* Module: TRTC 背景音乐、短音效和人声特效的管理类
* Function: 用于对背景音乐、短音效和人声特效进行设置的管理类
*/
/// @defgroup TXAudioEffectManager_cplusplus TXAudioEffectManager
/// Tencent Cloud Audio Effect Management Module
/// @{
#ifndef __ITXAUDIOEFFECTMANAGER_H__
#define __ITXAUDIOEFFECTMANAGER_H__
namespace trtc {
/// @defgroup ITXAudioEffectManager_cplusplus ITXAudioEffectManager
/// 腾讯云视频通话功能音乐和人声设置接口
class ITXMusicPlayObserver;
class AudioMusicParam;
/////////////////////////////////////////////////////////////////////////////////
//
// 音效相关的枚举值定义
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 音效相关的枚举值定义
/// @{
enum TXVoiceReverbType
{
TXLiveVoiceReverbType_0 = 0, ///< 关闭混响
/**
* 1.1 混响特效
*
* 混响特效可以作用于人声之上,通过声学算法对声音进行叠加处理,模拟出各种不同环境下的临场感受,目前支持如下几种混响效果:
* 0:关闭;1:KTV;2:小房间;3:大会堂;4:低沉;5:洪亮;6:金属声;7:磁性。
*/
enum TXVoiceReverbType {
TXLiveVoiceReverbType_0 = 0, ///< disable
TXLiveVoiceReverbType_1 = 1, ///< KTV
TXLiveVoiceReverbType_2 = 2, ///< 小房间
TXLiveVoiceReverbType_3 = 3, ///< 大会堂
TXLiveVoiceReverbType_4 = 4, ///< 低沉
TXLiveVoiceReverbType_5 = 5, ///< 洪亮
TXLiveVoiceReverbType_6 = 6, ///< 金属声
TXLiveVoiceReverbType_7 = 7, ///< 磁性
TXLiveVoiceReverbType_2 = 2, ///< small room
TXLiveVoiceReverbType_3 = 3, ///< great hall
TXLiveVoiceReverbType_4 = 4, ///< deep voice
TXLiveVoiceReverbType_5 = 5, ///< loud voice
TXLiveVoiceReverbType_6 = 6, ///< metallic sound
TXLiveVoiceReverbType_7 = 7, ///< magnetic sound
};
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 背景音乐的播放事件回调
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 背景音乐的事件回调接口
/// @{
// Playback progress block of background music
class ITXMusicPlayObserver {
public:
virtual ~ITXMusicPlayObserver() {}
public:
virtual ~ITXMusicPlayObserver() {
}
/// 背景音乐开始播放
virtual void onStart(int id,int errCode) = 0;
///背景音乐开始播放
virtual void onStart(int id, int errCode) = 0;
/// 背景音乐的播放进度
virtual void onPlayProgress(int id,long curPtsMS,long durationMS) = 0;
///背景音乐的播放进度
virtual void onPlayProgress(int id, long curPtsMS, long durationMS) = 0;
/// 背景音乐已播放完毕
virtual void onComplete(int id,int errCode) = 0;
///背景音乐已经播放完毕
virtual void onComplete(int id, int errCode) = 0;
};
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 背景音乐的播放控制信息
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 背景音乐的播放控制信息
/// @{
/**
* 背景音乐的播放控制信息
*
* 该信息用于在接口 {@link startPlayMusic} 中指定背景音乐的相关信息,包括播放 ID、文件路径和循环次数等:
* 1. 如果要多次播放同一首背景音乐,请不要每次播放都分配一个新的 ID,我们推荐使用相同的 ID。
* 2. 若您希望同时播放多首不同的音乐,请为不同的音乐分配不同的 ID 进行播放。
* 3. 如果使用同一个 ID 播放不同音乐,SDK 会先停止播放旧的音乐,再播放新的音乐。
*/
class AudioMusicParam {
public:
/// 【字段含义】音乐 ID
/// 【特殊说明】SDK 允许播放多路音乐,因此需要音乐 ID 进行标记,用于控制音乐的开始、停止、音量等
public:
///【字段含义】音乐 ID <br/>
///【特殊说明】SDK 允许播放多路音乐,因此需要使用 ID 进行标记,用于控制音乐的开始、停止、音量等。
int id;
/// 【字段含义】音乐文件的绝对路径
///【字段含义】音效文件的完整路径或 URL 地址。支持的音频格式包括 MP3、AAC、M4A、WAV
char* path;
/// 【字段含义】音乐循环播放的次数
/// 【推荐取值】取值范围为0 - 任意正整数,默认值:0。0表示播放音乐一次;1表示播放音乐两次;以此类推
///【字段含义】音乐循环播放的次数 <br/>
///【推荐取值】取值范围为0 - 任意正整数,默认值:0。0表示播放音乐一次;1表示播放音乐两次;以此类推
int loopCount;
/// 【字段含义】是否将音乐传到远端
/// 【推荐取值】YES:音乐在本地播放的同时,会上行至云端,因此远端用户也能听到该音乐;NO:音乐不会上行至云端,因此只能在本地听到该音乐。默认值:NO
///【字段含义】是否将音乐传到远端 <br/>
///【推荐取值】YES:音乐在本地播放的同时,远端用户也能听到该音乐;NO:主播只能在本地听到该音乐,远端观众听不到。默认值:NO。
bool publish;
/// 【字段含义】播放的是否为短音乐文件
/// 【推荐取值】YES:需要重复播放的短音乐文件;NO:正常的音乐文件。默认值:NO
///【字段含义】播放的是否为短音乐文件 <br/>
///【推荐取值】YES:需要重复播放的短音乐文件;NO:正常的音乐文件。默认值:NO
bool isShortFile;
/// 【字段含义】音乐开始播放时间点,单位毫秒
///【字段含义】音乐开始播放时间点,单位:毫秒。
long startTimeMS;
/// 【字段含义】音乐结束播放时间点,单位毫秒,0表示播放至文件结尾。
///【字段含义】音乐结束播放时间点,单位毫秒,0表示播放至文件结尾。
long endTimeMS;
AudioMusicParam(int id_, char* path_) {
... ... @@ -69,50 +118,57 @@ public:
endTimeMS = 0;
}
};
/// @}
// Definition of audio effect management module
class ITXAudioEffectManager {
protected:
ITXAudioEffectManager() {
}
virtual ~ITXAudioEffectManager() {
}
class ITXAudioEffectManager
{
protected:
ITXAudioEffectManager() {}
virtual ~ITXAudioEffectManager() {}
public:
/////////////////////////////////////////////////////////////////////////////////
//
// (一)人声相关特效函数
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 人声相关特效函数
/// @{
public:
/////////////////////////////////////////////////////////////////////////////////
//
// 人声相关的特效接口
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 人声相关的特效接口
/// @{
/**
* 1.1 设置人声的混响效果(KTV、小房间、大会堂、低沉、洪亮...)
* 1.3 设置人声的混响效果
*
* 通过该接口您可以设置人声的混响效果,具体特效请参考枚举定义{@link TXVoiceReverbType}。
*
* @note 设置的效果在退房后会失效,如果下次进房还需要对应特效,需要调用此接口再次设置。
* @note 设置的效果在退出房间后会自动失效,如果下次进房还需要对应特效,需要调用此接口再次进行设置。
*/
virtual void setVoiceReverbType(TXVoiceReverbType type) = 0;
/**
* 1.2 设置麦克风采集人声的音量
* 1.5 设置语音音量
*
* @param volume 音量大小,100为原始音量,取值范围为0 - 150;默认值:100
* 该接口可以设置语音音量的大小,一般配合音乐音量的设置接口 {@link setAllMusicVolume} 协同使用,用于调谐语音和音乐在混音前各自的音量占比。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
virtual void setVoiceCaptureVolume(int volume) = 0;
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// (二)背景音乐特效函数
//
/////////////////////////////////////////////////////////////////////////////////
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 背景音乐的相关接口
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 背景音乐的相关接口
/// @{
/// @name 背景音乐特效函数
/// @{
/**
* 2.1 设置背景音乐的播放进度回调接口
* 2.0 设置背景音乐的事件回调接口
*
* 请在播放背景音乐之前使用该接口设置播放事件回调,以便感知背景音乐的播放进度。
*
* @param musicId 音乐 ID
* @param observer 具体参考 ITXMusicPlayObserver 中定义接口
... ... @@ -120,68 +176,79 @@ public:
virtual void setMusicObserver(int musicId, ITXMusicPlayObserver* observer) = 0;
/**
* 2.2 开始播放背景音乐
* 2.1 开始播放背景音乐
*
* 每个音乐都需要您指定具体的 ID,您可以通过该 ID 对音乐的开始、停止、音量等进行设置。
*
* @note 若您想同时播放多个音乐,请分配不同的 ID 进行播放。
* 如果使用同一个 ID 播放不同音乐,SDK 会先停止播放旧的音乐,再播放新的音乐。
* @note
* 1. 如果要多次播放同一首背景音乐,请不要每次播放都分配一个新的 ID,我们推荐使用相同的 ID。
* 2. 若您希望同时播放多首不同的音乐,请为不同的音乐分配不同的 ID 进行播放。
* 3. 如果使用同一个 ID 播放不同音乐,SDK 会先停止播放旧的音乐,再播放新的音乐。
*
* @param musicParam 音乐参数
* @param startBlock 播放开始回调
* @param progressBlock 播放进度回调
* @param completeBlock 播放结束回调
*/
virtual void startPlayMusic(AudioMusicParam musicParam) = 0;
/**
* 2.3 停止播放背景音乐
* 2.2 停止播放背景音乐
*
* @param id 音乐 ID
*/
virtual void stopPlayMusic(int id) = 0;
/**
* 2.4 暂停播放背景音乐
* 2.3 暂停播放背景音乐
*
* @param id 音乐 ID
*/
virtual void pausePlayMusic(int id) = 0;
/**
* 2.5 恢复播放背景音乐
* 2.4 恢复播放背景音乐
*
* @param id 音乐 ID
*/
virtual void resumePlayMusic(int id) = 0;
/**
* 2.6 设置背景音乐的远端音量大小,即主播可以通过此接口设置远端观众能听到的背景音乐的音量大小。
* 2.5 设置所有背景音乐的本地音量和远端音量的大小
*
* @param id 音乐 ID
* @param volume 音量大小,100为原始音量,取值范围为0 - 150;默认值:100
* 该接口可以设置所有背景音乐的本地音量和远端音量。
* - 本地音量:即主播本地可以听到的背景音乐的音量大小。
* - 远端音量:即观众端可以听到的背景音乐的音量大小。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
virtual void setMusicPublishVolume(int id, int volume) = 0;
virtual void setAllMusicVolume(int volume) = 0;
/**
* 2.7 设置背景音乐的本地音量大小,即主播可以通过此接口设置主播自己本地的背景音乐的音量大小。
* 2.6 设置某一首背景音乐的远端音量的大小
*
* @param id 音乐 ID
* @param volume 音量大小,100为原始音量,取值范围为0 - 150;默认值:100
* 该接口可以细粒度地控制每一首背景音乐的远端音量,也就是观众端可听到的背景音乐的音量大小。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param id 音乐 ID
* @param volume 音量大小,取值范围为0 - 100;默认值:100
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
virtual void setMusicPlayoutVolume(int id, int volume) = 0;
virtual void setMusicPublishVolume(int id, int volume) = 0;
/**
* 2.8 设置全局背景音乐的本地和远端音量的大小
* 2.7 设置某一首背景音乐的本地音量的大小
*
* @param volume 音量大小,100为原始音量,取值范围为0 - 150;默认值:100
* 该接口可以细粒度地控制每一首背景音乐的本地音量,也就是主播本地可以听到的背景音乐的音量大小。
*
* @note 如果要将 volume 设置为大于100的数值,需要进行特殊配置,请联系技术支持。
* @param id 音乐 ID
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
virtual void setAllMusicVolume(int volume) = 0;
virtual void setMusicPlayoutVolume(int id, int volume) = 0;
/**
* 2.9 调整背景音乐的音调高低
* 2.8 调整背景音乐的音调高低
*
* @param id 音乐 ID
* @param pitch 音调,默认值是0.0f,范围是:[-1 ~ 1] 之间的浮点数;
... ... @@ -189,7 +256,7 @@ public:
virtual void setMusicPitch(int id, float pitch) = 0;
/**
* 2.10 调整背景音乐的变速效果
* 2.9 调整背景音乐的变速效果
*
* @param id 音乐 ID
* @param speedRate 速度,默认值是1.0f,范围是:[0.5 ~ 2] 之间的浮点数;
... ... @@ -197,7 +264,7 @@ public:
virtual void setMusicSpeedRate(int id, float speedRate) = 0;
/**
* 2.11 获取背景音乐当前的播放进度(单位:毫秒)
* 2.10 获取背景音乐的播放进度(单位:毫秒)
*
* @param id 音乐 ID
* @return 成功返回当前播放时间,单位:毫秒,失败返回-1
... ... @@ -205,30 +272,31 @@ public:
virtual long getMusicCurrentPosInMS(int id) = 0;
/**
* 2.11 获取景音乐的总时长(单位:毫秒)
*
* @param path 音乐文件路径,如果 path 为空,那么返回当前正在播放的 music 时长。
* @return 成功返回时长,失败返回-1
*/
virtual long getMusicDurationInMS(char* path) = 0;
/**
* 2.12 设置背景音乐的播放进度(单位:毫秒)
*
* @note 请尽量避免频繁地调用该接口,因为该接口可能会再次读写音乐文件,耗时稍高。
* 当配合进度条使用时,请在进度条拖动完毕的回调中调用,而避免在拖动过程中实时调用。
* @note 请尽量避免过度频繁地调用该接口,因为该接口可能会再次读写音乐文件,耗时稍高。
* 因此,当用户拖拽音乐的播放进度条时,请在用户完成拖拽操作后再调用本接口。
* 因为 UI 上的进度条控件往往会以很高的频率反馈用户的拖拽进度,如不做频率限制,会导致较差的用户体验。
*
* @param id 音乐 ID
* @param pts 单位: 毫秒
*/
virtual void seekMusicToPosInTime(int id, int pts) = 0;
/**
* 2.13 获取景音乐文件的总时长(单位:毫秒)
*
* @param path 音乐文件路径,如果 path 为空,那么返回当前正在播放的 music 时长。
* @return 成功返回时长,失败返回-1
*/
virtual long getMusicDurationInMS(char* path) = 0;
/// @}
};
/// @}
}
} // End of namespace trtc
#ifdef _WIN32
using namespace trtc;
#endif
#endif /* __ITXAUDIOEFFECTMANAGER_H__ */
/// @}
... ...
/**
* Module: TRTC 音视频设备管理模块
* Function: 用于管理摄像头、麦克风和扬声器等音视频相关的硬件设备
*/
/// @defgroup TXDeviceManager_cplusplus TXDeviceManager
/// Tencent Cloud Device Management Module
/// @{
#ifndef __ITXDEVICEMANAGER_H__
#define __ITXDEVICEMANAGER_H__
... ... @@ -10,69 +18,95 @@ namespace trtc {
class ITRTCVideoRenderCallback;
/// @defgroup ITXDeviceManager_cplusplus ITXDeviceManager
/// 腾讯云视频通话功能的设备管理接口类
/////////////////////////////////////////////////////////////////////////////////
//
// 音视频设备相关的类型定义
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 音视频设备相关的类型定义
/// @{
/**
* 系统音量类型(仅适用于移动端设备)
*
* 智能手机一般具备两种系统音量类型,即通话音量类型和媒体音量类型。
* - 通话音量:手机专门为通话场景设计的音量类型,使用手机自带的回声抵消功能,音质相比媒体音量类型较差,
* 无法通过音量按键将音量调成零,但是支持蓝牙耳机上的麦克风。
* 系统音量类型(仅适用于移动设备)
*
* - 媒体音量:手机专门为音乐场景设计的音量类型,音质相比于通话音量类型要好,通过通过音量按键可以将音量调成零。
* 使用媒体音量类型时,如果要开启回声抵消(AEC)功能,SDK 会开启内置的声学处理算法对声音进行二次处理。
* 在媒体音量模式下,蓝牙耳机无法使用自带的麦克风采集声音,只能使用手机上的麦克风进行声音采集。
*
* SDK 目前提供了三种系统音量类型的控制模式,分别为:
* - Auto:“麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。
* 如果您在 enterRoom 时选择的场景为 TRTCAppSceneLIVE 或 TRTCAppSceneVoiceChatRoom,SDK 会自动选择该模式。
*
* - VOIP:全程使用通话音量,适合多人会议场景。
* 如果您在 enterRoom 时选择的场景为 TRTCAppSceneVideoCall 或 TRTCAppSceneAudioCall,SDK 会自动选择该模式。
*
* - Media:通话全程使用媒体音量,不常用,适合个别有特殊需求(如主播外接声卡)的应用场景。
* 现代智能手机中一般都具备两套系统音量类型,即“通话音量”和“媒体音量”。
* - 通话音量:手机专门为接打电话所设计的音量类型,自带回声抵消(AEC)功能,并且支持通过蓝牙耳机上的麦克风进行拾音,缺点是音质比较一般。
* 当您通过手机侧面的音量按键下调手机音量时,如果无法将其调至零(也就是无法彻底静音),说明您的手机当前出于通话音量。
* - 媒体音量:手机专门为音乐场景所设计的音量类型,无法使用系统的 AEC 功能,并且不支持通过蓝牙耳机的麦克风进行拾音,但具备更好的音乐播放效果。
* 当您通过手机侧面的音量按键下调手机音量时,如果能够将手机音量调至彻底静音,说明您的手机当前出于媒体音量。
*
* SDK 目前提供了三种系统音量类型的控制模式:自动切换模式、全程通话音量模式、全程媒体音量模式。
*/
enum TXSystemVolumeType
{
/// “麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。<br>
/// 如果您在 enterRoom 时选择的场景为 TRTCAppSceneLIVE 或 TRTCAppSceneVoiceChatRoom,SDK 会自动选择该模式。
enum TXSystemVolumeType {
///自动切换模式:
///也被称为“麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。
TXSystemVolumeTypeAuto = 0,
/// 通话全程使用媒体音量,不常用,适合个别有特殊需求(如主播外接声卡)的应用场景。
///全程媒体音量:
///通话全程使用媒体音量,并不是非常常用的音量类型,适用于对音质要求比较苛刻的音乐场景中。
///如果您的用户大都使用外接设备(比如外接声卡)为主,可以使用该模式,否则请慎用。
TXSystemVolumeTypeMedia = 1,
/// 全程使用通话音量,适合多人会议场景。<br>
/// 如果您在 enterRoom 时选择的场景为 TRTCAppSceneVideoCall 或 TRTCAppSceneAudioCall 会自动选择该模式。
///全程通话音量:
///该方案的优势在于用户在上下麦时音频模块无需切换工作模式,可以做到无缝上下麦,适合于用户需要频繁上下麦的应用场景。
TXSystemVolumeTypeVOIP = 2,
};
/**
* 声音播放路由(仅适用于移动端设备
* 音频路由(即声音的播放模式
*
* 一般手机都有两个扬声器,设置音频路由的作用就是要决定声音从哪个扬声器播放出来:
* - Speakerphone:扬声器,位于手机底部,声音偏大,适合外放音乐。
* - Earpiece:听筒,位于手机顶部,声音偏小,适合通话。
* 音频路由,即声音是从手机的扬声器还是从听筒中播放出来,因此该接口仅适用于手机等移动端设备。
* 手机有两个扬声器:一个是位于手机顶部的听筒,一个是位于手机底部的立体声扬声器。
* - 设置音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
* - 设置音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
*/
enum TXAudioRoute {
TXAudioRouteSpeakerphone = 0, ///< 扬声器
TXAudioRouteEarpiece = 1, ///< 听筒
/// Speakerphone:使用扬声器播放(即“免提”),扬声器位于手机底部,声音偏大,适合外放音乐。
TXAudioRouteSpeakerphone = 0,
/// Earpiece:使用听筒播放,听筒位于手机顶部,声音偏小,适合需要保护隐私的通话场景。
TXAudioRouteEarpiece = 1,
};
/**
* 设备类型
*/
enum TXMediaDeviceType
{
TXMediaDeviceTypeUnknown = -1, ///< 未知类型
TXMediaDeviceTypeMic = 0, ///< 麦克风
TXMediaDeviceTypeSpeaker = 1, ///< 扬声器或听筒
TXMediaDeviceTypeCamera = 2, ///< 摄像头
* 设备类型(仅适用于桌面平台)
*
* 该枚举值用于定义三种类型的音视频设备,即摄像头、麦克风和扬声器,以便让一套设备管理接口可以操控三种不同类型的设备。
*/
enum TXMediaDeviceType {
TXMediaDeviceTypeUnknown = -1, ///< undefined device type
TXMediaDeviceTypeMic = 0, ///< microphone
TXMediaDeviceTypeSpeaker = 1, ///< speaker or earpiece
TXMediaDeviceTypeCamera = 2, ///< camera
};
/**
* 设备列表
* 音视频设备的相关信息(仅适用于桌面平台)
*
* 该结构体用于描述一个音视频设备的关键信息,比如设备ID、设备名称等等,以便用户能够在用户界面上选择自己期望使用的音视频设备。
*/
class ITXDeviceInfo {
protected:
virtual ~ITXDeviceInfo() {
}
public:
/// device name (UTF-8)
virtual const char* getDeviceName() = 0;
/// device PID (UTF-8)
virtual const char* getDevicePID() = 0;
/// release function, don't use delete!!!
virtual void release() = 0;
};
/**
* 设备信息列表(仅适用于桌面平台)
*
* 此结构体的作用相当于 std::vector<ITXDeviceInfo>,用于解决不同版本的 STL 容器的二进制兼容问题。
*/
class ITXDeviceCollection {
protected:
... ... @@ -80,323 +114,251 @@ class ITXDeviceCollection {
}
public:
/// Size of this list.
virtual uint32_t getCount() = 0;
/// device name (UTF-8)
virtual const char* getDeviceName(uint32_t index) = 0;
/// device PID (UTF-8)
virtual const char* getDevicePID(uint32_t index) = 0;
/// release function, don't use delete!!!
virtual void release() = 0;
};
/// @}
class ITXDeviceManager {
protected:
ITXDeviceManager() {
}
virtual ~ITXDeviceManager() {
}
public:
/////////////////////////////////////////////////////////////////////////////////
//
// 移动端设备操作接口(iOS Android)
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 移动端设备操作接口
/// @{
/**
* 1.1 判断当前是否为前置摄像头(仅适用于移动端)
*/
#if __ANDROID__ || (__APPLE__ && TARGET_OS_IOS)
virtual bool isFrontCamera() = 0;
/**
* @return 设备个数
* 1.2 切换前置或后置摄像头(仅适用于移动端)
*/
virtual uint32_t getCount() = 0;
virtual int switchCamera(bool frontCamera) = 0;
/**
* @return 设备名称,字符编码格式是UTF-8
* 1.3 获取摄像头的最大缩放倍数(仅适用于移动端)
*/
virtual const char* getDeviceName(uint32_t index) = 0;
virtual float getCameraZoomMaxRatio() = 0;
/**
* @return 设备PID,字符编码格式是UTF-8
* 1.4 设置摄像头的缩放倍数(仅适用于移动端)
*
* @param zoomRatio 取值范围1 - 5,取值为1表示最远视角(正常镜头),取值为5表示最近视角(放大镜头)。
*/
virtual const char* getDevicePID(uint32_t index) = 0;
virtual int setCameraZoomRatio(float zoomRatio) = 0;
/**
* @brief 遍历完设备后,调用release释放资源。
* 1.5 查询是否支持自动识别人脸位置(仅适用于移动端)
*/
virtual void release() = 0;
};
virtual bool isAutoFocusEnabled() = 0;
/**
* 设备 Item 信息
/**
* 1.6 开启自动对焦功能(仅适用于移动端)
*
* 开启后,SDK 会自动检测画面中的人脸位置,并将摄像头的焦点始终对焦在人脸位置上。
*/
class ITXDeviceInfo {
protected:
virtual ~ITXDeviceInfo() {
}
virtual int enableCameraAutoFocus(bool enabled) = 0;
public:
/**
* @return 设备名称,字符编码格式是UTF-8
* 1.7 设置摄像头的对焦位置(仅适用于移动端)
*
* 您可以通过该接口实现如下交互:
* 1. 在本地摄像头的预览画面上,允许用户单击操作。
* 2. 在用户的单击位置显示一个矩形方框,以示摄像头会在此处对焦。
* 3. 随后将用户点击位置的坐标通过本接口传递给 SDK,之后 SDK 会操控摄像头按照用户期望的位置进行对焦。
* @note 使用该接口的前提是先通过 {@link enableCameraAutoFocus} 关闭自动对焦功能。
* @param position 对焦位置,请传入期望对焦点的坐标值
* @return 0:操作成功;负数:操作失败。
*/
virtual const char* getDeviceName() = 0;
virtual int setCameraFocusPosition(float x, float y) = 0;
/**
* @return 设备PID,字符编码格式是UTF-8
* 1.8 开启/关闭闪光灯,也就是手电筒模式(仅适用于移动端)
*/
virtual const char* getDevicePID() = 0;
virtual int enableCameraTorch(bool enabled) = 0;
/**
* @brief 获取完设备信息后,调用release释放资源。
* 1.9 设置音频路由(仅适用于移动端)
*
* 手机有两个音频播放设备:一个是位于手机顶部的听筒,一个是位于手机底部的立体声扬声器。
* 设置音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
* 设置音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
*/
virtual void release() = 0;
};
virtual int setAudioRoute(TXAudioRoute route) = 0;
class ITXDeviceManager {
protected:
ITXDeviceManager() {}
virtual ~ITXDeviceManager() {}
/**
* 1.10 设置系统音量类型(仅适用于移动端)
*/
virtual int setSystemVolumeType(TXSystemVolumeType type) = 0;
#endif
public:
/// @}
/////////////////////////////////////////////////////////////////////////////////
//
// 桌面端设备操作接口(Windows Mac)
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 桌面端设备操作接口
/// @{
#if (__APPLE__ && TARGET_OS_MAC && !TARGET_OS_IPHONE) || _WIN32
/**
* 获取设备列表
/**
* 2.1 获取设备列表(仅适用于桌面端)
*
* @param type 设备类型,指定需要获取哪种设备的列表。详见 TXMediaDeviceType 定义。
*
* @note - delete ITXDeviceCollection* 指针会导致编译错误,SDK 维护 ITXDeviceCollection 对象的生命周期
* - 使用完毕后请调用 release 方法释放资源
* - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker、TXMediaDeviceTypeCamera
* @note
* - 使用完毕后请调用 release 方法释放资源,这样可以让 SDK 维护 ITXDeviceCollection 对象的生命周期。
* - 不要使用 delete 释放返回的 Collection 对象,delete ITXDeviceCollection* 指针会导致异常崩溃。
* - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker、TXMediaDeviceTypeCamera。
* - 此接口只支持 Mac 和 Windows 平台
*/
#if (__APPLE__ && TARGET_OS_MAC && !TARGET_OS_IPHONE) || _WIN32
virtual ITXDeviceCollection* getDevicesList(TXMediaDeviceType type) = 0;
/**
* 指定当前设备
* 2.2 设置当前要使用的设备(仅适用于桌面端)
*
* @param type 设备类型,根据设备类型指定当前设备。详见 TXMediaDeviceType 定义。
* @param deviceId 从 getDevicesList 中得到的设备 ID
* @return 0:操作成功 负数:失败
* @note - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker、TXMediaDeviceTypeCamera
* - 此接口只支持 Mac 和 Windows 平台
* @param type 设备类型,详见 TXMediaDeviceType 定义。
* @param deviceId 设备ID,您可以通过接口 {@link getDevicesList} 获得设备 ID。
* @return 0:操作成功;负数:操作失败。
*/
virtual int setCurrentDevice(TXMediaDeviceType type, const char* deviceId) = 0;
/**
* 获取当前使用的设备
*
* @param type 设备类型,根据设备类型获取当前设备信息。详见 TXMediaDeviceType 定义。
* @return ITRTCDeviceInfo 设备信息,能获取设备 ID 和设备名称
* @note 此接口只支持 Mac 和 Windows 平台
* 2.3 获取当前正在使用的设备(仅适用于桌面端)
*/
virtual ITXDeviceInfo* getCurrentDevice(TXMediaDeviceType type) = 0;
/**
* 设置当前设备的音量
* 2.4 设置当前设备的音量(仅适用于桌面端)
*
* @param type 设备类型,根据设备类型获取当前设备音量。详见 TXMediaDeviceType 定义。
* @param volume 音量大小
* @return 0:操作成功 负数:失败
* @note - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker
* - 此接口只支持 Mac 和 Windows 平台
* 这里的音量指的是麦克风的采集音量或者扬声器的播放音量,摄像头是不支持设置音量的。
*
* @param volume 音量大小,取值范围为0 - 100,默认值:100。
* @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
*/
virtual int setCurrentDeviceVolume(TXMediaDeviceType type, uint32_t volume) = 0;
/**
* 获取当前设备的音量
* 2.5 获取当前设备的音量(仅适用于桌面端)
*
* @param type 设备类型,根据设备类型获取当前设备音量。详见 TXMediaDeviceType 定义。
*
* @note - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker
* - 此接口只支持 Mac 和 Windows 平台
* 这里的音量指的是麦克风的采集音量或者扬声器的播放音量,摄像头是不支持获取音量的。
*/
virtual uint32_t getCurrentDeviceVolume(TXMediaDeviceType type) = 0;
/**
* 设置当前设备是否静音
* 2.6 设置当前设备的静音状态(仅适用于桌面端)
*
* @param type 设备类型,根据设备类型设置当前设备状态。详见 TXMediaDeviceType 定义。
* @param mute 是否静音/禁画
* @return 0:操作成功 负数:失败
* @note - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker
* - 此接口只支持 Mac 和 Windows 平台
* 这里的音量指的是麦克风和扬声器,摄像头是不支持静音操作的。
*/
virtual int setCurrentDeviceMute(TXMediaDeviceType type, bool mute) = 0;
/**
* 查询当前设备是否静音
* 2.7 获取当前设备的静音状态(仅适用于桌面端)
*
* @param type 设备类型,根据设备类型获取当前设备状态。详见 TXMediaDeviceType 定义。
* @return true : 当前设备已静音;false : 当前设备未静音
* @note type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker
* 这里的音量指的是麦克风和扬声器,摄像头是不支持静音操作的。
*/
virtual bool getCurrentDeviceMute(TXMediaDeviceType type) = 0;
/**
* 开始摄像头测试
* 2.8 开始摄像头测试(仅适用于桌面端)
*
* @param view 预览控件所在的父控件
* @return 0:操作成功 负数:失败
* @note - 在测试过程中可以使用 setCurrentCameraDevice 接口切换摄像头。
* - 此接口只支持 Mac 和 Windows 平台
* @note 在测试过程中可以使用 {@link setCurrentDevice} 接口切换摄像头。
*/
virtual int startCameraDeviceTest(void* view) = 0;
#ifdef _WIN32
/**
* 开始进行摄像头测试
* 会触发 onFirstVideoFrame 回调接口
*
* @param callback 摄像头预览自定义渲染画面回调
* @return 0:操作成功 负数:失败
* @note - 在测试过程中可以使用 setCurrentCameraDevice 接口切换摄像头。
* - 此接口只支持 Windows 平台
*/
virtual int startCameraDeviceTest(ITRTCVideoRenderCallback* callback) = 0;
#endif
/**
* 结束摄像头测试
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Mac 和 Windows 平台
* 2.9 结束摄像头测试(仅适用于桌面端)
*/
virtual int stopCameraDeviceTest() = 0;
/**
* 开始麦克风测试
* 2.10 开始麦克风测试(仅适用于桌面端)
*
* @param interval 音量回调间隔
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Mac 和 Windows 平台
* 该接口可以测试麦克风是否能正常工作,测试到的麦克风采集音量的大小,会以回调的形式通知给您,其中 volume 的取值范围为0 - 100。
* @param interval 麦克风音量的回调间隔。
*/
virtual int startMicDeviceTest(uint32_t interval) = 0;
/**
* 结束麦克风测试
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Mac 和 Windows 平台
* 2.11 结束麦克风测试(仅适用于桌面端)
*/
virtual int stopMicDeviceTest() = 0;
/**
* 开始扬声器测试
* 2.12 开始扬声器测试(仅适用于桌面端)
*
* 该方法播放指定的音频文件测试播放设备是否能正常工作。如果能听到声音,说明播放设备能正常工作。
* 该接口通过播放指定的音频文件,用于测试播放设备是否能正常工作。如果用户在测试时能听到声音,说明播放设备能正常工作。
* @param filePath 声音文件的路径
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Mac 和 Windows 平台
*/
virtual int startSpeakerDeviceTest(const char* filePath) = 0;
/**
* 停止扬声器测试
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Mac 和 Windows 平台
* 2.13 结束扬声器测试(仅适用于桌面端)
*/
virtual int stopSpeakerDeviceTest() = 0;
#endif
#ifdef _WIN32
/**
* 设置 Windows 系统音量合成器中当前进程的音量
/**
* 2.14 开始摄像头测试(仅适用于 Windows 系统)
*
* @param volume 音量值,取值范围[0~100]
* @return 0:成功
* 该接口支持自定义渲染,即您可以通过接 ITRTCVideoRenderCallback 回调接口接管摄像头的渲染画面。
*/
#ifdef _WIN32
virtual int startCameraDeviceTest(ITRTCVideoRenderCallback* callback) = 0;
#endif
/**
* 2.15 设置 Windows 系统音量合成器中当前进程的音量(仅适用于 Windows 系统)
*/
#ifdef _WIN32
virtual int setApplicationPlayVolume(int volume) = 0;
#endif
/**
* 获取 Windows 系统音量合成器中当前进程的音量
*
* @return 返回音量值,取值范围[0~100]
/**
* 2.16 获取 Windows 系统音量合成器中当前进程的音量(仅适用于 Windows 系统)
*/
#ifdef _WIN32
virtual int getApplicationPlayVolume() = 0;
#endif
/**
* 设置 Windows 系统音量合成器中当前进程的静音状态
*
* @param bMute 是否设置为静音状态
* @return 0 设置成功
/**
* 2.17 设置 Windows 系统音量合成器中当前进程的静音状态(仅适用于 Windows 系统)
*/
#ifdef _WIN32
virtual int setApplicationMuteState(bool bMute) = 0;
#endif
/**
* 获取 Windows 系统音量合成器中当前进程的静音状态
*
* @return 返回静音状态
/**
* 2.18 获取 Windows 系统音量合成器中当前进程的静音状态(仅适用于 Windows 系统)
*/
#ifdef _WIN32
virtual bool getApplicationMuteState() = 0;
#endif
#elif __ANDROID__ || (__APPLE__ && TARGET_OS_IOS)
/**
* 切换摄像头
*
* @param frontCamera YES:切换到前置摄像头 NO:切换到后置摄像头
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual int switchCamera(bool frontCamera) = 0;
/**
* 当前是否为前置摄像头
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual bool isFrontCamera() = 0;
/**
* 获取摄像头最大缩放倍数
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual float getCameraZoomMaxRatio() = 0;
/**
* 设置摄像头缩放倍数
*
* @param zoomRatio 缩放倍数
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual int setCameraZoomRatio(float zoomRatio) = 0;
/**
* 设置是否自动识别人脸位置
*
* @param enabled YES:开启;NO:关闭,默认值:YES
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual int enableCameraAutoFocus (bool enabled) = 0;
/**
* 查询是否支持自动识别人脸位置
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual bool isAutoFocusEnabled () = 0;
/**
* 设置摄像头焦点
*
* @param x 焦点横坐标
* @param y 焦点纵坐标
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual int setCameraFocusPosition (float x, float y) = 0;
/**
* 设置是否开启闪光灯
*
* @param enabled YES:开启;NO:关闭,默认值:NO
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual int enableCameraTorch (bool enabled) = 0;
/**
* 设置通话时使用的系统音量类型
*
* @note
* 1. 需要在调用 startLocalAudio() 之前调用该接口。<br>
* 2. 如无特殊需求,不推荐您自行设置,您只需通过 enterRoom 设置好适合您的场景,SDK 内部会自动选择相匹配的音量类型。
*
* @param type 系统音量类型,如无特殊需求,不推荐您自行设置。
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual int setSystemVolumeType (TXSystemVolumeType type) = 0;
/**
* 设置设置音频路由
*
* 微信和手机 QQ 视频通话功能的免提模式就是基于音频路由实现的。
* 一般手机都有两个扬声器,一个是位于顶部的听筒扬声器,声音偏小;一个是位于底部的立体声扬声器,声音偏大。
* 设置音频路由的作用就是决定声音使用哪个扬声器播放。
*
* @param route 音频路由,即声音由哪里输出(扬声器、听筒),默认值:TXAudioRouteSpeakerphone
* @return 0:操作成功 负数:失败
* @note 此接口只支持 Android 和 iOS 平台
*/
virtual int setAudioRoute (TXAudioRoute route) = 0;
/// @}
}; // End of class ITXDeviceManager
} // namespace trtc
#ifdef _WIN32
using namespace trtc;
#endif
};
#endif / *__ITXDEVICEMANAGER_H__* /
/// @}
}
#endif /* ITXDeviceManager_h */
... ...