diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/IMGroupExt.h b/HHVDoctorSDK/ImSDK.framework/Headers/IMGroupExt.h index d5fddb1..49010ae 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/IMGroupExt.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/IMGroupExt.h @@ -9,7 +9,6 @@ #ifndef IMGroupExt_h #define IMGroupExt_h -#import "ImSDK.h" #import "TIMComm+Group.h" #import "TIMGroupManager+Ext.h" diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/IMMessageExt.h b/HHVDoctorSDK/ImSDK.framework/Headers/IMMessageExt.h index 6b03125..110faad 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/IMMessageExt.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/IMMessageExt.h @@ -9,7 +9,6 @@ #ifndef ImSDK_h #define ImSDK_h -#import "ImSDK.h" #import "TIMConversation+MsgExt.h" #import "TIMMessage+MsgExt.h" #import "TIMComm+MsgExt.h" diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/ImSDK.h b/HHVDoctorSDK/ImSDK.framework/Headers/ImSDK.h index 793b11f..061dd04 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/ImSDK.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/ImSDK.h @@ -15,8 +15,10 @@ #import "TIMConversation.h" #import "TIMGroupManager.h" #import "TIMCallback.h" -//#import "TIMFriendshipManager.h" - -//#import "IMSdkInt.h" +#import "TIMFriendshipManager.h" +#import "IMSdkComm.h" +#import "TIMErrorCode.h" +#import "IMGroupExt.h" +#import "IMMessageExt.h" #endif diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMCallback.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMCallback.h index 098bab7..e277724 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMCallback.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMCallback.h @@ -14,6 +14,8 @@ @class TIMMessage; @class TIMGroupTipsElem; @class TIMGroupInfo; +@class TIMSNSChangeInfo; +@class TIMFriendPendencyInfo; /** * 连接通知回调 @@ -167,90 +169,40 @@ - (void)onGroupTipsEvent:(TIMGroupTipsElem*)elem; @end -///** -// * 好友代理事件回调 -// */ -//@protocol TIMFriendshipListener <NSObject> -//@optional -// -///** -// * 添加好友通知 -// * -// * @param users 好友列表(TIMUserProfile*) -// */ -//- (void)onAddFriends:(NSArray*)users; -// -///** -// * 删除好友通知 -// * -// * @param identifiers 用户id列表(NSString*) -// */ -//- (void)onDelFriends:(NSArray*)identifiers; -// -///** -// * 好友资料更新通知 -// * -// * @param profiles 资料列表(TIMUserProfile*) -// */ -//- (void)onFriendProfileUpdate:(NSArray*)profiles; -// -///** -// * 好友申请通知 -// * -// * @param reqs 好友申请者id列表(TIMSNSChangeInfo*) -// */ -//- (void)onAddFriendReqs:(NSArray*)reqs; -// -//@end +/** + * 好友代理事件回调 + */ +@protocol TIMFriendshipListener <NSObject> +@optional -//@protocol TIMGroupListener <NSObject> -//@optional -// -///** -// * 有新用户加入群时的通知回调 -// * -// * @param groupId 群ID -// * @param membersInfo 加群用户的群资料(TIMGroupMemberInfo*)列表 -// */ -//- (void)onMemberJoin:(NSString*)groupId membersInfo:(NSArray*)membersInfo; -// -///** -// * 有群成员退群时的通知回调 -// * -// * @param groupId 群ID -// * @param members 退群成员的identifier(NSString*)列表 -// */ -//- (void)onMemberQuit:(NSString*)groupId members:(NSArray*)members; -// -///** -// * 群成员信息更新的通知回调 -// * -// * @param groupId 群ID -// * @param membersInfo 更新后的群成员资料(TIMGroupMemberInfo*)列表 -// */ -//- (void)onMemberUpdate:(NSString*)groupId membersInfo:(NSArray*)membersInfo; -// -///** -// * 加入群的通知回调 -// * -// * @param groupInfo 加入群的群组资料 -// */ -//- (void)onGroupAdd:(TIMGroupInfo*)groupInfo; -// -///** -// * 本地群组资料被删除的通知回调,包括主动退群,被踢,群被解散,群被回收 -// * -// * @param groupId 对应的群ID -// */ -//- (void)onGroupDelete:(NSString*)groupId; -// -///** -// * 群资料更新的通知回调 -// * -// * @param groupInfo 更新后的群资料信息 -// */ -//- (void)onGroupUpdate:(TIMGroupInfo*)groupInfo; -// -//@end +/** + * 添加好友通知 + * + * @param users 好友列表(NSString*) + */ +- (void)onAddFriends:(NSArray*)users; + +/** + * 删除好友通知 + * + * @param identifiers 用户id列表(NSString*) + */ +- (void)onDelFriends:(NSArray*)identifiers; + +/** + * 好友资料更新通知 + * + * @param profiles 资料列表(TIMSNSChangeInfo *) + */ +- (void)onFriendProfileUpdate:(NSArray<TIMSNSChangeInfo *> *)profiles; + +/** + * 好友申请通知 + * + * @param reqs 好友申请者id列表(TIMFriendPendencyInfo *) + */ +- (void)onAddFriendReqs:(NSArray<TIMFriendPendencyInfo *> *)reqs; + +@end #endif diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm+Group.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm+Group.h index 0d7b502..30f3f50 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm+Group.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm+Group.h @@ -9,9 +9,10 @@ #ifndef TIMComm_Group_h #define TIMComm_Group_h -#import "ImSDK.h" +#import "TIMComm.h" @class TIMGroupPendencyMeta; +@class TIMCreateGroupMemberInfo; #pragma mark - 枚举类型 @@ -228,9 +229,9 @@ typedef void (^TIMGroupMemberSucc)(NSArray * members); /** * 群列表回调 * - * @param arr 群列表 + * @param arr 群列表,成员类型 TIMGroupInfo */ -typedef void (^TIMGroupListSucc)(NSArray * arr); +typedef void (^TIMGroupListSucc)(NSArray<TIMGroupInfo *> * arr); /** * 本人群组内成员信息回调 @@ -329,7 +330,7 @@ typedef void (^TIMGetGroupPendencyListSucc)(TIMGroupPendencyMeta * meta, NSArray /** * 创建成员(TIMCreateGroupMemberInfo*)列表 */ -@property(nonatomic,strong) NSArray* membersInfo; +@property(nonatomic,strong) NSArray <TIMCreateGroupMemberInfo *>* membersInfo; @end diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm+MsgExt.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm+MsgExt.h index 8906a6b..7b5bc56 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm+MsgExt.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm+MsgExt.h @@ -10,7 +10,7 @@ #define TIMComm_MsgExt_h #import <Foundation/Foundation.h> -#import "ImSDK.h" +#import "TIMComm.h" @class TIMSendToUsersDetailInfo; diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm.h index 29cd6b8..93b00b1 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMComm.h @@ -21,16 +21,19 @@ @protocol TIMMessageRevokeListener; @protocol TIMUploadProgressListener; @protocol TIMGroupEventListener; -//@protocol TIMFriendshipListener; +@protocol TIMFriendshipListener; //@protocol TIMGroupListener; @class TIMMessage; @class TIMImageElem; @class TIMConversation; @class TIMAPNSConfig; @class TIMUserProfile; +@class TIMFriend; @class TIMGroupInfoOption; @class TIMGroupMemberInfoOption; @class TIMFriendProfileOption; +@class TIMFriendResult; +@class TIMCheckFriendResult; #pragma mark - 枚举类型 @@ -53,10 +56,25 @@ typedef NS_ENUM(NSInteger, TIMNetworkStatus) { * 日志级别 */ typedef NS_ENUM(NSInteger, TIMLogLevel) { + /** + * 不输出任何 sdk log + */ TIM_LOG_NONE = 0, + /** + * 输出 DEBUG,INFO,WARNING,ERROR 级别的 log + */ TIM_LOG_DEBUG = 3, + /** + * 输出 INFO,WARNING,ERROR 级别的 log + */ TIM_LOG_INFO = 4, + /** + * 输出 WARNING,ERROR 级别的 log + */ TIM_LOG_WARN = 5, + /** + * 输出 ERROR 级别的 log + */ TIM_LOG_ERROR = 6, }; @@ -175,19 +193,19 @@ typedef NS_ENUM(NSInteger, TIM_IMAGE_TYPE){ */ typedef NS_ENUM(NSInteger, TIM_IMAGE_FORMAT){ /** - * JPG格式 + * JPG 格式 */ TIM_IMAGE_FORMAT_JPG = 0x1, /** - * GIF格式 + * GIF 格式 */ TIM_IMAGE_FORMAT_GIF = 0x2, /** - * PNG格式 + * PNG 格式 */ TIM_IMAGE_FORMAT_PNG = 0x3, /** - * BMP格式 + * BMP 格式 */ TIM_IMAGE_FORMAT_BMP = 0x4, /** @@ -196,6 +214,9 @@ typedef NS_ENUM(NSInteger, TIM_IMAGE_FORMAT){ TIM_IMAGE_FORMAT_UNKNOWN = 0xff, }; +/** + * 登录状态 + */ typedef NS_ENUM(NSInteger, TIMLoginStatus) { /** * 已登陆 @@ -213,6 +234,9 @@ typedef NS_ENUM(NSInteger, TIMLoginStatus) { TIM_STATUS_LOGOUT = 3, }; +/** + * 群组成员是否可见 + */ typedef NS_ENUM(NSInteger, TIMGroupMemberVisibleType) { /** * 未知 @@ -228,6 +252,9 @@ typedef NS_ENUM(NSInteger, TIMGroupMemberVisibleType) { TIM_GROUP_MEMBER_VISIBLE_YES = 0x02, }; +/** + * 群组是否能被搜到 + */ typedef NS_ENUM(NSInteger, TIMGroupSearchableType) { /** * 未知 @@ -302,13 +329,13 @@ typedef NS_ENUM(NSInteger, TIMGroupReceiveMessageOpt) { */ TIM_GROUP_NOT_RECEIVE_MESSAGE = 1, /** - * 接受消息,不进行iOS APNs 推送 + * 接受消息,不进行 iOS APNs 推送 */ TIM_GROUP_RECEIVE_NOT_NOTIFY_MESSAGE = 2, }; /** - * 群Tips类型 + * 群 Tips 类型 */ typedef NS_ENUM(NSInteger, TIM_GROUP_TIPS_TYPE){ /** @@ -342,7 +369,7 @@ typedef NS_ENUM(NSInteger, TIM_GROUP_TIPS_TYPE){ }; /** - * 群Tips类型 + * 群变更信息 Tips 类型 */ typedef NS_ENUM(NSInteger, TIM_GROUP_INFO_CHANGE_TYPE){ /** @@ -433,6 +460,9 @@ typedef NS_ENUM(NSInteger, TIM_GROUP_SYSTEM_TYPE){ TIM_GROUP_SYSTEM_CUSTOM_INFO = 0xff, }; +/** + * 推送规则 + */ typedef NS_ENUM(NSInteger, TIMOfflinePushFlag) { /** * 按照默认规则进行推送 @@ -444,6 +474,9 @@ typedef NS_ENUM(NSInteger, TIMOfflinePushFlag) { TIM_OFFLINE_PUSH_NO_PUSH = 1, }; +/** + * 安卓离线推送模式 + */ typedef NS_ENUM(NSInteger, TIMAndroidOfflinePushNotifyMode) { /** * 通知栏消息 @@ -480,6 +513,9 @@ typedef NS_ENUM(NSInteger, TIMGroupMemberRole) { TIM_GROUP_MEMBER_ROLE_SUPER = 400, }; +/** + * 好友验证方式 + */ typedef NS_ENUM(NSInteger, TIMFriendAllowType) { /** * 同意任何用户加好友 @@ -497,6 +533,9 @@ typedef NS_ENUM(NSInteger, TIMFriendAllowType) { TIM_FRIEND_DENY_ANY = 2, }; +/** + * 性别 + */ typedef NS_ENUM(NSInteger, TIMGender) { /** * 未知性别 @@ -513,61 +552,8 @@ typedef NS_ENUM(NSInteger, TIMGender) { }; -/** - * 基本资料标志位 - */ -typedef NS_ENUM(NSInteger, TIMProfileFlag) { - /** - * 昵称 - */ - TIM_PROFILE_FLAG_NICK = 0x01, - /** - * 好友验证方式 - */ - TIM_PROFILE_FLAG_ALLOW_TYPE = (0x01 << 1), - /** - * 头像 - */ - TIM_PROFILE_FLAG_FACE_URL = (0x01 << 2), - /** - * 好友备注 - */ - TIM_PROFILE_FLAG_REMARK = (0x01 << 3), - /** - * 好友分组 - */ - TIM_PROFILE_FLAG_GROUP = (0x01 << 4), - /** - * 用户签名 - */ - TIM_PROFILE_FLAG_SELFSIGNATURE = (0x01 << 5), - /** - * 用户性别 - */ - TIM_PROFILE_FLAG_GENDER = (0x01 << 6), - /** - * 用户生日 - */ - TIM_PROFILE_FLAG_BIRTHDAY = (0x01 << 7), - /** - * 用户区域 - */ - TIM_PROFILE_FLAG_LOCATION = (0x01 << 8), - /** - * 用户语言 - */ - TIM_PROFILE_FLAG_LANGUAGE = (0x01 << 9), - /** - * 用户等级 - */ - TIM_PROFILE_FLAG_LEVEL = (0x01 << 10), - /** - * 用户角色 - */ - TIM_PROFILE_FLAG_ROLE = (0x01 << 11), -}; -#pragma mark - block回调 +#pragma mark - block 回调 /** * 获取消息回调 @@ -620,12 +606,12 @@ typedef void (^TIMLogFunc)(TIMLogLevel lvl, NSString * msg); /** * 上传图片成功回调 * - * @param elem 上传图片成功后elem + * @param elem 上传图片成功后 elem */ typedef void (^TIMUploadImageSucc)(TIMImageElem * elem); /** - * APNs推送配置更新成功回调 + * APNs 推送配置更新成功回调 * * @param config 配置 */ @@ -634,7 +620,7 @@ typedef void (^TIMAPNSConfigSucc)(TIMAPNSConfig* config); /** * 群创建成功 * - * @param groupId 群组Id + * @param groupId 群组 Id */ typedef void (^TIMCreateGroupSucc)(NSString * groupId); @@ -643,7 +629,7 @@ typedef void (^TIMCreateGroupSucc)(NSString * groupId); * * @param friends 好友列表 */ -typedef void (^TIMFriendSucc)(NSArray * friends); +typedef void (^TIMFriendArraySucc)(NSArray<TIMFriend *> *friends); /** * 获取资料回调 @@ -652,566 +638,395 @@ typedef void (^TIMFriendSucc)(NSArray * friends); */ typedef void (^TIMGetProfileSucc)(TIMUserProfile * profile); +/** + * 获取资料回调 + * + * @param profiles 资料 + */ +typedef void (^TIMUserProfileArraySucc)(NSArray<TIMUserProfile *> *profiles); + +/** + * 好友操作回调 + * + * @param result 资料 + */ +typedef void (^TIMFriendResultSucc)(TIMFriendResult *result); + +/** + * 好友操作回调 + * + * @param results 资料 + */ +typedef void (^TIMFriendResultArraySucc)(NSArray<TIMFriendResult *> *results); + +/** + * 检查好友操作回调 + * + * @param results 检查结果 + */ +typedef void (^TIMCheckFriendResultArraySucc)(NSArray<TIMCheckFriendResult *> *results); + #pragma mark - 基本类型 +/// 实现 NSCoding 协议 @interface TIMCodingModel : NSObject <NSCoding> +///读取实例变量,并把这些数据写到 coder 中去,序列化数据 - (void)encodeWithCoder:(NSCoder *)encoder; + +///从 coder 中读取数据,保存到相应的变量中,即反序列化数据 - (id)initWithCoder:(NSCoder *)decoder; @end +/// 初始化 SDK 配置信息 @interface TIMSdkConfig : NSObject -/** - * 用户标识接入SDK的应用ID,必填 - */ +///用户标识接入 SDK 的应用 ID,必填 @property(nonatomic,assign) int sdkAppId; -/** - * 用户的账号类型,必填 - */ -@property(nonatomic,strong) NSString * accountType; +///用户的账号类型,新版本不需要再填写 +//@property(nonatomic,strong) NSString * accountType; -/** - * 禁用crash上报,默认上报 - */ -@property(nonatomic,assign) BOOL disableCrashReport; - -/** - * 禁止在控制台打印log - */ +///禁止在控制台打印 log @property(nonatomic,assign) BOOL disableLogPrint; -/** - * 本地写log文件的等级,默认DEBUG等级 - */ +///本地写 log 文件的等级,默认 DEBUG 等级 @property(nonatomic,assign) TIMLogLevel logLevel; -/** - * log文件路径,不设置时为默认路径 - */ +///log 文件路径,不设置时为默认路径 @property(nonatomic,strong) NSString * logPath; -/** - * 回调给log函数的log等级,默认DEBUG等级 - */ +///回调给 log 函数的 log 等级,默认 DEBUG 等级 @property(nonatomic,assign) TIMLogLevel logFuncLevel; -/** - * log监听函数 - */ +///log 监听函数 @property(nonatomic,copy) TIMLogFunc logFunc; -/** - * 消息数据库路径,不设置时为默认路径 - */ +///消息数据库路径,不设置时为默认路径 @property(nonatomic,strong) NSString * dbPath; -/** - * 网络监听器 - */ +///网络监听器 @property(nonatomic,strong) id<TIMConnListener> connListener; @end - +/// 设置用户配置信息 @interface TIMUserConfig : NSObject -/** - * 禁用本地存储(加载消息扩展包有效) - */ -@property(nonatomic,assign) BOOL disableStorage; - -/** - * 禁止自动上报(加载消息扩展包有效) - */ +///禁止消息已读自动上报,一旦禁用自动上报,需要开发者显式调用 setReadMessage ,详情请参考官网文档 [未读消息计数](https://cloud.tencent.com/document/product/269/9151) @property(nonatomic,assign) BOOL disableAutoReport; -/** - * 开启C2C已读回执(加载消息扩展包有效) - */ +///开启 C2C 已读回执,只针对 C2C 消息生效,用户开启已读回执功能后,对方调用 setReadMessage 时会同步已读信息到本客户端,您可以在 TIMMessageReceiptListener 监听消息已读回执 @property(nonatomic,assign) BOOL enableReadReceipt; -/** - * 不开启最近联系人(加载消息扩展包有效) - */ -@property(nonatomic,assign) BOOL disableRecnetContact; - -/** - * 不通过onNewMessage:抛出最近联系人的最后一条消息(加载消息扩展包有效) - */ -@property(nonatomic,assign) BOOL disableRecentContactNotify; - -///** -// * 开启关系链数据本地缓存功能(加载好友扩展包有效) -// */ -//@property(nonatomic,assign) BOOL enableFriendshipProxy; - -///** -// * 开启群组数据本地缓存功能(加载群组扩展包有效) -// */ -//@property(nonatomic,assign) BOOL enableGroupAssistant; - -/** - * 设置默认拉取的群组资料 - */ +///设置默认拉取的群组资料 @property(nonatomic,strong) TIMGroupInfoOption * groupInfoOpt; -/** - * 设置默认拉取的群成员资料 - */ +///设置默认拉取的群成员资料 @property(nonatomic,strong) TIMGroupMemberInfoOption * groupMemberInfoOpt; -/** - * 设置默认拉取的好友资料 - */ +///关系链参数 @property(nonatomic,strong) TIMFriendProfileOption * friendProfileOpt; -/** - * 用户登录状态监听器 - */ -@property(nonatomic,strong) id<TIMUserStatusListener> userStatusListener; +///用户登录状态监听器 +@property(nonatomic,weak) id<TIMUserStatusListener> userStatusListener; -/** - * 会话刷新监听器(未读计数、已读同步)(加载消息扩展包有效) - */ -@property(nonatomic,strong) id<TIMRefreshListener> refreshListener; +///会话刷新监听器(未读计数、已读同步) +@property(nonatomic,weak) id<TIMRefreshListener> refreshListener; -/** - * 消息已读回执监听器(加载消息扩展包有效) - */ -@property(nonatomic,strong) id<TIMMessageReceiptListener> messageReceiptListener; +///消息已读回执监听器 +@property(nonatomic,weak) id<TIMMessageReceiptListener> messageReceiptListener; -/** - * 消息svr重写监听器(加载消息扩展包有效) - */ -@property(nonatomic,strong) id<TIMMessageUpdateListener> messageUpdateListener; +///消息 svr 重写监听器 +@property(nonatomic,weak) id<TIMMessageUpdateListener> messageUpdateListener; -/** - * 消息撤回监听器(加载消息扩展包有效) - */ -@property(nonatomic,strong) id<TIMMessageRevokeListener> messageRevokeListener; - -/** - * 文件上传进度监听器 - */ -@property(nonatomic,strong) id<TIMUploadProgressListener> uploadProgressListener; +///消息撤回监听器 +@property(nonatomic,weak) id<TIMMessageRevokeListener> messageRevokeListener; -/** - * 群组事件通知监听器 - */ -@property(nonatomic,strong) id<TIMGroupEventListener> groupEventListener; +///文件上传进度监听器 +@property(nonatomic,weak) id<TIMUploadProgressListener> uploadProgressListener; -///** -// * 关系链数据本地缓存监听器(加载好友扩展包、enableFriendshipProxy有效) -// */ -//@property(nonatomic,strong) id<TIMFriendshipListener> friendshipListener; +///群组事件通知监听器 +@property(nonatomic,weak) id<TIMGroupEventListener> groupEventListener; -///** -// * 群组据本地缓存监听器(加载群组扩展包、enableGroupAssistant有效) -// */ -//@property(nonatomic,strong) id<TIMGroupListener> groupListener; +///关系链数据本地缓存监听器 +@property(nonatomic,weak) id<TIMFriendshipListener> friendshipListener; @end -/** - * 登陆信息 - */ - +/// 登陆参数 @interface TIMLoginParam : NSObject -/** - * 用户名 - */ +///用户名 @property(nonatomic,strong) NSString* identifier; -/** - * 鉴权Token - */ +///鉴权 Token @property(nonatomic,strong) NSString* userSig; -/** - * App用户使用OAuth授权体系分配的Appid - */ +///App 用户使用 OAuth 授权体系分配的 Appid @property(nonatomic,strong) NSString* appidAt3rd; @end -/** - * APNs 配置 - */ +/// APNs 配置 @interface TIMAPNSConfig : NSObject -/** - * 是否开启推送:0-不进行设置 1-开启推送 2-关闭推送 - */ + +///是否开启推送:0-不进行设置 1-开启推送 2-关闭推送 @property(nonatomic,assign) uint32_t openPush; -/** - * C2C消息声音,不设置传入nil - */ + +///C2C 消息声音,不设置传入 nil @property(nonatomic,strong) NSString * c2cSound; -/** - * Group消息声音,不设置传入nil - */ +///Group 消息声音,不设置传入 nil @property(nonatomic,strong) NSString * groupSound; -/** - * Video声音,不设置传入nil - */ +///Video 音视频邀请声音,不设置传入 nil (暂不支持) @property(nonatomic,strong) NSString * videoSound; @end -/** - * SetToken 参数 - */ +/// SetToken 参数 @interface TIMTokenParam : NSObject -/** - * 获取的客户端Token信息 - */ + +///获取的客户端 Token 信息 @property(nonatomic,strong) NSData* token; -/** - * 业务ID,传递证书时分配 - */ + +///业务 ID,传递证书时分配 @property(nonatomic,assign) uint32_t busiId; @end - -/** - * 切后台参数 - */ +/// 切后台参数 @interface TIMBackgroundParam : NSObject -/** - * C2C 未读计数 - */ +///C2C 未读计数 @property(nonatomic,assign) int c2cUnread; -/** - * 群 未读计数 - */ +///群未读计数 @property(nonatomic,assign) int groupUnread; @end +/// 消息定位 @interface TIMMessageLocator : NSObject -/** - * 所属会话的id - */ + +///所属会话的 id @property(nonatomic,strong) NSString * sessId; -/** - * 所属会话的类型 - */ + +///所属会话的类型 @property(nonatomic,assign) TIMConversationType sessType; -/** - * 消息序列号 - */ + +///消息序列号 @property(nonatomic,assign) uint64_t seq; -/** - * 消息随机码 - */ + +///消息随机码 @property(nonatomic,assign) uint64_t rand; -/** - * 消息时间戳 - */ + +///消息时间戳 @property(nonatomic,assign) time_t time; -/** - * 是否本人消息 - */ + +///是否本人消息 @property(nonatomic,assign) BOOL isSelf; -/** - * 是否来自撤销通知 - */ +///是否来自撤销通知 @property(nonatomic,assign) BOOL isFromRevokeNotify; @end -/** - * 已读回执 - */ +/// 已读回执 @interface TIMMessageReceipt : NSObject -/** - * 已读回执对应的会话(目前只支持C2C会话) - */ + +///已读回执对应的会话(目前只支持 C2C 会话) @property(nonatomic,strong) TIMConversation * conversation; -/** - * 收到已读回执时,这个时间戳之前的消息都已读 - */ + +///收到已读回执时,这个时间戳之前的消息都已读 @property(nonatomic,assign) time_t timestamp; @end +/// Android 离线推送配置 @interface TIMAndroidOfflinePushConfig : NSObject -/** - * 离线推送时展示标签 - */ + +///离线推送时展示标签 @property(nonatomic,strong) NSString * title; -/** - * Android离线Push时声音字段信息 - */ + +///Android 离线 Push 时声音字段信息 @property(nonatomic,strong) NSString * sound; -/** - * 离线推送时通知形式 - */ + +///离线推送时通知形式 @property(nonatomic,assign) TIMAndroidOfflinePushNotifyMode notifyMode; @end +/// iOS 离线推送配置 @interface TIMIOSOfflinePushConfig : NSObject -/** - * 离线Push时声音字段信息 - */ + +///离线 Push 时声音字段信息 @property(nonatomic,strong) NSString * sound; -/** - * 忽略badge计数 - */ + +///忽略 badge 计数 @property(nonatomic,assign) BOOL ignoreBadge; @end -/** - * 群组内的本人信息 - */ +/// 群组内的本人信息 @interface TIMGroupSelfInfo : NSObject -/** - * 加入群组时间 - */ +///加入群组时间 @property(nonatomic,assign) uint32_t joinTime; -/** - * 群组中的角色 - */ +///群组中的角色 @property(nonatomic,assign) TIMGroupMemberRole role; -/** - * 群组消息接收选项 - */ +///群组消息接收选项 @property(nonatomic,assign) TIMGroupReceiveMessageOpt recvOpt; -/** - * 群组中的未读消息数 - */ +///群组中的未读消息数 @property(nonatomic,assign) uint32_t unReadMessageNum; @end -/** - * 群资料信息 - */ +/// 群资料信息 @interface TIMGroupInfo : TIMCodingModel -/** - * 群组Id - */ +///群组 Id @property(nonatomic,strong) NSString* group; -/** - * 群名 - */ + +///群名 @property(nonatomic,strong) NSString* groupName; -/** - * 群创建人/管理员 - */ + +///群创建人/管理员 @property(nonatomic,strong) NSString * owner; -/** - * 群类型:Private,Public,ChatRoom - */ + +///群类型:Private,Public,ChatRoom @property(nonatomic,strong) NSString* groupType; -/** - * 群创建时间 - */ + +///群创建时间 @property(nonatomic,assign) uint32_t createTime; -/** - * 最近一次群资料修改时间 - */ + +///最近一次群资料修改时间 @property(nonatomic,assign) uint32_t lastInfoTime; -/** - * 最近一次发消息时间 - */ + +///最近一次发消息时间 @property(nonatomic,assign) uint32_t lastMsgTime; -/** - * 最大成员数 - */ + +///最大成员数 @property(nonatomic,assign) uint32_t maxMemberNum; -/** - * 群成员数量 - */ + +///群成员数量 @property(nonatomic,assign) uint32_t memberNum; -/** - * 入群类型 - */ +///入群类型 @property(nonatomic,assign) TIMGroupAddOpt addOpt; -/** - * 群公告 - */ +///群公告 @property(nonatomic,strong) NSString* notification; -/** - * 群简介 - */ +///群简介 @property(nonatomic,strong) NSString* introduction; -/** - * 群头像 - */ +///群头像 @property(nonatomic,strong) NSString* faceURL; -/** - * 最后一条消息 - */ +///最后一条消息 @property(nonatomic,strong) TIMMessage* lastMsg; -/** - * 在线成员数量 - */ +///在线成员数量 @property(nonatomic,assign) uint32_t onlineMemberNum; -/** - * 群组是否被搜索类型 - */ +///群组是否被搜索类型 @property(nonatomic,assign) TIMGroupSearchableType isSearchable; -/** - * 群组成员可见类型 - */ +///群组成员可见类型 @property(nonatomic,assign) TIMGroupMemberVisibleType isMemberVisible; -/** - 是否全员禁言 - */ +///是否全员禁言 @property(nonatomic,assign) BOOL allShutup; -/** - * 群组中的本人信息 - */ +///群组中的本人信息 @property(nonatomic,strong) TIMGroupSelfInfo* selfInfo; -/** - * 自定义字段集合,key是NSString*类型,value是NSData*类型 - */ -@property(nonatomic,strong) NSDictionary* customInfo; +///自定义字段集合,key 是 NSString* 类型,value 是 NSData* 类型 +@property(nonatomic,strong) NSDictionary<NSString *,NSData *>* customInfo; @end -/** - * 事件上报信息 - */ +/// 事件上报信息 @interface TIMEventReportItem : NSObject -/** - * 事件id - */ + +///事件 id @property(nonatomic,assign) uint32_t event; -/** - * 错误码 - */ + +///错误码 @property(nonatomic,assign) uint32_t code; -/** - * 错误描述 - */ + +///错误描述 @property(nonatomic,strong) NSString * desc; -/** - * 事件延迟(单位ms) - */ + +///事件延迟(单位 ms) @property(nonatomic,assign) uint32_t delay; @end +/// 获取某个群组资料 @interface TIMGroupInfoOption : NSObject -/** - * 需要获取的群组信息标志(TIMGetGroupBaseInfoFlag),默认为0xffffff - */ +///需要获取的群组信息标志(TIMGetGroupBaseInfoFlag),默认为0xffffff @property(nonatomic,assign) uint64_t groupFlags; -/** - * 需要获取群组资料的自定义信息(NSString*)列表 - */ +///需要获取群组资料的自定义信息(NSString*)列表 @property(nonatomic,strong) NSArray * groupCustom; @end +/// 需要某个群成员资料 @interface TIMGroupMemberInfoOption : NSObject -/** - * 需要获取的群成员标志(TIMGetGroupMemInfoFlag),默认为0xffffff - */ +///需要获取的群成员标志(TIMGetGroupMemInfoFlag),默认为0xffffff @property(nonatomic,assign) uint64_t memberFlags; -/** - * 需要获取群成员资料的自定义信息(NSString*)列表 - */ +///需要获取群成员资料的自定义信息(NSString*)列表 @property(nonatomic,strong) NSArray * memberCustom; @end -/** - * 成员操作返回值 - */ +/// 群成员资料 @interface TIMGroupMemberInfo : TIMCodingModel -/** - * 被操作成员 - */ +///成员 @property(nonatomic,strong) NSString* member; -/** - * 群名片 - */ +///群名片 @property(nonatomic,strong) NSString* nameCard; -/** - * 加入群组时间 - */ +///加入群组时间 @property(nonatomic,assign) time_t joinTime; -/** - * 成员类型 - */ +///成员类型 @property(nonatomic,assign) TIMGroupMemberRole role; -/** - * 禁言结束时间(时间戳) - */ +///禁言结束时间(时间戳) @property(nonatomic,assign) uint32_t silentUntil; -/** - * 自定义字段集合,key是NSString*类型,value是NSData*类型 - */ +///自定义字段集合,key 是 NSString*类型,value 是 NSData*类型 @property(nonatomic,strong) NSDictionary* customInfo; @end +///资料与关系链 @interface TIMFriendProfileOption : NSObject -/** - * 需要获取的好友信息标志(TIMProfileFlag),默认为0xffffff - */ -@property(nonatomic,assign) uint64_t friendFlags; - -/** - * 需要获取的好友自定义信息(NSString*)列表 - */ -@property(nonatomic,strong) NSArray * friendCustom; - -/** - * 需要获取的用户自定义信息(NSString*)列表 - */ -@property(nonatomic,strong) NSArray * userCustom; +///关系链最大缓存时间(默认缓存一天;获取资料和关系链超过缓存时间,将自动向服务器发起请求) +@property NSInteger expiredSeconds; @end -/** - * 好友资料 - */ +///用户资料 @interface TIMUserProfile : TIMCodingModel /** - * 用户identifier + * 用户 identifier */ @property(nonatomic,strong) NSString* identifier; @@ -1221,11 +1036,6 @@ typedef void (^TIMGetProfileSucc)(TIMUserProfile * profile); @property(nonatomic,strong) NSString* nickname; /** - * 用户备注(最大96字节,获取自己资料时,该字段为空) - */ -@property(nonatomic,strong) NSString* remark; - -/** * 好友验证方式 */ @property(nonatomic,assign) TIMFriendAllowType allowType; @@ -1241,22 +1051,22 @@ typedef void (^TIMGetProfileSucc)(TIMUserProfile * profile); @property(nonatomic,strong) NSData* selfSignature; /** - * 好友性别 + * 用户性别 */ @property(nonatomic,assign) TIMGender gender; /** - * 好友生日 + * 用户生日 */ @property(nonatomic,assign) uint32_t birthday; /** - * 好友区域 + * 用户区域 */ @property(nonatomic,strong) NSData* location; /** - * 好友语言 + * 用户语言 */ @property(nonatomic,assign) uint32_t language; @@ -1271,16 +1081,61 @@ typedef void (^TIMGetProfileSucc)(TIMUserProfile * profile); @property(nonatomic,assign) uint32_t role; /** - * 好友分组名称 NSString* 列表 + * 自定义字段集合,key是NSString类型,value是NSData类型或者NSNumber类型 + * key值按照后台配置的字符串传入,不包括 TIMProfileTypeKey_Custom_Prefix 前缀 + */ +@property(nonatomic,strong) NSDictionary* customInfo; + +@end + +typedef void(^ProfileCallBack) (TIMUserProfile * proflie); + +/** + * 好友 */ -@property(nonatomic,strong) NSArray* friendGroups; +@interface TIMFriend : TIMCodingModel + +/** + * 好友identifier + */ +@property(nonatomic,strong) NSString *identifier; + +/** + * 好友备注(最大96字节,获取自己资料时,该字段为空) + */ +@property(nonatomic,strong) NSString *remark; + +/** + * 分组名称 NSString* 列表 + */ +@property(nonatomic,strong) NSArray *groups; + +/** + * 申请时的添加理由 + */ +@property(nonatomic,strong) NSString *addWording; + +/** + * 申请时的添加来源 + */ +@property(nonatomic,strong) NSString *addSource; + +/** + * 添加时间 + */ +@property(nonatomic,assign) uint64_t addTime; /** * 自定义字段集合,key是NSString类型,value是NSData类型或者NSNumber类型 - * (key值按照后台配置的字符串传入) + * key值按照后台配置的字符串传入,不包括 TIMFriendTypeKey_Custom_Prefix 前缀 */ @property(nonatomic,strong) NSDictionary* customInfo; +/** + * 好友资料 + */ +@property(nonatomic,strong) TIMUserProfile *profile; + @end #endif diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMConversation+MsgExt.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMConversation+MsgExt.h index 24ace2a..0efab20 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMConversation+MsgExt.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMConversation+MsgExt.h @@ -9,93 +9,100 @@ #ifndef TIMConversation_h #define TIMConversation_h -#import "ImSDK.h" +#import "TIMConversation.h" #import "TIMMessage+MsgExt.h" @interface TIMConversation (MsgExt) /** - * 保存消息到消息列表,这里只保存在本地 + * 保存会话消息 + * + * 保存消息到消息列表,这里只保存在本地。 * * @param msg 消息体 * @param sender 发送方 * @param isReaded 是否已读,如果发送方是自己,默认已读 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)saveMessage:(TIMMessage*)msg sender:(NSString*)sender isReaded:(BOOL)isReaded; /** - * 获取会话消息 + * 获取会话漫游消息 + * + * 1. 登录后可以获取漫游消息,单聊和群聊消息免费漫游7天,用户有额外消息漫游需求时,可前往 [IM 控制台](https://console.cloud.tencent.com/avc) -> 功能配置 -> 消息 ->消息漫游时长 购买,具体资费请参考 [价格说明](https://cloud.tencent.com/document/product/269/11673)。 + * 2. 如果本地消息全部都是连续的,则不会通过网络获取,如果本地消息不连续,会通过网络获取断层消息。 + * 3. 对于图片、语音等资源类消息,消息体只会包含描述信息,需要通过额外的接口下载数据,详情请参考 [消息收发](https://cloud.tencent.com/document/product/269/9150)中的 "消息解析" 部分文档。 * * @param count 获取数量 - * @param last 上次最后一条消息 + * @param last 上次最后一条消息,如果 last 为 nil,从最新的消息开始读取 * @param succ 成功时回调 * @param fail 失败时回调 * - * @return 0 本次操作成功 + * @return 0:本次操作成功;1:本次操作失败 */ - (int)getMessage:(int)count last:(TIMMessage*)last succ:(TIMGetMsgSucc)succ fail:(TIMFail)fail; /** - * 向前获取会话消息 + * 向前获取会话漫游消息 + * + * 调用方式和 getMessage 一样,区别是 getMessage 获取的是时间更老的消息,主要用于下拉 Tableview 刷新消息数据,getMessageForward 获取的是时间更新的消息,主要用于上拉 Tableview 刷新消息数据。 * * @param count 获取数量 - * @param last 上次最后一条消息 + * @param last 上次最后一条消息,如果 last 为 nil,从最新的消息开始读取 * @param succ 成功时回调 * @param fail 失败时回调 * - * @return 0 本次操作成功 + * @return 0:本次操作成功;1:本次操作失败 */ - (int)getMessageForward:(int)count last:(TIMMessage*)last succ:(TIMGetMsgSucc)succ fail:(TIMFail)fail; /** * 获取本地会话消息 * + * 1. 对于单聊,登录后可以获取本地缓存消息 + * 2. 对于群组,开启最近联系人漫游(登录之后 SDK 默认开启,可以通过 TIMUserConfig 里面的 disableRecnetContact 关闭)的情况下,登录后只能获取最近一条消息,可通过 getMessage 获取漫游消息 + * * @param count 获取数量 * @param last 上次最后一条消息 * @param succ 成功时回调 * @param fail 失败时回调 * - * @return 0 本次操作成功 + * @return 0:本次操作成功;1:本次操作失败 */ - (int)getLocalMessage:(int)count last:(TIMMessage*)last succ:(TIMGetMsgSucc)succ fail:(TIMFail)fail; /** - * 获取会话消息 + * 获取指定会话消息 * * @param locators 消息定位符(TIMMessageLocator)数组 * @param succ 成功时回调 * @param fail 失败时回调 * - * @return 0 本次操作成功 + * @return 0:本次操作成功;1:本次操作失败 */ - (int)findMessages:(NSArray*)locators succ:(TIMGetMsgSucc)succ fail:(TIMFail)fail; /** - * 撤回消息(仅C2C和GROUP会话有效、onlineMessage无效、AVChatRoom和BChatRoom无效) + * 撤回消息 + * + * 1. 仅 C2C 和 GROUP 会话有效、onlineMessage 无效、AVChatRoom 和 BChatRoom 无效。 + * 2. 可以在 TIMUserConfig 设置的 TIMMessageRevokeListener 监听 onRevokeMessage 消息撤回回调。 + * 3. 遍历本地消息列表,如果消息的 respondsToLocator 函数返回 YES,则是对应的消息,您可以在 UI 上执行删除操作,具体可以参考 TUIMessageController.h 里面的 onRevokeMessage 回调的实现。 * * @param msg 被撤回的消息 * @param succ 成功时回调 * @param fail 失败时回调 * - * @return 0 本次操作成功 + * @return 0:本次操作成功;1:本次操作失败 */ - (int)revokeMessage:(TIMMessage*)msg succ:(TIMSucc)succ fail:(TIMFail)fail; /** - * 同步本会话的消息撤回通知(仅GROUP会话有效) - * - * @param succ 成功时回调,同步的通知会通过TIMMessageRevokeListener抛出 - * @param fail 失败时回调 - * - * @return 0 本次操作成功 - */ -- (int)syncRevokeNotify:(TIMSucc)succ fail:(TIMFail)fail; - -/** * 删除本地会话消息 * + * 可以在保留会话同时删除本地的会话消息。 + * * @param succ 成功时回调 * @param fail 失败时回调 * @@ -106,7 +113,11 @@ /** * 设置已读消息 * - * @param readed 会话内最近一条已读的消息,nil表示上报最新消息 + * 1. 如果在 TIMUserConfig 关闭了自动已读上报(设置 disableAutoReport 为 YES),这里需要显示调用 setReadMessage ,消息的已读状态才会改变。 + * 2. 如果在 TIMUserConfig 开启了消息回执(设置 enableReadReceipt 为 YES),收消息的用户需要显示调用 setReadMessage ,发消息的用户才能通过 TIMMessageReceiptListener 监听到消息的已读回执。 + * 3. 如果您需要设置单条消息的已读状态,请使用 TIMMessage+MsgExt.h 中的 setCustomInt 自定义字段接口设置,通过 customInt 获取,需要注意的是,这个接口设置的字段只在本地保存,如果切换了终端,或则 APP 被卸载,这个值都会失效。 + * + * @param readed 会话内最近一条已读的消息,nil 表示上报最新消息 * * @param succ 成功时回调 * @param fail 失败时回调 @@ -116,7 +127,10 @@ - (int)setReadMessage:(TIMMessage*)readed succ:(TIMSucc)succ fail:(TIMFail)fail; /** - * 获取该会话的未读计数 + * 获取会话的未读计数 + * + * 1. 单终端,未卸载 APP 的情况下,您可以通过当前接口获取准确的未读计数。 + * 2. 如果需要在多终端或则程序 APP 卸载重装后未读计数依然准确,请设置 TIMUserConfig 的 disableAutoReport 为 YES,然后显示调用 setReadMessage。详情请参考 [未读消息计数](https://cloud.tencent.com/document/product/269/9151) * * @return 返回未读计数 */ @@ -134,32 +148,28 @@ * * @param msgs 消息(TIMMessage*)列表 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)importMessages:(NSArray*)msgs; /** * 设置会话草稿 * - * @param draft 草稿内容 + * UI 展示最近联系人列表时,时常会展示用户的草稿内容,ImSDK 提供了设置和获取草稿的接口,用户可以通过此接口设置会话的草稿信息。草稿信息会存本地数据库,重新登录后依然可以获取。 + * + * @param draft 草稿内容,详情请参考 TIMMessage+MsgExt.h 里面的 TIMMessageDraft 定义 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)setDraft:(TIMMessageDraft*)draft; /** * 获取会话草稿 * - * @return 草稿内容,没有草稿返回nil + * @return 草稿内容,没有草稿返回 nil */ - (TIMMessageDraft*)getDraft; -/** - * 禁用本会话的存储,只对当前初始化有效,重启后需要重新设置 - * 需要 initSdk 之后调用 - */ -- (void)disableStorage; - @end #endif /* TIMConversation_h */ diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMConversation.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMConversation.h index 5d3db0e..39b0a69 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMConversation.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMConversation.h @@ -22,34 +22,45 @@ /** * 发送消息 * + * TIMMessage 由多个 TIMElem 组成,每个 TIMElem 可以是文本和图片,也就是说每一条消息可包含多个文本和多张图片。详情请参考官网文档 [消息收发](https://cloud.tencent.com/document/product/269/9150) + * * @param msg 消息体 * @param succ 发送成功时回调 * @param fail 发送失败时回调 * - * @return 0 本次操作成功 + * @return 0:操作成功;1:操作失败 */ - (int)sendMessage:(TIMMessage*)msg succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 发送在线消息(服务器不保存消息) * + * 1. 对于某些场景,需要发送在线消息,即用户在线时收到消息,如果用户不在线,下次登录也不会看到消息,可用于通知类消息,这种消息不会进行存储,也不会计入未读计数。发送接口与 sendMessage 类似。 + * 2. 暂不支持 AVChatRoom 和 BChatRoom 类型。 + * * @param msg 消息体 * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:操作成功;1:操作失败 */ - (int)sendOnlineMessage:(TIMMessage*)msg succ:(TIMSucc)succ fail:(TIMFail)fail; /** - * 获取会话人,单聊为对方账号,群聊为群组Id + * 获取会话人 + * + * C2C:对方账号;Group:群组Id。 + * + * 对同一个 C2C 会话或则群聊会话,getReceiver 获取的会话人都是固定的,C2C 获取的是对方账号,Group 获取的是群组 Id。 * * @return 会话人 */ - (NSString*)getReceiver; /** - * 获取群名称(只有群会话有效) + * 获取群名称 + * + * 获取群名称,只有群会话有效。 * * @return 群名称 */ @@ -63,9 +74,9 @@ - (TIMConversationType)getType; /** - * 获取该会话所属用户的id + * 获取自己的 id * - * @return 用户id + * @return 用户 id */ - (NSString*)getSelfIdentifier; diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMErrorCode.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMErrorCode.h new file mode 100755 index 0000000..9400beb --- /dev/null +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMErrorCode.h @@ -0,0 +1,108 @@ +// +// TIMErrorCode.h +// ImSDK +// +// Created by jameskhdeng on 2018/11/23. +// Copyright © 2018 tencent. All rights reserved. +// + +#ifndef TIMErrorCode_h +#define TIMErrorCode_h + +enum ERROR_CODE { + ERR_SUCC = 0, + ERR_PARSE_RESPONSE_FAILED = 6001, //解析响应失败 + ERR_SERIALIZE_REQ_FAILED = 6002, //序列化请求失败 + ERR_NO_SUCC_RESULT = 6003, //批量操作无成功结果 + ERR_INVALID_CONVERSATION = 6004, //IM: 无效会话 + ERR_LOADMSG_FAILED = 6005, //IM: 加载本地消息存储失败 + ERR_FILE_TRANS_AUTH_FAILED = 6006, //IM: 文件传输 - 鉴权失败 + ERR_FILE_TRANS_NO_SERVER = 6007, //IM: 文件传输 - 获取svr失败 + ERR_FILE_TRANS_UPLOAD_FAILED = 6008, //IM: 文件传输 - 上传失败 + ERR_FILE_TRANS_DOWNLOAD_FAILED = 6009, //IM: 文件传输 - 下载失败 + ERR_HTTP_REQ_FAILED = 6010, //HTTP请求失败 + ERR_TO_USER_INVALID = 6011, //IM: 无效接收方 + ERR_REQUEST_TIMEOUT = 6012, //请求超时 + ERR_SDK_NOT_INITIALIZED = 6013, //SDK未初始化 + ERR_SDK_NOT_LOGGED_IN = 6014, //SDK未登录 + ERR_IN_PROGESS = 6015, //执行中 + ERR_INVALID_MSG_ELEM = 6016, //IM: 无效消息elem + ERR_INVALID_PARAMETERS = 6017, //API参数无效 + ERR_INIT_CORE_FAIL = 6018, //INIT CORE模块失败 + ERR_DATABASE_OPERATE_FAILED = 6019, //本地数据库操作失败 + ERR_EXPIRED_SESSION_NODE = 6020, //SessionNode为null + ERR_INVALID_SDK_OBJECT = 6021, //无效的imsdk对象,例如用户自己生成TIMImage,或内部赋值错误导致的sdk对象无效 + ERR_IO_OPERATION_FAILED = 6022, //本地IO操作失败 + ERR_LOGGED_OUT_BEFORE_LOGIN_FINISHED = 6023, //在登录完成前进行了登出(在登录时返回) + ERR_TLSSDK_NOT_INITIALIZED = 6024, //tlssdk未初始化 + ERR_TLSSDK_USER_NOT_FOUND = 6025, //TLSSDK没有找到相应的用户信息 + ERR_NO_PREVIOUS_LOGIN = 6026, //自动登陆时并没有登陆过该用户 + + ERR_BIND_FAIL_UNKNOWN = 6100, //QALSDK未知原因BIND失败 + ERR_BIND_FAIL_NO_SSOTICKET = 6101, //缺少SSO票据 + ERR_BIND_FAIL_REPEATD_BIND = 6102, //重复BIND + ERR_BIND_FAIL_TINYID_NULL = 6103, //tiny为空 + ERR_BIND_FAIL_GUID_NULL = 6104, //guid为空 + ERR_BIND_FAIL_UNPACK_REGPACK_FAILED = 6105, //解注册包失败 + ERR_BIND_FAIL_REG_TIMEOUT = 6106, //注册超时 + ERR_BIND_FAIL_ISBINDING = 6107, //正在bind操作中 + + ERR_PACKET_FAIL_UNKNOWN = 6120, //发包未知错误 + ERR_PACKET_FAIL_REQ_NO_NET = 6121, //发送请求包时没有网络,处理时转换成ERR_REQ_NO_NET_ON_REQ + ERR_PACKET_FAIL_RESP_NO_NET = 6122, //发送回复包时没有网络,处理时转换成ERR_REQ_NO_NET_ON_RSP + ERR_PACKET_FAIL_REQ_NO_AUTH = 6123, //发送请求包时没有权限 + ERR_PACKET_FAIL_SSO_ERR = 6124, //SSO错误 + ERR_PACKET_FAIL_REQ_TIMEOUT = 6125, //请求超时,处理时转化成ERR_REQUEST_TIMEOUT + ERR_PACKET_FAIL_RESP_TIMEOUT = 6126, //回复超时,处理时转化成ERR_REQUEST_TIMEOUT + ERR_PACKET_FAIL_REQ_ON_RESEND = 6127, // + ERR_PACKET_FAIL_RESP_NO_RESEND = 6128, // + ERR_PACKET_FAIL_FLOW_SAVE_FILTERED = 6129, // + ERR_PACKET_FAIL_REQ_OVER_LOAD = 6130, // + ERR_PACKET_FAIL_LOGIC_ERR = 6131, + + ERR_FRIENDSHIP_PROXY_NOT_SYNCED = 6150, // proxy_manager没有完成svr数据同步 + ERR_FRIENDSHIP_PROXY_SYNCING = 6151, // proxy_manager正在进行svr数据同步 + ERR_FRIENDSHIP_PROXY_SYNCED_FAIL = 6152, // proxy_manager同步失败 + ERR_FRIENDSHIP_PROXY_LOCAL_CHECK_ERR = 6153, // proxy_manager请求参数,在本地检查不合法 + + ERR_GROUP_INVALID_FIELD = 6160, // group assistant请求字段中包含非预设字段 + ERR_GROUP_STORAGE_DISABLED = 6161, // group assistant群资料本地存储没有开启 + ERR_LOADGRPINFO_FAILED = 6162, // failed to load groupinfo from storage + + ERR_REQ_NO_NET_ON_REQ = 6200, // 请求的时候没有网络 + ERR_REQ_NO_NET_ON_RSP = 6201, // 响应的时候没有网络 + ERR_SERIVCE_NOT_READY = 6205, // QALSDK服务未就绪 + ERR_USER_SIG_EXPIRED = 6206, // 票据过期 + ERR_LOGIN_AUTH_FAILED = 6207, // 账号认证失败(tinyid转换失败) + ERR_LOGIN_KICKED_OFF_BY_OTHER = 6208, // 账号被踢 + ERR_NEVER_CONNECT_AFTER_LAUNCH = 6209, // 在应用启动后没有尝试联网 + + ERR_REQ_FAILED = 6210, // QAL执行失败 + ERR_REQ_INVALID_REQ = 6211, // 请求非法,toMsgService非法 + ERR_REQ_OVERLOADED = 6212, // 请求队列満 + ERR_REQ_KICK_OFF = 6213, // 已经被其他终端踢了 + ERR_REQ_SERVICE_SUSPEND = 6214, // 服务被暂停 + ERR_REQ_INVALID_SIGN = 6215, // SSO签名错误 + ERR_REQ_INVALID_COOKIE = 6216, // SSO cookie无效 + ERR_LOGIN_TLS_RSP_PARSE_FAILED = 6217, // 登录时TLS回包校验,包体长度错误 + ERR_LOGIN_OPENMSG_TIMEOUT = 6218, // 登录时OPENSTATSVC向OPENMSG上报状态超时 + ERR_LOGIN_OPENMSG_RSP_PARSE_FAILED = 6219, // 登录时OPENSTATSVC向OPENMSG上报状态时解析回包失败 + ERR_LOGIN_TLS_DECRYPT_FAILED = 6220, // 登录时TLS解密失败 + ERR_WIFI_NEED_AUTH = 6221, // wifi需要认证 + + ERR_USER_CANCELED = 6222, // 用户已取消 + + ERR_REVOKE_TIME_LIMIT_EXCEED = 6223, //消息撤回超过了时间限制(默认2分钟) + ERR_LACK_UGC_EXT = 6224, // 缺少UGC扩展包 + ERR_AUTOLOGIN_NEED_USERSIG = 6226, //自动登录,本地票据过期,需要userSig手动登录 + + + ERR_REQ_CONTENT_ATTACK = 80001, // 消息内容安全打击 + + ERR_LOGIN_SIG_EXPIRE = 70001, // 登陆返回,票据过期 + + ERR_SDK_HAD_INITIALIZED = 90001, // SDK 已经初始化无需重复初始化 + ERR_OPENBDH_BASE = 115000, // openbdh 错误码基 +}; + +#endif /* TIMErrorCode_h */ diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMFriendshipDefine.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMFriendshipDefine.h new file mode 100755 index 0000000..393f882 --- /dev/null +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMFriendshipDefine.h @@ -0,0 +1,664 @@ +// +// TIMFriendshipDefine.h +// imsdk +// +// Created by annidyfeng on 2019/3/7. +// Copyright © 2019年 Tencent. All rights reserved. +// + +#ifndef TIMFriendshipDefine_h +#define TIMFriendshipDefine_h + +#import "ImSDK.h" + +@class TIMFriendMetaInfo; +@class TIMFriendPendencyResponse; +@class TIMFriendPendencyItem; +@class TIMFriendFutureMeta; +@class TIMFriendGroup; + +#pragma mark - 枚举类型 + +/** + * 好友操作状态 + * + * 详细错误码参见 https://cloud.tencent.com/document/product/269/1671#.E5.85.B3.E7.B3.BB.E9.93.BE.E9.94.99.E8.AF.AF.E7.A0.81 + */ +typedef NS_ENUM(NSInteger, TIMFriendStatus) { + /** + * 操作成功 + */ + TIM_FRIEND_STATUS_SUCC = 0, + + /** + * 请求参数错误,请根据错误描述检查请求是否正确 + */ + TIM_FRIEND_PARAM_INVALID = 30001, + + /** + * 请求参数错误,SdkAppid 不匹配。 + */ + TIM_FRIEND_SDK_APPID_INVALID = 30002, + + /** + * 请求的用户帐号不存在 + */ + TIM_FRIEND_ID_INVALID = 30003, + + /** + * 请求需要 App 管理员权限 + */ + TIM_FRIEND_NEED_ADMIN_PERMISSON = 30004, + + /** + * 关系链字段中包含敏感词 + */ + TIM_FRIEND_DIRTY_WORD = 30005, + + /** + * 服务器内部错误,请重试 + */ + TIM_FRIEND_SERVER_ERROR = 30006, + + /** + * 网络超时,请稍后重试 + */ + TIM_FRIEND_TIMEOUT = 30007, + + /** + * 并发写导致写冲突,建议使用批量方式 + */ + TIM_FRIEND_WRITE_ERROR = 30008, + + /** + * 后台禁止该用户发起加好友请求 + */ + TIM_ADD_FRIEND_FORBIDEN = 30009, + + /** + * 自己的好友数已达系统上限 + */ + TIM_ADD_FRIEND_STATUS_SELF_FRIEND_FULL = 30010, + + /** + * 分组已达系统上限 + */ + TIM_UPDATE_FRIEND_GROUP_STATUS_MAX_GROUPS_EXCEED = 30011, + + /** + * 未决数已达系统上限。 + */ + TIM_PENDENCY_STATUS_FULL = 30012, + + /** + * 黑名单数已达系统上限 + */ + TIM_ADD_BLACKLIST_STATUS_FULL = 30013, + + /** + * 对方的好友数已达系统上限 + */ + TIM_ADD_FRIEND_STATUS_THEIR_FRIEND_FULL = 30014, + + /** + * 被加好友在自己的黑名单中 + */ + TIM_ADD_FRIEND_STATUS_IN_SELF_BLACK_LIST = 30515, + + /** + * 被加好友设置为禁止加好友 + */ + TIM_ADD_FRIEND_STATUS_FRIEND_SIDE_FORBID_ADD = 30516, + + /** + * 已被被添加好友设置为黑名单 + */ + TIM_ADD_FRIEND_STATUS_IN_OTHER_SIDE_BLACK_LIST = 30525, + + /** + * 等待好友审核同意 + */ + TIM_ADD_FRIEND_STATUS_PENDING = 30539, + + /** + * 添加好友请求被安全策略打击,请勿频繁发起添加好友请求 + */ + TIM_ADD_FRIEND_STATUS_SENSITIVE = 30540, + + /** + * 对方没有申请过好友 + */ + TIM_RESPONSE_FRIEND_STATUS_NO_REQ = 30614, + + /** + * 删除好友请求被安全策略打击,请勿频繁发起删除好友请求 + */ + TIM_DELETE_FRIEND_STATUS_SENSITIVE = 31707, +}; + +typedef NS_ENUM(NSInteger, TIMDelFriendType) { + /** + * 删除单向好友 + */ + TIM_FRIEND_DEL_SINGLE = 1, + + /** + * 删除双向好友 + */ + TIM_FRIEND_DEL_BOTH = 2, +}; + +typedef NS_ENUM(NSInteger, TIMPendencyType) { + /** + * 别人发给我的 + */ + TIM_PENDENCY_COME_IN = 1, + + /** + * 我发给别人的 + */ + TIM_PENDENCY_SEND_OUT = 2, + + /** + * 别人发给我的 和 我发给别人的。仅拉取时有效 + */ + TIM_PENDENCY_BOTH = 3, +}; + +/** + * 推荐好友类型 + */ +typedef NS_ENUM(NSInteger, TIMFutureFriendType) { + /** + * 收到的未决请求 + */ + TIM_FUTURE_FRIEND_PENDENCY_IN_TYPE = 0x1, + + /** + * 发出去的未决请求 + */ + TIM_FUTURE_FRIEND_PENDENCY_OUT_TYPE = 0x2, + + /** + * 推荐好友 + */ + TIM_FUTURE_FRIEND_RECOMMEND_TYPE = 0x4, + + /** + * 已决好友 + */ + TIM_FUTURE_FRIEND_DECIDE_TYPE = 0x8, +}; + +/** + * 翻页选项 + */ +typedef NS_ENUM(NSInteger, TIMPageDirectionType) { + /** + * 向上翻页 + */ + TIM_PAGE_DIRECTION_UP_TYPE = 1, + + /** + * 向下翻页 + */ + TIM_PAGE_DIRECTION_DOWN_TYPE = 2, +}; + +/** + * 好友检查类型 + */ +typedef NS_ENUM(NSInteger,TIMFriendCheckType) { + /** + * 单向好友 + */ + TIM_FRIEND_CHECK_TYPE_UNIDIRECTION = 0x1, + /** + * 互为好友 + */ + TIM_FRIEND_CHECK_TYPE_BIDIRECTION = 0x2, +}; + +/** + * 好友关系类型 + */ +typedef NS_ENUM(NSInteger,TIMFriendRelationType) { + /** + * 不是好友 + */ + TIM_FRIEND_RELATION_TYPE_NONE = 0x0, + /** + * 对方在我的好友列表中 + */ + TIM_FRIEND_RELATION_TYPE_MY_UNI = 0x1, + /** + * 我在对方的好友列表中 + */ + TIM_FRIEND_RELATION_TYPE_OTHER_UNI = 0x2, + /** + * 互为好友 + */ + TIM_FRIEND_RELATION_TYPE_BOTHWAY = 0x3, +}; + +typedef NS_ENUM(NSInteger, TIMFriendResponseType) { + /** + * 同意加好友(建立单向好友) + */ + TIM_FRIEND_RESPONSE_AGREE = 0, + + /** + * 同意加好友并加对方为好友(建立双向好友) + */ + TIM_FRIEND_RESPONSE_AGREE_AND_ADD = 1, + + /** + * 拒绝对方好友请求 + */ + TIM_FRIEND_RESPONSE_REJECT = 2, +}; + +#pragma mark - block回调 + +/** + * 获取好友列表回调 + * + * @param meta 好友元信息 + * @param friends 好友列表 TIMUserProfile* 数组,只包含需要的字段 + */ +typedef void (^TIMGetFriendListByPageSucc)(TIMFriendMetaInfo * meta, NSArray * friends); + +/** + * 获取未决请求列表成功 + * + * @param pendencyResponse 未决请求元信息 + */ +typedef void (^TIMGetFriendPendencyListSucc)(TIMFriendPendencyResponse *pendencyResponse); + +/** + * 群搜索回调 + * + * @param totalNum 搜索结果的总数 + * @param users 请求的用户列表片段 + */ +typedef void (^TIMUserSearchSucc)(uint64_t totalNum, NSArray * users); + +/** + * 好友分组列表 + * + * @param groups 好友分组(TIMFriendGroup*)列表 + */ +typedef void (^TIMFriendGroupArraySucc)(NSArray<TIMFriendGroup *> * groups); + +/** + * 好友关系检查回调 + * + * @param results TIMCheckFriendResult列表 + */ +typedef void (^TIMFriendCheckSucc)(NSArray* results); + +#pragma mark - 基本类型 + +/** + * 加好友请求 + */ +@interface TIMFriendRequest : TIMCodingModel + +/** + * 用户identifier(必填) + */ +@property (nonatomic,strong) NSString* identifier; + +/** + * 备注(备注最大96字节) + */ +@property (nonatomic,strong) NSString* remark; + +/** + * 请求说明(最大120字节) + */ +@property (nonatomic,strong) NSString* addWording; + +/** + * 添加来源 + * 来源需要添加“AddSource_Type_”前缀 + */ +@property (nonatomic,strong) NSString* addSource; + +/** + * 分组 + */ +@property (nonatomic,strong) NSString* group; + +@end + +/** + * 未决请求 + */ +@interface TIMFriendPendencyItem : TIMCodingModel + +/** + * 用户标识 + */ +@property(nonatomic,strong) NSString* identifier; +/** + * 增加时间 + */ +@property(nonatomic,assign) uint64_t addTime; +/** + * 来源 + */ +@property(nonatomic,strong) NSString* addSource; +/** + * 加好友附言 + */ +@property(nonatomic,strong) NSString* addWording; + +/** + * 加好友昵称 + */ +@property(nonatomic,strong) NSString* nickname; + +/** + * 未决请求类型 + */ +@property(nonatomic,assign) TIMPendencyType type; + +@end + +/** + * 未决推送 + */ +@interface TIMFriendPendencyInfo : TIMCodingModel +/** + * 用户标识 + */ +@property(nonatomic,strong) NSString* identifier; +/** + * 来源 + */ +@property(nonatomic,strong) NSString* addSource; +/** + * 加好友附言 + */ +@property(nonatomic,strong) NSString* addWording; + +/** + * 加好友昵称 + */ +@property(nonatomic,strong) NSString* nickname; +@end + +/** + * 未决请求信息 + */ +@interface TIMFriendPendencyRequest : TIMCodingModel + +/** + * 序列号,未决列表序列号 + * 建议客户端保存seq和未决列表,请求时填入server返回的seq + * 如果seq是server最新的,则不返回数据 + */ +@property(nonatomic,assign) uint64_t seq; + +/** + * 翻页时间戳,只用来翻页,server返回0时表示没有更多数据,第一次请求填0 + * 特别注意的是,如果server返回的seq跟填入的seq不同,翻页过程中,需要使用客户端原始seq请求,直到数据请求完毕,才能更新本地seq + */ +@property(nonatomic,assign) uint64_t timestamp; + +/** + * 每页的数量,即本次请求最多返回都个数据 + */ +@property(nonatomic,assign) uint64_t numPerPage; + +/** + * 未决请求拉取类型 + */ +@property(nonatomic,assign) TIMPendencyType type; + +@end + +/** + * 未决返回信息 + */ +@interface TIMFriendPendencyResponse : TIMCodingModel + +/** + * 本次请求的未决列表序列号 + */ +@property(nonatomic,assign) uint64_t seq; + +/** + * 本次请求的翻页时间戳 + */ +@property(nonatomic,assign) uint64_t timestamp; + +/** + * 未决请求未读数量 + */ +@property(nonatomic,assign) uint64_t unreadCnt; + +/** + * 未决数据 + */ +@property NSArray<TIMFriendPendencyItem *> * pendencies; + +@end + + + +/** + * 好友元信息 + */ +@interface TIMFriendMetaInfo : TIMCodingModel + +/** + * 时间戳,需要保存,下次拉取时传入,增量更新使用 + */ +@property(nonatomic,assign) uint64_t timestamp; +/** + * 序列号,需要保存,下次拉取时传入,增量更新使用 + */ +@property(nonatomic,assign) uint64_t infoSeq; +/** + * 分页信息,无需保存,返回为0时结束,非0时传入再次拉取,第一次拉取时传0 + */ +@property(nonatomic,assign) uint64_t nextSeq; +/** + * 覆盖:为TRUE时需要重设timestamp, infoSeq, nextSeq为0,清除客户端存储,重新拉取资料 + */ +@property(nonatomic,assign) BOOL recover; + +@end + +/** + * 好友分组信息 + */ +@interface TIMFriendGroup : TIMCodingModel +/** + * 好友分组名称 + */ +@property(nonatomic,strong) NSString* name; + +/** + * 分组成员数量 + */ +@property(nonatomic,assign) uint64_t userCnt; + +/** + * 分组成员identifier列表 + */ +@property(nonatomic,strong) NSArray* friends; + +@end + +/** + * 好友关系检查 + */ +@interface TIMFriendCheckInfo : NSObject +/** + * 检查用户的id列表(NSString*) + */ +@property(nonatomic,strong) NSArray* users; + +/** + * 检查类型 + */ +@property(nonatomic,assign) TIMFriendCheckType checkType; + +@end + +@interface TIMCheckFriendResult : NSObject +/** + * 用户id + */ +@property NSString* identifier; + +/** + * 返回码 + */ +@property NSInteger result_code; + +/** + * 返回信息 + */ +@property NSString *result_info; + +/** + * 检查结果 + */ +@property(nonatomic,assign) TIMFriendRelationType resultType; + +@end + +@interface TIMFriendResult : NSObject + +/** + * 用户Id + */ +@property NSString* identifier; + +/** + * 返回码 + */ +@property NSInteger result_code; + +/** + * 返回信息 + */ +@property NSString *result_info; + +@end + +/** + * 响应好友请求 + */ +@interface TIMFriendResponse : NSObject + +/** + * 响应类型 + */ +@property(nonatomic,assign) TIMFriendResponseType responseType; + +/** + * 用户identifier + */ +@property(nonatomic,strong) NSString* identifier; + +/** + * 备注好友(可选,如果要加对方为好友)。备注最大96字节 + */ +@property(nonatomic,strong) NSString* remark; + +@end + + +/** + * 好友分组信息扩展 + */ +@interface TIMFriendGroupWithProfiles : TIMFriendGroup +/** + * 好友资料(TIMUserProfile*)列表 + */ +@property(nonatomic,strong) NSArray* profiles; +@end + +// 用户资料KEY + +/** + * 昵称 + * 值类型: NSString + */ +extern NSString *const TIMProfileTypeKey_Nick; +/** + * 头像 + * 值类型: NSString + */ +extern NSString *const TIMProfileTypeKey_FaceUrl; +/** + * 好友申请 + * 值类型: NSNumber [TIM_FRIEND_ALLOW_ANY,TIM_FRIEND_NEED_CONFIRM,TIM_FRIEND_DENY_ANY] + */ +extern NSString *const TIMProfileTypeKey_AllowType; +/** + * 性别 + * 值类型: NSNumber [TIM_GENDER_UNKNOWN,TIM_GENDER_MALE,TIM_GENDER_FEMALE] + */ +extern NSString *const TIMProfileTypeKey_Gender; +/** + * 生日 + * 值类型: NSNumber + */ +extern NSString *const TIMProfileTypeKey_Birthday; +/** + * 位置 + * 值类型: NSString + */ +extern NSString *const TIMProfileTypeKey_Location; +/** + * 语言 + * 值类型: NSNumber + */ +extern NSString *const TIMProfileTypeKey_Language; +/** + * 等级 + * 值类型: NSNumber + */ +extern NSString *const TIMProfileTypeKey_Level; +/** + * 角色 + * 值类型: NSNumber + */ +extern NSString *const TIMProfileTypeKey_Role; +/** + * 签名 + * 值类型: NSString + */ +extern NSString *const TIMProfileTypeKey_SelfSignature; +/** + * 自定义字段前缀 + * 值类型: [NSString,NSData|NSNumber] + * @note 当设置自定义字的值NSString对象时,后台会将其转为UTF8保存在数据库中。由于部分用户迁移资料时可能不是UTF8类型,所以在获取资料时,统一返回NSData类型。 + */ +extern NSString *const TIMProfileTypeKey_Custom_Prefix; + +// 好友资料KEY + +/** + * 备注 + * 值类型: NSString + */ +extern NSString *const TIMFriendTypeKey_Remark; +/** + * 分组 + * 值类型: [NSArray] + */ +extern NSString *const TIMFriendTypeKey_Group; +/** + * 自定义字段前缀 + * 值类型: [NSString,NSData|NSNumber] + */ +extern NSString *const TIMFriendTypeKey_Custom_Prefix; +#endif /* TIMFriendshipDefine_h */ + diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMFriendshipManager.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMFriendshipManager.h new file mode 100755 index 0000000..aebe29a --- /dev/null +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMFriendshipManager.h @@ -0,0 +1,295 @@ +// +// TIMFriendshipManager.h +// imsdk +// +// Created by annidyfeng on 2019/3/7. +// Copyright © 2019年 Tencent. All rights reserved. +// + +#ifndef TIMFriendshipManager_h +#define TIMFriendshipManager_h + +#import "TIMComm.h" +#import "TIMFriendshipDefine.h" + +@interface TIMFriendshipManager : NSObject +/** + * 获取好友管理器实例 + * + * @return 管理器实例 + */ ++ (TIMFriendshipManager*)sharedInstance; + +/** + * 设置自己的资料 + * + * @param values 需要更新的属性,可一次更新多个字段. 参见 TIMFriendshipDefine.h 的 TIMProfileTypeKey_XXX + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)modifySelfProfile:(NSDictionary<NSString *, id> *)values succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 获取自己的资料 + * + * @param succ 成功回调,返回 TIMUserProfile + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)getSelfProfile:(TIMGetProfileSucc)succ fail:(TIMFail)fail; + +/** + * 在缓存中查询自己的资料 + * + * @return 返回缓存的资料,未找到返回nil + */ +- (TIMUserProfile *)querySelfProfile; + +/** + * 获取指定用户资料 + * + * @param identifiers 用户id,非好友的用户也可以 + * @prarm forceUpdate 强制从后台拉取 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)getUsersProfile:(NSArray<NSString *> *)identifiers forceUpdate:(BOOL)forceUpdate succ:(TIMUserProfileArraySucc)succ fail:(TIMFail)fail; + +/** + * 在缓存中查询用户的资料 + * + * @praram identifier 用户id,非好友的用户也可以 + * + * @return 返回缓存的资料,未找到返回nil + */ +- (TIMUserProfile *)queryUserProfile:(NSString *)identifier; + +/** + * 获取好友列表 + * + * @param succ 成功回调,返回好友(TIMFriend)列表 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +-(int)getFriendList:(TIMFriendArraySucc)succ fail:(TIMFail)fail; + + +/** + * 在缓存中查询用户的关系链数据 + * + * @praram identifier 用户id + * + * @return 返回缓存的关系链数据,未找到返回nil + * @note 缓存数据来自于上一次调用getFriendList,请确保已调用了获取好友列表方法 + */ +- (TIMFriend *)queryFriend:(NSString *)identifier; + +/** + * 获取缓存中的关系链列表 + * + * @return 返回缓存的关系链数据 + * @note 缓存数据来自于上一次调用getFriendList,请确保已调用了获取好友列表方法 + */ +- (NSArray<TIMFriend *> *)queryFriendList; + +/** + * 检查指定用户的好友关系 + * + * @param checkInfo 好友检查信息 + * @param succ 成功回调,返回检查结果 + * @param fail 失败回调 + * + * @return 0 发送成功 + */ +- (int)checkFriends:(TIMFriendCheckInfo *)checkInfo succ:(TIMCheckFriendResultArraySucc)succ fail:(TIMFail)fail; + +/** + * 添加好友 + * + * @param request 添加好友请求 + * @param succ 成功回调(TIMFriendResult) + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)addFriend:(TIMFriendRequest *)request succ:(TIMFriendResultSucc)succ fail:(TIMFail)fail; + +/** + * 响应对方好友邀请 + * + * @param response 响应请求 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)doResponse:(TIMFriendResponse *)response succ:(TIMFriendResultSucc)succ fail:(TIMFail)fail; + +/** + * 删除好友 + * + * @param identifiers 好友id + * @param delType 删除类型(单向好友、双向好友) + * @param succ 成功回调([TIMFriendResult]) + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)deleteFriends:(NSArray *)identifiers delType:(TIMDelFriendType)delType succ:(TIMFriendResultArraySucc)succ fail:(TIMFail)fail; + +/** + * 修改好友 + * + * @param identifier 好友id + * @param values 需要更新的属性,可一次更新多个字段. 参见 TIMFriendshipDefine.h 的 TIMFriendTypeKey_XXX + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)modifyFriend:(NSString *)identifier values:(NSDictionary<NSString *, id> *)values succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 获取未决列表 + * + * @param pendencyRequest 请求信息,详细参考TIMFriendPendencyRequest + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)getPendencyList:(TIMFriendPendencyRequest *)pendencyRequest succ:(TIMGetFriendPendencyListSucc)succ fail:(TIMFail)fail; + +/** + * 未决删除 + * + * @param type 未决好友类型 + * @param identifiers 要删除的未决列表 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)deletePendency:(TIMPendencyType)type users:(NSArray *)identifiers succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 未决已读上报 + * + * @param timestamp 已读时间戳,此时间戳以前的消息都将置为已读 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)pendencyReport:(uint64_t)timestamp succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 获取黑名单列表 + * + * @param succ 成功回调,返回NSString*列表 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)getBlackList:(TIMFriendArraySucc)succ fail:(TIMFail)fail; + +/** + * 添加用户到黑名单 + * + * @param identifiers 用户列表 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)addBlackList:(NSArray *)identifiers succ:(TIMFriendResultArraySucc)succ fail:(TIMFail)fail; + +/** + * 把用户从黑名单中删除 + * + * @param identifiers 用户列表 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)deleteBlackList:(NSArray *)identifiers succ:(TIMFriendResultArraySucc)succ fail:(TIMFail)fail; + +/** + * 新建好友分组 + * + * @param groupNames 分组名称列表,必须是当前不存在的分组 + * @param identifiers 要添加到分组中的好友 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)createFriendGroup:(NSArray *)groupNames users:(NSArray *)identifiers succ:(TIMFriendResultArraySucc)succ fail:(TIMFail)fail; + +/** + * 获取指定的好友分组信息 + * + * @param groupNames 要获取信息的好友分组名称列表,传入nil获得所有分组信息 + * @param succ 成功回调,返回 TIMFriendGroup* 列表 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)getFriendGroups:(NSArray *)groupNames succ:(TIMFriendGroupArraySucc)succ fail:(TIMFail)fail; + +/** + * 删除好友分组 + * + * @param groupNames 要删除的好友分组名称列表 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)deleteFriendGroup:(NSArray *)groupNames succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 修改好友分组的名称 + * + * @param oldName 原来的分组名称 + * @param newName 新的分组名称 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)renameFriendGroup:(NSString*)oldName newName:(NSString*)newName succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 添加好友到一个好友分组 + * + * @param groupName 好友分组名称 + * @param identifiers 要添加到分组中的好友 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)addFriendsToFriendGroup:(NSString *)groupName users:(NSArray *)identifiers succ:(TIMFriendResultArraySucc)succ fail:(TIMFail)fail; + +/** + * 从好友分组中删除好友 + * + * @param groupName 好友分组名称 + * @param identifiers 要移出分组的好友 + * @param succ 成功回调 + * @param fail 失败回调 + * + * @return 0 发送请求成功 + */ +- (int)deleteFriendsFromFriendGroup:(NSString *)groupName users:(NSArray *)identifiers succ:(TIMFriendResultArraySucc)succ fail:(TIMFail)fail; +@end + +#endif /* TIMFriendshipManager_h */ diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMGroupManager+Ext.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMGroupManager+Ext.h index 06a31fc..739c12e 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMGroupManager+Ext.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMGroupManager+Ext.h @@ -9,7 +9,7 @@ #ifndef TIMGroupManager_Ext_h #define TIMGroupManager_Ext_h -#import "ImSDK.h" +#import "TIMGroupManager.h" #import "TIMComm+Group.h" @interface TIMGroupManager (Ext) @@ -17,158 +17,194 @@ /** * 创建私有群 * + * 创建者默认加入群组,无需显式指定,群组类型形态请参考官网文档 [群组形态介绍](https://cloud.tencent.com/document/product/269/1502#.E7.BE.A4.E7.BB.84.E5.BD.A2.E6.80.81.E4.BB.8B.E7.BB.8D) + * * @param members 群成员,NSString* 数组 * @param groupName 群名 - * @param succ 成功回调 + * @param succ 成功回调 groupId * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)createPrivateGroup:(NSArray*)members groupName:(NSString*)groupName succ:(TIMCreateGroupSucc)succ fail:(TIMFail)fail; /** * 创建公开群 * + * 创建者默认加入群组,无需显式指定,群组类型形态请参考官网文档 [群组形态介绍](https://cloud.tencent.com/document/product/269/1502#.E7.BE.A4.E7.BB.84.E5.BD.A2.E6.80.81.E4.BB.8B.E7.BB.8D) + *get * @param members 群成员,NSString* 数组 * @param groupName 群名 - * @param succ 成功回调 + * @param succ 成功回调 groupId * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)createPublicGroup:(NSArray*)members groupName:(NSString*)groupName succ:(TIMCreateGroupSucc)succ fail:(TIMFail)fail; /** * 创建聊天室 * + * 创建者默认加入群组,无需显式指定,群组类型形态请参考官网文档 [群组形态介绍](https://cloud.tencent.com/document/product/269/1502#.E7.BE.A4.E7.BB.84.E5.BD.A2.E6.80.81.E4.BB.8B.E7.BB.8D) + * * @param members 群成员,NSString* 数组 * @param groupName 群名 - * @param succ 成功回调 + * @param succ 成功回调 groupId * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)createChatRoomGroup:(NSArray*)members groupName:(NSString*)groupName succ:(TIMCreateGroupSucc)succ fail:(TIMFail)fail; /** * 创建音视频聊天室(可支持超大群,详情可参考wiki文档) * + * 创建者默认加入群组,无需显式指定,群组类型形态请参考官网文档 [群组形态介绍](https://cloud.tencent.com/document/product/269/1502#.E7.BE.A4.E7.BB.84.E5.BD.A2.E6.80.81.E4.BB.8B.E7.BB.8D) + * * @param groupName 群名 - * @param succ 成功回调 + * @param succ 成功回调 groupId * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)createAVChatRoomGroup:(NSString*)groupName succ:(TIMCreateGroupSucc)succ fail:(TIMFail)fail; /** - * 创建群组 + * 创建自定义群组 * - * @param groupInfo 群组信息 - * @param succ 成功回调 + * 在创建群组时,除了设置默认的成员以及群名外,还可以设置如群公告、群简介等字段。 + * + * @param groupInfo 群组信息,详情请参考 TIMComm+Group.h 里面的 TIMCreateGroupInfo 定义 + * @param succ 成功回调 groupId * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)createGroup:(TIMCreateGroupInfo*)groupInfo succ:(TIMCreateGroupSucc)succ fail:(TIMFail)fail; /** * 邀请好友入群 * + * 1. 只有私有群可以拉用户入群。 + * 2. 直播大群:不能邀请用户入群。 + * 3. 不允许群成员邀请他人入群,但创建群时可以直接拉人入群。 + * * @param group 群组Id * @param members 要加入的成员列表(NSString* 类型数组) - * @param succ 成功回调 + * @param succ 成功回调 (TIMGroupMemberResult 列表) * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)inviteGroupMember:(NSString*)group members:(NSArray*)members succ:(TIMGroupMemberSucc)succ fail:(TIMFail)fail; /** * 删除群成员 * + * 1. 私有群:只有创建者可删除群组成员。 + * 2. 公开群、聊天室:只有管理员和群主可以踢人。 + * 3. 对于直播大群:不能踢人。 + * * @param group 群组Id * @param reason 删除原因 * @param members 要删除的成员列表 - * @param succ 成功回调 + * @param succ 成功回调 (TIMGroupMemberResult 列表) * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)deleteGroupMemberWithReason:(NSString*)group reason:(NSString*)reason members:(NSArray*)members succ:(TIMGroupMemberSucc)succ fail:(TIMFail)fail; -/** - * 获取群公开信息 - * @param groups 群组Id - * @param succ 成功回调 - * @param fail 失败回调 - * - * @return 0 成功 - */ -- (int)getGroupPublicInfo:(NSArray*)groups succ:(TIMGroupListSucc)succ fail:(TIMFail)fail; /** * 获取群列表 * - * @param succ 成功回调,NSArray列表为 TIMGroupInfo,结构体只包含 group\groupName\groupType\faceUrl\allShutup\selfInfo 信息 + * 1. 可以获取自己所加入的群列表。 + * 2. 只能获得加入的部分直播大群的列表。 + * + * @param succ 成功回调,NSArray 列表为 TIMGroupInfo,结构体只包含 group\groupName\groupType\faceUrl\allShutup\selfInfo 信息 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)getGroupList:(TIMGroupListSucc)succ fail:(TIMFail)fail; /** - * 获取群信息 + * 获取服务器存储的群组信息 * - * @param succ 成功回调,不包含 selfInfo信息 + * 1. 无论是公开群还是私有群,群成员均可以拉到群组信息。 + * 2. 如果是公开群,非群组成员可以拉到 group\groupName\owner\groupType\createTime\maxMemberNum\memberNum\introduction\faceURL\addOpt\onlineMemberNum\customInfo 这些字段信息。如果是私有群,非群组成员拉取不到群组信息。 + * 3. 群成员和非群成员这个接口都拉取不到 selfInfo 信息。 + * 4. 默认拉取基本资料,如果想要拉取自定义字段,首先要通过 [IM 控制台](https://console.cloud.tencent.com/avc) -> 功能配置 -> 群维度自定义字段 配置相关的 key 和权限,然后在 initSDK 的时候把生成的 key 设置在 IMGroupInfoOption 里面的 groupCustom 字段。需要注意的是,只有对自定义字段的 value 做了赋值或则修改,才能拉取到自定义字段。 + * + * @param succ 成功回调,不包含 selfInfo 信息 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)getGroupInfo:(NSArray*)groups succ:(TIMGroupListSucc)succ fail:(TIMFail)fail; /** + * 获取本地存储的群组信息 + * + * 1. 无论是公开群还是私有群,群成员均可以拉到群组信息。 + * 2. 如果是公开群,非群组成员可以拉到 group\groupName\owner\groupType\createTime\maxMemberNum\memberNum\introduction\faceURL\addOpt\onlineMemberNum\customInfo 这些字段信息。如果是私有群,非群组成员拉取不到群组信息。 + * 3. 群成员和非群成员这个接口都拉取不到 selfInfo 信息。 + * + * @return 群组信息 + */ +- (TIMGroupInfo *)queryGroupInfo:(NSString *)group; + +/** * 获取本人在群组内的成员信息 * + * 默认拉取基本资料,如果想要拉取自定义字段,请参考 getGroupInfo + * * @param group 群组Id * @param succ 成功回调,返回信息 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)getGroupSelfInfo:(NSString*)group succ:(TIMGroupSelfSucc)succ fail:(TIMFail)fail; /** * 获取接受消息选项 * - * @param group 群组Id - * @param succ 成功回调 - * @param fail 失败回调 + * @param group 群组Id + * @param succ 成功回调, TIMGroupReceiveMessageOpt 0:接收消息;1:不接收消息,服务器不进行转发;2:接受消息,不进行 iOS APNs 推送 + * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)getReciveMessageOpt:(NSString*)group succ:(TIMGroupReciveMessageOptSucc)succ fail:(TIMFail)fail; /** * 获取群成员列表 * + * 1. 获取群内成员列表,默认拉取内置字段,但不拉取自定义字段,如果想要拉取自定义字段,首先要通过 [IM 控制台](https://console.cloud.tencent.com/avc) -> 功能配置 -> 群维度自定义字段 配置相关的 key 和权限,然后在 initSDK 的时候把生成的 key 设置在 IMGroupInfoOption 里面的 groupCustom 字段。需要注意的是,只有对自定义字段的 value 做了赋值或则修改,才能拉取到自定义字段。 + * 2. 任何群组类型:都可以获取成员列表。 + * 3. 直播大群:只能拉取部分成员(包括群主、管理员和部分成员)。 + * * @param group 群组Id - * @param succ 成功回调(TIMGroupMemberInfo列表) + * @param succ 成功回调 (TIMGroupMemberInfo 列表) * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)getGroupMembers:(NSString*)group succ:(TIMGroupMemberSucc)succ fail:(TIMFail)fail; /** * 获取群组指定成员的信息 * + * 获取群组指定成员的信息,需要设置群成员 members,其他限制参考 getGroupMembers + * * @param group 群组Id * @param members 成员Id(NSString*)列表 - * @param succ 成功回调(TIMGroupMemberInfo列表) + * @param succ 成功回调 (TIMGroupMemberInfo 列表) * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)getGroupMembersInfo:(NSString*)group members:(NSArray*)members succ:(TIMGroupMemberSucc)succ fail:(TIMFail)fail; @@ -179,123 +215,151 @@ * @param filter 群成员角色过滤方式 * @param flags 拉取资料标志 * @param custom 要获取的自定义key(NSString*)列表 - * @param nextSeq 分页拉取标志,第一次拉取填0,回调成功如果不为零,需要分页,传入再次拉取,直至为0 + * @param nextSeq 分页拉取标志,第一次拉取填0,回调成功如果 nextSeq 不为零,需要分页,传入再次拉取,直至为0 * @param succ 成功回调 * @param fail 失败回调 + * @return 0:成功;1:失败 */ - (int)getGroupMembers:(NSString*)group ByFilter:(TIMGroupMemberFilter)filter flags:(TIMGetGroupMemInfoFlag)flags custom:(NSArray*)custom nextSeq:(uint64_t)nextSeq succ:(TIMGroupMemberSuccV2)succ fail:(TIMFail)fail; /** * 修改群名 * + * 1. 公开群、聊天室和直播大群:只有群主或者管理员可以修改群名。 + * 2. 私有群:任何人可修改群名。 + * * @param group 群组Id * @param groupName 新群名 * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupName:(NSString*)group groupName:(NSString*)groupName succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改群简介 * + * 1. 公开群、聊天室、直播大群:只有群主或者管理员可以修改群简介。 + * 2. 私有群:任何人可修改群简介。 + * * @param group 群组Id * @param introduction 群简介(最长120字节) * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupIntroduction:(NSString*)group introduction:(NSString*)introduction succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改群公告 * + * 1. 公开群、聊天室、直播大群:只有群主或者管理员可以修改群公告。 + * 2. 私有群:任何人可修改群公告。 + * * @param group 群组Id * @param notification 群公告(最长150字节) * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupNotification:(NSString*)group notification:(NSString*)notification succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改群头像 * + * 1. 公开群、聊天室、直播大群:只有群主或者管理员可以修改群头像。 + * 2. 私有群:任何人可修改群头像。 + * * @param group 群组Id * @param url 群头像地址(最长100字节) * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupFaceUrl:(NSString*)group url:(NSString*)url succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改加群选项 * + * 1. 公开群、聊天室、直播大群:只有群主或者管理员可以修改加群选项。 + * 2. 私有群:只能通过邀请加入群组,不能主动申请加入某个群组。 + * * @param group 群组Id * @param opt 加群选项,详见 TIMGroupAddOpt * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupAddOpt:(NSString*)group opt:(TIMGroupAddOpt)opt succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改群自定义字段集合 * + * 通过 [IM 控制台](https://console.cloud.tencent.com/avc) -> 功能配置 -> 群维度自定义字段 配置相关的 key 和权限。 + * * @param group 群组Id - * @param customInfo 自定义字段集合,key是NSString*类型,value是NSData*类型 + * @param customInfo 自定义字段集合,key 是 NSString* 类型,value 是 NSData* 类型 * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ -- (int)modifyGroupCustomInfo:(NSString*)group customInfo:(NSDictionary*)customInfo succ:(TIMSucc)succ fail:(TIMFail)fail; +- (int)modifyGroupCustomInfo:(NSString*)group customInfo:(NSDictionary<NSString *,NSData *>*)customInfo succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 转让群给新群主 * + * 1. 只有群主才有权限进行群转让操作。 + * 2. 直播大群不能进行群转让操作。 + * * @param group 群组Id * @param identifier 新的群主Id * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupOwner:(NSString*)group user:(NSString*)identifier succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改接受消息选项 * + * 默认情况下,公开群和私有群是接收并离线推送群消息,聊天室和直播大群是接收但不离线推送群消息。 + * * @param group 群组Id * @param opt 接受消息选项,详见 TIMGroupReceiveMessageOpt * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyReciveMessageOpt:(NSString*)group opt:(TIMGroupReceiveMessageOpt)opt succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改群成员角色 * + * 1. 群主、管理员:可以进行对群成员的身份进行修改。 + * 2. 直播大群:不支持修改用户群内身份。 + * * @param group 群组Id * @param identifier 被修改角色的用户identifier * @param role 角色(注意:不能修改为群主),详见 TIMGroupMemberRole * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupMemberInfoSetRole:(NSString*)group user:(NSString*)identifier role:(TIMGroupMemberRole)role succ:(TIMSucc)succ fail:(TIMFail)fail; /** - * 禁言用户(只有管理员或群主能够调用) + * 禁言用户 + * + * 只有管理员或群主能够调用 * * @param group 群组Id * @param identifier 被禁言的用户identifier @@ -303,12 +367,14 @@ * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupMemberInfoSetSilence:(NSString*)group user:(NSString*)identifier stime:(uint32_t)stime succ:(TIMSucc)succ fail:(TIMFail)fail; /** - * 修改群名片(只有本人、管理员或群主能够调用) + * 修改群名片 + * + * 只有本人、管理员或群主能够调用 * * @param group 群组Id * @param identifier 被操作用户identifier @@ -316,22 +382,24 @@ * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupMemberInfoSetNameCard:(NSString*)group user:(NSString*)identifier nameCard:(NSString*)nameCard succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改群成员自定义字段集合 * - * @param group 群组Id - * @param identifier 被操作用户identifier - * @param customInfo 自定义字段集合,key是NSString*类型,value是NSData*类型 + * 通过 [IM 控制台](https://console.cloud.tencent.com/avc) -> 功能配置 -> 群成员维度自定义字段 配置相关的 key 和权限。 + * + * @param group 群组 Id + * @param identifier 被操作用户 identifier + * @param customInfo 自定义字段集合,key 是 NSString* 类型,value 是 NSData* 类型 * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ -- (int)modifyGroupMemberInfoSetCustomInfo:(NSString*)group user:(NSString*)identifier customInfo:(NSDictionary*)customInfo succ:(TIMSucc)succ fail:(TIMFail)fail; +- (int)modifyGroupMemberInfoSetCustomInfo:(NSString*)group user:(NSString*)identifier customInfo:(NSDictionary<NSString*,NSData*> *)customInfo succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改群组是否可被搜索属性 @@ -341,7 +409,7 @@ * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupSearchable:(NSString*)group searchable:(BOOL)searchable succ:(TIMSucc)succ fail:(TIMFail)fail; @@ -353,55 +421,52 @@ * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupMemberVisible:(NSString*)group visible:(BOOL)visible succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 修改群组全员禁言属性 * + * 1. 群主、管理员:有权限进行全员禁言的操作。 + * 2. 所有群组类型:都支持全员禁言的操作。 + * * @param group 群组Id * @param shutup 是否禁言 * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)modifyGroupAllShutup:(NSString*)group shutup:(BOOL)shutup succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 获取群组未决列表 * + * 1. 群未决消息泛指所有需要审批的群相关的操作(例如:加群待审批,拉人入群待审批等等)。即便审核通过或者拒绝后,该条信息也可通过此接口拉回,拉回的信息中有已决标志 + * 2. 审批人:有权限拉取相关信息,如果 UserA 申请加入群 GroupA,则群管理员可获取此未决相关信息,UserA 因为没有审批权限,不需要拉取未决信息。如果 AdminA 拉 UserA 进去 GroupA,则 UserA 可以拉取此未决相关信息,因为该未决信息待 UserA 审批。 + * * @param option 未决参数配置 * @param succ 成功回调,返回未决列表 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)getPendencyFromServer:(TIMGroupPendencyOption*)option succ:(TIMGetGroupPendencyListSucc)succ fail:(TIMFail)fail; /** * 群未决已读上报 * + * 对于未决信息,SDK 可对其和之前的所有未决信息上报已读。上报已读后,仍然可以拉取到这些未决信息,但可通过对已读时戳的判断判定未决信息是否已读。 + * * @param timestamp 上报已读时间戳 * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)pendencyReport:(uint64_t)timestamp succ:(TIMSucc)succ fail:(TIMFail)fail; -#pragma mark - 开启本地缓存后有效 - -/** - * 获取用户所在群组信息 - * - * @param groups 群组id(NSString*)列表,nil时返回群组列表 - * - * @return 群组信息(TIMGroupInfo*)列表,assistant未同步时返回nil - */ -- (NSArray*)getGroupInfo:(NSArray*)groups; - @end #endif /* TIMGroupManager_Ext_h */ diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMGroupManager.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMGroupManager.h index 373f603..a52e6c4 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMGroupManager.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMGroupManager.h @@ -24,47 +24,63 @@ /** * 创建群组 * + * 1. 默认创建群组时,IM 通讯云服务器会生成一个唯一的 ID,该 ID 将以 @TGS# 开头,且保证在 App 中唯一,以便后续操作。 + * 2. 如果用户需要自定义群组 ID,在创建时可指定 ID,自定义群组 ID 必须为可打印 ASCII 字符(0x20-0x7e),最长 48 个字节,且前缀不能为 @TGS#(避免与默认分配的群组 ID 混淆) + * * @param type 群类型,Private,Public,ChatRoom,AVChatRoom - * @param groupId 自定义群组id,为空时系统自动分配 + * @param groupId 自定义群组 ID,为空时系统自动分配 * @param groupName 群组名称 * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)createGroup:(NSString*)type groupId:(NSString*)groupId groupName:(NSString*)groupName succ:(TIMCreateGroupSucc)succ fail:(TIMFail)fail; /** * 解散群组 * + * 1. 私有群:任何人都无法解散群组 + * 2. 公开群、聊天室、直播大群:群主可以解散群组。 + * * @param group 群组Id * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)deleteGroup:(NSString*)group succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 申请加群 * + * 1. 私有群:不能由用户主动申请入群。 + * 2. 公开群、聊天室:可以主动申请进入。 + * 3. 直播大群:可以任意加入群组。 + * 4. 如果群组设置为需要审核,申请入群后管理员和群主会收到申请入群系统消息 TIMGroupSystemElem,判断 TIMGroupSystemElem 的 Type 类型如果是 TIM_GROUP_SYSTEM_ADD_GROUP_REQUEST_TYPE ,调用消息的 accept 接口同意入群,申请人会收到同意入群的消息 TIMGroupSystemElem(Type:TIM_GROUP_SYSTEM_ADD_GROUP_ACCEPT_TYPE),调用 refuse 接口拒绝入群,申请人会收到拒绝入群的消息 TIMGroupSystemElem(Type:TIM_GROUP_SYSTEM_ADD_GROUP_REFUSE_TYPE)。 + * 5. 如果群主设置为任何人可加入,则直接入群成功。 + * * @param group 申请加入的群组Id * @param msg 申请消息 * @param succ 成功回调(申请成功等待审批) * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)joinGroup:(NSString*)group msg:(NSString*)msg succ:(TIMSucc)succ fail:(TIMFail)fail; /** * 主动退出群组 * + * 1. 私有群:全员可退出群组。 + * 2. 公开群、聊天室、直播大群:群主不能退出。 + * 3. 当用户主动退出群组时,该用户会收到退群消息 TIMGroupSystemElem(Type:TIM_GROUP_SYSTEM_QUIT_GROUP_TYPE),只有退群的用户自己可以收到。当用户调用 QuitGroup 时成功回调返回,表示已退出成功,此消息主要为了多终端同步,其他终端可以作为更新群列表的时机,本终端可以选择忽略。 + * * @param group 群组Id * @param succ 成功回调 * @param fail 失败回调 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)quitGroup:(NSString*)group succ:(TIMSucc)succ fail:(TIMFail)fail; diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMManager+MsgExt.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMManager+MsgExt.h index 6e1f790..1fea3c0 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMManager+MsgExt.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMManager+MsgExt.h @@ -9,7 +9,7 @@ #ifndef TIMManager_MsgExt_h #define TIMManager_MsgExt_h -#import "ImSDK.h" +#import "TIMManager.h" #import "TIMComm+MsgExt.h" @class TIMMessage; @@ -38,20 +38,22 @@ /** * 删除会话 * - * @param type 会话类型,TIM_C2C 表示单聊 TIM_GROUP 表示群聊 - * @param receiver 用户identifier 或者 群组Id + * @param type 会话类型,TIM_C2C:表示单聊;TIM_GROUP:表示群聊 + * @param receiver 用户 identifier 或者群组 Id * - * @return TRUE:删除成功 FALSE:删除失败 + * @return TRUE:删除成功;FALSE:删除失败 */ - (BOOL)deleteConversation:(TIMConversationType)type receiver:(NSString*)receiver; /** * 删除会话和消息 * - * @param type 会话类型,TIM_C2C 表示单聊 TIM_GROUP 表示群聊 - * @param receiver 用户identifier 或者 群组Id + * 这里只是删除本地消息,通过 getMessage 会拉取到漫游消息,所以存在删除消息成功,但是拉取到消息的情况,取决于是否重新从漫游拉回到本地。如果不需要拉取漫游,可以通过 getLocalMessage 获取本地消息,或者只通过 getMessage 拉取指定条数(如未读条数数量)的消息。 * - * @return TRUE:删除成功 FALSE:删除失败 + * @param type 会话类型,TIM_C2C:表示单聊;TIM_GROUP:表示群聊 + * @param receiver 用户identifier 或者 群组 Id + * + * @return TRUE:删除成功;FALSE:删除失败 */ - (BOOL)deleteConversationAndMessages:(TIMConversationType)type receiver:(NSString*)receiver; @@ -63,13 +65,15 @@ - (int)conversationCount; /** - * 初始化存储,仅查看历史消息时使用,如果要收发消息等操作,如login成功,不需要调用此函数 + * 初始化存储 + * + * 仅查看历史消息时使用,如果要收发消息等操作,如login成功,不需要调用此函数 * - * @param param 登陆参数(userSig 不用填写) + * @param param 登陆参数(identifier 必须填写,userSig 不用填写) * @param succ 成功回调,收到回调时,可以获取会话列表和消息 * @param fail 失败回调 * - * @return 0 请求成功 + * @return 0:请求成功;1:请求失败,identifier 为 nil 或则用户已登录 */ - (int)initStorage:(TIMLoginParam*)param succ:(TIMLoginSucc)succ fail:(TIMFail)fail; diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMManager.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMManager.h index 76a40e6..3318e62 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMManager.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMManager.h @@ -13,7 +13,7 @@ #import "TIMCallback.h" @class TIMGroupManager; -//@class TIMFriendshipManager; +@class TIMFriendshipManager; ///////////////////////////////////////////////////////// /// Tencent 开放 SDK API @@ -23,256 +23,337 @@ * 通讯管理 */ @interface TIMManager : NSObject + +///////////////////////////////////////////////////////////////////////////////// +// +// (一)初始化相关接口函数 +// +///////////////////////////////////////////////////////////////////////////////// - +/// @name 初始化相关接口 +/// @{ /** - * 获取管理器实例 + * 1.1 获取管理器实例 TIMManager * * @return 管理器实例 */ + (TIMManager*)sharedInstance; /** - * 初始化SDK + * 1.2 初始化 SDK,设置全局配置信息 * - * @param config 配置信息,全局有效 + * 初始化 SDK 需要设置 TIMSdkConfig 信息,TIMSdkConfig 主要包含 sdkAppId 设置、Log 相关逻辑设置、数据库存储路径设置、网络监听设置等,其中 sdkAppId 的获取请参考官网文档 [跑通Demo(iOS与Mac)](https://cloud.tencent.com/document/product/269/32674)。 * - * @return 0 成功 + * @param config 配置信息,全局有效,详情请参考 TIMComm.h 中的 TIMSdkConfig 定义 + * + * @return 0:成功;1:失败,config 为 nil */ - (int)initSdk:(TIMSdkConfig*)config; /** - * 获取全局配置 + * 1.3 获取全局配置信息 + * + * 获取初始化 SDK 时候设置的 TIMSdkConfig,方便客户在上层做相关业务逻辑。 * - * @return 全局配置 + * @return 全局配置,详情请参考 TIMComm.h 中的 TIMSdkConfig 定义 */ - (TIMSdkConfig*)getGlobalConfig; /** - * 初始化当前manager,在initSdk:后调用,login:前调用 + * 1.4 设置用户配置信息 + * + * 1. setUserConfig 要在 initSdk 之后,login 之前,主要用来开启/关闭自动已读上报和已读回执,设置默认拉取的群组资料,群成员资料字段,监听用户登录状态、会话刷新、消息已读回执、文件上传进度、群组事件通知。 + * 2. 自动已读上报默认是开启的,当客户端收到一条未读消息后,Server 默认会删除这条未读消息,切换终端以后无法看到之前终端已经拉回的未读消息,如果需要多终端情况下仍然会有未读,请设置 TIMUserConfig 中的 disableAutoReport 为 YES,一旦禁用自动上报,开发者需要显式调用 setReadMessage,详情请参考官方文档 [未读消息计数](https://cloud.tencent.com/document/product/269/9151)。 + * 3. C2C 已读回执默认是关闭的,如果需要开启,请设置 TIMUserConfig 中的 enableReadReceipt 为 YES,收到消息的用户需要显式调用 setReadMessage,发消息的用户才能通过 TIMMessageReceiptListener 监听到消息的已读回执。 + * 4. 当您获取群资料的时候,默认只能拉取内置字段,如果想要拉取自定义字段,首先要通过 [IM 控制台](https://console.cloud.tencent.com/avc) -> 功能配置 -> 群维度自定义字段 配置相关的 key 和权限,然后把生成的 key 设置在 IMGroupInfoOption 里面的 groupCustom 字段。需要注意的是,只有对自定义字段 value 做了赋值或则修改,才能拉取到自定义字段。 + * 5. 当您获取群成员资料的时候,默认只能拉取内置字段,如果想要拉取自定义字段,首先要通过 [IM 控制台](https://console.cloud.tencent.com/avc) -> 功能配置 -> 群成员维度自定义字段配置相关的 key 和权限,然后把生成的 key 设置在 TIMGroupMemberInfoOption 里面的 memberCustom 字段。需要注意的是,只有对自定义字段的 value 做了赋值或则修改,才能拉取到自定义字段。 * - * @param config 配置信息,对当前TIMManager有效 + * @param config 配置信息,对当前 TIMManager 有效,详情请参考 TIMComm.h 中的 TIMUserConfig 定义 * - * @return 0 成功 + * @return 0:成功;1:失败,config 为 nil */ - (int)setUserConfig:(TIMUserConfig*)config; /** - * 获取当前manager绑定用户的配置 + * 1.5 获取用户配置信息 * - * @return 当前manager绑定用户的配置 + * 获取设置的用户配置信息 TIMSdkConfig,方便客户在上层做相关业务逻辑。 + * + * @return 当前 manager 绑定用户的配置,详情请参考 TIMComm.h 中的 TIMUserConfig 定义 */ - (TIMUserConfig*)getUserConfig; /** - * 添加消息回调(重复添加无效) + * 1.6 添加消息监听(重复添加无效) + * + * 添加消息监听后,会在 TIMMessageListener 的 onNewMessage 收到回调消息,消息内容通过参数 TIMMessage 传递,通过 TIMMessage 可以获取消息和相关会话的详细信息,如消息文本,语音数据,图片等。详细可参阅 [消息解析](https://cloud.tencent.com/document/product/269/9150#.E6.B6.88.E6.81.AF.E8.A7.A3.E6.9E.90) 部分。 * - * @param listener 回调 + * @param listener 回调,详情请参考 TIMCallback.h 中的 TIMMessageListener 定义 * - * @return 成功 + * @return 0:成功;1:失败,listener 为 nil */ - (int)addMessageListener:(id<TIMMessageListener>)listener; /** - * 移除消息回调 + * 1.7 移除消息监听 * - * @param listener 回调 + * @param listener 回调,详情请参考 TIMCallback.h 中的 TIMMessageListener 定义 * - * @return 成功 + * @return 0:成功;1:失败,listener 为 nil */ - (int)removeMessageListener:(id<TIMMessageListener>)listener; +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (二)登录相关接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 登录相关接口 +/// @{ /** - * 登陆 + * 2.1 登录 * - * @param param 登陆参数 - * @param succ 成功回调 - * @param fail 失败回调 + * 1. 登录需要设置用户名 identifier 和用户签名 userSig,userSig 的生成请参考官网文档 [UserSig 后台 API](https://cloud.tencent.com/document/product/269/32688)。 + * 2. 如果 userSig 过期,登录会返回 ERR_USER_SIG_EXPIRED:6206 错误码,收到错误码后请生成新的 userSig 重新登录。 + * 3. 用户在线情况下被踢,会在 TIMUserConfig 里面配置的 TIMUserStatusListener 监听器获取 onForceOffline 回调,收到回调后可以选择重新登录。 + * 4. 用户离线状态下被踢,由于此时用户不在线,无法感知此事件,为了显式提醒用户,用户重新登录时,会返回 ERR_IMSDK_KICKED_BY_OTHERS:6208 错误码,表明之前被踢,如果需要把对方踢下线,再次调用 login 强制上线,更多详情请参考 [用户状态变更](https://cloud.tencent.com/document/product/269/9148#5.-.E7.94.A8.E6.88.B7.E7.8A.B6.E6.80.81.E5.8F.98.E6.9B.B4)。 * - * @return 0 请求成功 + * @param param 登陆参数,详情请参考 TIMComm.h 中的 TIMLoginParam 定义 + * @param succ 成功回调,详情请参考 TIMComm.h 中的 TIMLoginSucc 定义 + * @param fail 失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义 + * + * @return 0:成功;1:失败,请检查 param 参数是否正常 */ - (int)login: (TIMLoginParam*)param succ:(TIMLoginSucc)succ fail:(TIMFail)fail; /** - * 获取当前登陆的用户 + * 2.2 自动登录 * - * @return 如果登陆返回用户的identifier,如果未登录返回nil - */ -- (NSString*)getLoginUser; - -/** - * 获取当前登录状态 + * 1. 首次登陆之后,SDK 会把登陆信息存在在本地,下次登陆即可调用自动登录 + * 2. 如果用户之前没有登录过,或则 APP 被卸载过,自动登录会报 ERR_NO_PREVIOUS_LOGIN:6026 错误,这个时候请调用 login 接口重新登录。 + * + * @param param 登陆参数( userSig 不用填),详情请参考 TIMComm.h 中的 TIMLoginParam 定义 + * @param succ 成功回调,详情请参考 TIMComm.h 中的 TIMLoginSucc 定义 + * @param fail 失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义 * - * @return 登录状态 + * @return 0:成功;1:失败,请检查 param 参数是否正常 */ -- (TIMLoginStatus)getLoginStatus; +- (int)autoLogin:(TIMLoginParam*)param succ:(TIMLoginSucc)succ fail:(TIMFail)fail; /** - * 登出 + * 2.3 登出 + * + * 退出登录,如果切换账号,需要 logout 回调成功或者失败后才能再次 login,否则 login 可能会失败。 * * @param succ 成功回调,登出成功 * @param fail 失败回调,返回错误吗和错误信息 * - * @return 0 发送登出包成功,等待回调 + * @return 0:发送登出包成功,等待回调;1:失败 */ - (int)logout:(TIMLoginSucc)succ fail:(TIMFail)fail; -#pragma mark - 消息会话操作 - /** - * 获取会话 + * 2.4 获取当前登陆的用户 * - * @param type 会话类型,TIM_C2C 表示单聊 TIM_GROUP 表示群聊 - * TIM_SYSTEM 表示系统会话 - * @param receiver C2C 为对方用户 identifier,GROUP 为群组Id,SYSTEM为@"" - * - * @return 会话对象 + * @return 如果登陆返回用户的 identifier,如果未登录返回 nil */ -- (TIMConversation*)getConversation:(TIMConversationType)type receiver:(NSString*)receiver; - -#pragma mark - APNs推送 +- (NSString*)getLoginUser; /** - * 设置Token,需要登录后调用 - * - * @param token token信息 - * @param succ 成功回调 - * @param fail 失败回调 + * 2.5 获取当前登录状态 * - * @return 0 成功 + * @return 登录状态,详情请参考 TIMComm.h 中的 TIMLoginStatus 定义 */ -- (int)setToken:(TIMTokenParam*)token succ:(TIMSucc)succ fail:(TIMFail)fail; +- (TIMLoginStatus)getLoginStatus; -/** - * 设置APNS配置 - * - * @param config APNS配置 - * @param succ 成功回调 - * @param fail 失败回调 - * - * @return 0 成功 - */ -- (int)setAPNS:(TIMAPNSConfig*)config succ:(TIMSucc)succ fail:(TIMFail)fail; +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (三)获取会话管理器 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 获取会话管理器 +/// @{ /** - * 获取APNS配置 + * 获取会话管理器 * - * @param succ 成功回调,返回配置信息 - * @param fail 失败回调 + * TIMConversation 负责会话相关操作,包含发送消息、获取会话消息缓存、获取未读计数等。 * - * @return 0 成功 + * @param type 会话类型,TIM_C2C:单聊;TIM_GROUP:群聊;TIM_SYSTEM:系统会话 + * @param receiver 会话接收者,C2C:为对方用户;identifier;GROUP:群组 Id;SYSTEM:@"" + * + * @return 会话对象,详情请参考 TIMConversation.h 里面的 TIMConversation 定义 */ -- (int)getAPNSConfig:(TIMAPNSConfigSucc)succ fail:(TIMFail)fail; +- (TIMConversation*)getConversation:(TIMConversationType)type receiver:(NSString*)receiver; +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (四)获取群管理器 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 获取群管理器 +/// @{ /** - * app 切后台时调用 + * 获取群管理器 * - * @param param 上报参数 - * @param succ 成功时回调 - * @param fail 失败时回调 + * TIMGroupManager 负责创建群、增删成员、以及修改群资料等 * - * @return 0 表示成功 + * @return 群管理器,详情请参考 TIMGroupManager.h 中的 TIMGroupManager 定义 */ -- (int)doBackground:(TIMBackgroundParam*)param succ:(TIMSucc)succ fail:(TIMFail)fail; +- (TIMGroupManager*)groupManager; +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (五)获取好友管理器 +// +///////////////////////////////////////////////////////////////////////////////// +///@name 获取好友管理器 +/// @{ /** - * 切前台 + * 获取好友管理器 * - * @param succ 成功时回调 - * @param fail 失败时回调 + * TIMFriendshipManager 负责加好友,删除好友,查询好友列表等 * - * @return 0 表示成功 + * @return 好友管理器,详情请参考 TIMFriendshipManager.h 中的 TIMFriendshipManager 定义 */ -- (int)doForeground:(TIMSucc)succ fail:(TIMFail)fail; - -#pragma mark - 调试使用 +- (TIMFriendshipManager*)friendshipManager; -/** - * 获取网络状态 - */ -- (TIMNetworkStatus)networkStatus; +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (六)设置 APNs 推送 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 设置 APNs 推送 +/// @{ /** - * 设置环境(在InitSdk之前调用,注意:除非是IM工作人员指定要求设置,否则不需要调用此接口) + * 6.1. 设置客户端 Token 和证书 busiId + * + * 1. token 是向苹果后台请求 DeviceToken,具体实现请参考 appdelegate.h 里面的 registNotification。 + * 2. busiId 是向 IM 控制台上传 iOS 证书(p.12)生成的,具体步骤请参考 [离线推送](https://cloud.tencent.com/document/product/269/9154)。 + * + * @param token 详情请参考 TIMComm.h 中的 TIMTokenParam 定义 + * @param succ 成功回调,详情请参考 TIMComm.h 中的 TIMSucc 定义 + * @param fail 失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义 * - * @param env 0 正式环境(默认) - * 1 测试环境 + * @return 0:成功;1:失败,token 参数异常 */ -- (void)setEnv:(int)env; +- (int)setToken:(TIMTokenParam*)token succ:(TIMSucc)succ fail:(TIMFail)fail; /** - * 获取环境类型 + * 6.2. 设置推送声音 + * + * 不同用户可能想使用不同的推送声音,TIMAPNSConfig 提供了设置用户声音的字段,可实现单聊声音、群组声音的设置,也可在用户级别设置是否开启推送。 + * + * @param config APNS 配置,详情请参考 TIMComm.h 中的 TIMAPNSConfig 定义 + * @param succ 成功回调,详情请参考 TIMComm.h 中的 TIMSucc 定义 + * @param fail 失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义 * - * @return env 0 正式环境(默认) - * 1 测试环境 - * 2 beta 环境 + * @return 0:成功;1:失败,config 参数异常 */ -- (int)getEnv; +- (int)setAPNS:(TIMAPNSConfig*)config succ:(TIMSucc)succ fail:(TIMFail)fail; /** - * 获取版本号 + * 6.3. 获取推送声音设置 + * + * @param succ 成功回调,返回配置信息,详情请参考 TIMComm.h 中的 TIMAPNSConfigSucc 定义 + * @param fail 失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义 * - * @return 返回版本号,字符串表示,例如v1.1.1 + * @return 0:成功;1:失败 */ -- (NSString*)GetVersion; +- (int)getAPNSConfig:(TIMAPNSConfigSucc)succ fail:(TIMFail)fail; /** - * 获取联网SDK的版本号 + * 6.4. APP 进后台 + * + * APP 进后台的时候需要主动调用 doBackground ,这个时候后台知道 APP 的状态,之后的消息会下发推送通知。 * - * @return 返回版本号 + * @param param 上报参数,详情请参考 TIMComm.h 中的 TIMBackgroundParam 定义 + * @param succ 成功时回调,详情请参考 TIMComm.h 中的 TIMSucc 定义 + * @param fail 失败时回调,详情请参考 TIMComm.h 中的 TIMFail 定义 + * + * @return 0:成功;1:失败 */ -- (NSString*)GetQALVersion; +- (int)doBackground:(TIMBackgroundParam*)param succ:(TIMSucc)succ fail:(TIMFail)fail; + /** - * 打印日志,通过ImSDK提供的日志功能打印日志 + * 6.5. APP 进后台 * - * @param level 日志级别 - * @param tag 模块tag - * @param msg 要输出的日志内容 + * APP 进前台的时候需要主动调用 doForeground。 + * + * @param succ 成功时回调,详情请参考 TIMComm.h 中的 TIMSucc 定义 + * @param fail 失败时回调,详情请参考 TIMComm.h 中的 TIMFail 定义 + * + * @return 0:成功;1:失败 */ -- (void)log:(TIMLogLevel)level tag:(NSString*)tag msg:(NSString*)msg; +- (int)doForeground:(TIMSucc)succ fail:(TIMFail)fail; -#pragma mark - 登录多账号 +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (七)多账号登录接口 +// +///////////////////////////////////////////////////////////////////////////////// +///@name 多账号登录接口 +/// @{ /** - * 创建新的管理器类型(多用户登陆时使用,否则可直接调用sharedInstance) + * 创建新的管理器类型(多用户登陆时使用,否则可直接调用 sharedInstance) * * @return 管理器实例 */ + (TIMManager*)newManager; /** - * 获取管理器类型(多用户登陆时使用,否则可直接调用sharedInstance) + * 获取管理器类型(多用户登陆时使用,否则可直接调用 sharedInstance) * - * @param identifier 用户identifier + * @param identifier 用户 identifier * - * @return 对应管理器类型,如果没有创建过,返回nil + * @return 对应管理器类型,如果没有创建过,返回 nil */ + (TIMManager*)getManager:(NSString*)identifier; /** - * 销毁管理器(多用户登陆时使用,否则可直接调用sharedInstance) + * 销毁管理器(多用户登陆时使用,否则可直接调用 sharedInstance) * * @param manager 需要销毁的管理器 */ + (void)deleteManager:(TIMManager*)manager; +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (八)调试相关接口 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 调试相关接口 +/// @{ /** - * 获取好友管理器 + * 获取版本号 * - * @return 好友管理器 + * @return 返回版本号,字符串表示,例如 v1.1.1 */ -//- (TIMFriendshipManager*)friendshipManager; +- (NSString*)GetVersion; /** - * 获取群管理器 + * 打印日志,通过 ImSDK 提供的日志功能打印日志 * - * @return 群管理器 + * @param level 日志级别,详情请参考 TIMComm.h 中的 TIMLogLevel 定义 + * @param tag 模块 tag + * @param msg 要输出的日志内容 */ -- (TIMGroupManager*)groupManager; - -#pragma mark - 内部使用的方法 +- (void)log:(TIMLogLevel)level tag:(NSString*)tag msg:(NSString*)msg; /** * 获取日志文件路径 @@ -280,15 +361,25 @@ - (NSString*)getLogPath; /** - * 是否开启sdk日志打印 + * 是否开启 sdk 日志打印 + * + * @return YES:允许 log 打印;NO:不允许 log 打印 */ - (BOOL)getIsLogPrintEnabled; /** * 获取日志级别 * - * @return 返回日志级别 + * @return 返回日志级别,详情请参考 TIMComm.h 中的 TIMLogLevel 定义 */ -(TIMLogLevel) getLogLevel; + +/** + * 重置ImSDK配置信息,内部自动化测试使用 + */ +- (void)unInit; + +///@} + @end #endif diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMMessage+MsgExt.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMMessage+MsgExt.h index cbb167b..417fbad 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMMessage+MsgExt.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMMessage+MsgExt.h @@ -9,14 +9,18 @@ #ifndef TIMMessage_h #define TIMMessage_h -#import "ImSDK.h" +#import "TIMMessage.h" #import "TIMComm+MsgExt.h" #pragma mark - Elem类型 -/** - * 关系链变更消息 - */ +///////////////////////////////////////////////////////////////////////////////// +// +// (一)关系链变更消息 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 关系链变更消息 +/// @{ @interface TIMSNSSystemElem : TIMElem /** @@ -30,25 +34,31 @@ @property(nonatomic,strong) NSArray * users; /** - * 未决已读上报时间戳 type=TIM_SNS_SYSTEM_PENDENCY_REPORT 有效 + * 未决已读上报时间戳 type = TIM_SNS_SYSTEM_PENDENCY_REPORT 有效 */ @property(nonatomic,assign) uint64_t pendencyReportTimestamp; /** - * 推荐已读上报时间戳 type=TIM_SNS_SYSTEM_RECOMMEND_REPORT 有效 + * 推荐已读上报时间戳 type = TIM_SNS_SYSTEM_RECOMMEND_REPORT 有效 */ @property(nonatomic,assign) uint64_t recommendReportTimestamp; /** - * 已决已读上报时间戳 type=TIM_SNS_SYSTEM_DECIDE_REPORT 有效 + * 已决已读上报时间戳 type = TIM_SNS_SYSTEM_DECIDE_REPORT 有效 */ @property(nonatomic,assign) uint64_t decideReportTimestamp; @end -/** - * 资料变更系统消息 - */ +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (二)资料变更消息 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 资料变更消息 +/// @{ @interface TIMProfileSystemElem : TIMElem /** @@ -62,72 +72,78 @@ @property(nonatomic,strong) NSString * fromUser; /** - * 资料变更的昵称(如果昵称没有变更,该值为nil) + * 资料变更的昵称(暂未实现) */ @property(nonatomic,strong) NSString * nickName; @end -#pragma mark - 消息扩展 +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (三)消息扩展接口 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 消息扩展接口 +/// @{ @interface TIMMessage (MsgExt) /** - * 是否已读 + * 自己是否已读 * - * @return TRUE 已读 FALSE 未读 + * @return TRUE:已读;FALSE:未读 */ - (BOOL)isReaded; /** - * 对方是否已读(仅C2C消息有效) + * 对方是否已读(仅 C2C 消息有效) * - * @return TRUE 已读 FALSE 未读 + * @return TRUE:已读;FALSE:未读 */ - (BOOL)isPeerReaded; /** * 删除消息 * - * @return TRUE 成功 + * 目前暂不支持 Server 消息删除,只能在本地删除。删除后使用 getMessage 拉取本地消息,不会返回被删除的消息。 + * + * @return TRUE:成功;FALSE:失败 */ - (BOOL)remove; /** - * 消息有断层,OnNewMessage回调收到消息,如果有断层,需要重新GetMessage补全(有C2C漫游的情况下使用) + * 设置自定义整数,默认为 0 * - * @return TRUE 有断层 - * FALSE 无断层 - */ -- (BOOL)hasGap; - -/** - * 设置自定义整数,默认为0 + * 1.此自定义字段仅存储于本地,不会同步到 Server,用户卸载应用或则更换终端后无法获取。 + * 2.可以根据这个字段设置语音消息是否已经播放,如 customInt 的值 0 表示未播放,1 表示播放,当用户单击播放后可设置 customInt 的值为 1。 * * @param param 设置参数 * - * @return TRUE 设置成功 + * @return TRUE:设置成功;FALSE:设置失败 */ - (BOOL)setCustomInt:(int32_t)param; /** * 设置自定义数据,默认为"" * + * 此自定义字段仅存储于本地,不会同步到 Server,用户卸载应用或则更换终端后无法获取。 + * * @param data 设置参数 * - * @return TRUE 设置成功 + * @return TRUE:设置成功;FALSE:设置失败 */ - (BOOL)setCustomData:(NSData*)data; /** - * 获取CustomInt + * 获取 CustomInt * * @return CustomInt */ - (int32_t)customInt; /** - * 获取CustomData + * 获取 CustomData * * @return CustomData */ @@ -136,12 +152,14 @@ /** * 获取消息定位符 * - * @return locator + * 如果是自己创建的 TIMMessage,需要等到消息发送成功后才能获取到 TIMMessageLocator 里面的具体信息 + * + * @return locator,详情请参考 TIMComm.h 里面的 TIMMessageLocator 定义 */ - (TIMMessageLocator*)locator; /** - * 是否为locator对应的消息 + * 是否为 locator 对应的消息 * * @param locator 消息定位符 * @@ -150,35 +168,47 @@ - (BOOL)respondsToLocator:(TIMMessageLocator*)locator; /** - * 设置消息时间戳,导入到本地时有效 + * 设置消息时间戳 + * + * 需要先将消息到导入到本地,调用 convertToImportedMsg 方法 * * @param time 时间戳 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)setTime:(time_t)time; /** - * 设置消息发送方(需要先将消息到导入到本地,调用 convertToImportedMsg 方法) - + * 设置消息发送方 + * + * 需要先将消息到导入到本地,调用 convertToImportedMsg 方法 * * @param sender 发送方Id * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)setSender:(NSString*)sender; /** * 将消息导入到本地 * - * @return 0 成功 + * 只有调用这个接口,才能去修改消息的时间戳和发送方 + * + * @return 0:成功;1:失败 */ - (int)convertToImportedMsg; -@end +/// @} -#pragma mark - 消息草稿 +@end +///////////////////////////////////////////////////////////////////////////////// +// +// (四)草稿箱 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 草稿箱 +/// @{ @interface TIMMessageDraft : NSObject /** @@ -186,7 +216,7 @@ * * @param userData 自定义数据 * - * @return 0 成功 + * @return 0:成功;1:失败 */ - (int)setUserData:(NSData*)userData; @@ -202,18 +232,17 @@ * * @param elem elem结构 * - * @return 0 表示成功 - * 1 禁止添加Elem(文件或语音多于两个Elem) - * 2 未知Elem + * @return 0:表示成功;1:禁止添加Elem(文件或语音多于两个Elem);2:未知Elem + * */ - (int)addElem:(TIMElem*)elem; /** - * 获取对应索引的Elem + * 获取对应索引的 Elem * * @param index 对应索引 * - * @return 返回对应Elem + * @return 返回对应 Elem */ - (TIMElem*)getElem:(int)index; @@ -227,7 +256,7 @@ /** * 草稿生成对应的消息 * - * @return 消息 + * @return 消息,详情请参考 TIMMessage.h 里面的 TIMMessage 定义 */ - (TIMMessage*)transformToMessage; @@ -238,6 +267,8 @@ */ - (NSDate*)timestamp; +/// @} + @end #endif /* TIMMessage_h */ diff --git a/HHVDoctorSDK/ImSDK.framework/Headers/TIMMessage.h b/HHVDoctorSDK/ImSDK.framework/Headers/TIMMessage.h index 61c482a..5d9ef20 100755 --- a/HHVDoctorSDK/ImSDK.framework/Headers/TIMMessage.h +++ b/HHVDoctorSDK/ImSDK.framework/Headers/TIMMessage.h @@ -18,15 +18,29 @@ @class TIMUserProfile; @class TIMGroupMemberInfo; @class TIMConversation; +@class TIMSnapshot; +///////////////////////////////////////////////////////////////////////////////// +// +// (一)消息基类 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 消息基类 /** - * 消息Elem基类 + * 消息 Elem 基类 */ @interface TIMElem : NSObject @end +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (二)文本消息 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 文本消息 /** - * 文本消息Elem + * 文本消息 Elem */ @interface TIMTextElem : TIMElem /** @@ -34,12 +48,20 @@ */ @property(nonatomic,strong) NSString * text; @end +/// @} -#pragma mark - 普通消息类型 - +///////////////////////////////////////////////////////////////////////////////// +// +// (三)图片消息 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 图片消息 +/** + * 图片 + */ @interface TIMImage : NSObject /** - * 图片ID,内部标识,可用于外部缓存key + * 图片 ID,内部标识,可用于外部缓存key */ @property(nonatomic,strong) NSString * uuid; /** @@ -66,16 +88,28 @@ /** * 获取图片 * + * 下载的数据需要由开发者缓存,IM SDK 每次调用 getImage 都会从服务端重新下载数据。建议通过图片的 uuid 作为 key 进行图片文件的存储。 + * * @param path 图片保存路径 * @param succ 成功回调,返回图片数据 * @param fail 失败回调,返回错误码和错误描述 */ - (void)getImage:(NSString*)path succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 获取图片(有进度回调) + * + * 下载的数据需要由开发者缓存,IM SDK 每次调用 getImage 都会从服务端重新下载数据。建议通过图片的 uuid 作为 key 进行图片文件的存储。 + * + * @param path 图片保存路径 + * @param progress 图片下载进度 + * @param succ 成功回调,返回图片数据 + * @param fail 失败回调,返回错误码和错误描述 + */ - (void)getImage:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; @end - /** * 图片消息Elem */ @@ -87,17 +121,17 @@ @property(nonatomic,strong) NSString * path; /** - * 所有类型图片,只读 + * 所有类型图片,只读,发送的时候不用关注,接收的时候这个字段会保存图片的所有规格,目前最多包含三种规格:原图、大图、缩略图,每种规格保存在一个 TIMImage 对象中 */ @property(nonatomic,strong) NSArray * imageList; /** - * 上传时任务Id,可用来查询上传进度 + * 上传时任务 ID,可用来查询上传进度(已废弃,请在 TIMUploadProgressListener 监听上传进度) */ -@property(nonatomic,assign) uint32_t taskId; +@property(nonatomic,assign) uint32_t taskId DEPRECATED_ATTRIBUTE; /** - * 图片压缩等级,详见 TIM_IMAGE_COMPRESS_TYPE(仅对jpg格式有效) + * 图片压缩等级,详见 TIM_IMAGE_COMPRESS_TYPE(仅对 jpg 格式有效) */ @property(nonatomic,assign) TIM_IMAGE_COMPRESS_TYPE level; @@ -108,124 +142,224 @@ @end +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (四)语音消息 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 语音消息 /** - * 文件消息Elem + * 语音消息Elem + * + * 1. 一条消息只能有一个语音 Elem,添加多条语音 Elem 时,AddElem 函数返回错误 1,添加不生效。 + * 2. 语音和文件 Elem 不一定会按照添加时的顺序获取,建议逐个判断 Elem 类型展示,而且语音和文件 Elem 也不保证按照发送的 Elem 顺序排序。 + * */ -@interface TIMFileElem : TIMElem +@interface TIMSoundElem : TIMElem /** - * 上传时任务Id,可用来查询上传进度 + * 上传时任务 ID,可用来查询上传进度(已废弃,请在 TIMUploadProgressListener 监听上传进度) */ -@property(nonatomic,assign) uint32_t taskId; +@property(nonatomic,assign) uint32_t taskId DEPRECATED_ATTRIBUTE; /** - * 上传时,文件的路径(设置path时,优先上传文件) + * 上传时,语音文件的路径,接收时使用 getSound 获得数据 */ @property(nonatomic,strong) NSString * path; /** - * 文件内部ID + * 语音消息内部 ID */ @property(nonatomic,strong) NSString * uuid; /** - * 文件大小 + * 语音数据大小 */ -@property(nonatomic,assign) int fileSize; +@property(nonatomic,assign) int dataSize; /** - * 文件显示名,发消息时设置 + * 语音长度(秒),发送消息时设置 */ -@property(nonatomic,strong) NSString * filename; +@property(nonatomic,assign) int second; /** - * 获取文件数据到指定路径的文件中 + * 获取语音数据到指定路径的文件中 * - * @param path 文件保存路径 - * @param succ 成功回调,返回数据 + * getSound 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。 + * + * @param path 语音保存路径 + * @param succ 成功回调 * @param fail 失败回调,返回错误码和错误描述 */ -- (void)getFile:(NSString*)path succ:(TIMSucc)succ fail:(TIMFail)fail; -- (void)getFile:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; +- (void)getSound:(NSString*)path succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 获取语音数据到指定路径的文件中(有进度回调) + * + * getSound 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。 + * + * @param path 语音保存路径 + * @param progress 语音下载进度 + * @param succ 成功回调 + * @param fail 失败回调,返回错误码和错误描述 + */ +- (void)getSound:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; @end +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (五)视频消息 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 视频消息 /** - * 语音消息Elem + * 视频 */ -@interface TIMSoundElem : TIMElem +@interface TIMVideo : NSObject /** - * 上传时任务Id,可用来查询上传进度 + * 视频消息内部 ID,不用设置 */ -@property(nonatomic,assign) uint32_t taskId; +@property(nonatomic,strong) NSString * uuid; /** - * 上传时,语音文件的路径,接收时使用getSound获得数据 + * 视频文件类型,发送消息时设置 */ -@property(nonatomic,strong) NSString * path; +@property(nonatomic,strong) NSString * type; /** - * 语音消息内部ID + * 视频大小,不用设置 */ -@property(nonatomic,strong) NSString * uuid; +@property(nonatomic,assign) int size; /** - * 语音数据大小 + * 视频时长,发送消息时设置 */ -@property(nonatomic,assign) int dataSize; +@property(nonatomic,assign) int duration; + /** - * 语音长度(秒),发送消息时设置 + * 获取视频 + * + * getVideo 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。 + * + * @param path 视频保存路径 + * @param succ 成功回调 + * @param fail 失败回调,返回错误码和错误描述 */ -@property(nonatomic,assign) int second; +- (void)getVideo:(NSString*)path succ:(TIMSucc)succ fail:(TIMFail)fail; /** - * 获取语音数据到指定路径的文件中 + * 获取视频(有进度回调) * - * @param path 语音保存路径 + * getVideo 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。 + * + * @param path 视频保存路径 + * @param progress 视频下载进度 * @param succ 成功回调 * @param fail 失败回调,返回错误码和错误描述 */ -- (void)getSound:(NSString*)path succ:(TIMSucc)succ fail:(TIMFail)fail; -- (void)getSound:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; - +- (void)getVideo:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; @end /** - * 地理位置Elem + * 视频消息 Elem */ -@interface TIMLocationElem : TIMElem +@interface TIMVideoElem : TIMElem + /** - * 地理位置描述信息,发送消息时设置 + * 上传时任务 ID,可用来查询上传进度(已废弃,请在 TIMUploadProgressListener 监听上传进度) */ -@property(nonatomic,strong) NSString * desc; +@property(nonatomic,assign) uint32_t taskId DEPRECATED_ATTRIBUTE; + /** - * 纬度,发送消息时设置 + * 视频文件路径,发送消息时设置 */ -@property(nonatomic,assign) double latitude; +@property(nonatomic,strong) NSString * videoPath; + /** - * 经度,发送消息时设置 + * 视频信息,发送消息时设置 */ -@property(nonatomic,assign) double longitude; -@end +@property(nonatomic,strong) TIMVideo * video; +/** + * 截图文件路径,发送消息时设置 + */ +@property(nonatomic,strong) NSString * snapshotPath; /** - * 自定义消息类型 + * 视频截图,发送消息时设置 */ -@interface TIMCustomElem : TIMElem +@property(nonatomic,strong) TIMSnapshot * snapshot; + +@end + +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (六)文件消息 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 文件消息 /** - * 自定义消息二进制数据 + * 文件消息Elem */ -@property(nonatomic,strong) NSData * data; +@interface TIMFileElem : TIMElem /** - * 自定义消息描述信息,做离线Push时文本展示(已废弃,请使用TIMMessage中offlinePushInfo进行配置) + * 上传时任务 ID,可用来查询上传进度(已废弃,请在 TIMUploadProgressListener 监听上传进度) */ -@property(nonatomic,strong) NSString * desc DEPRECATED_ATTRIBUTE; +@property(nonatomic,assign) uint32_t taskId DEPRECATED_ATTRIBUTE; /** - * 离线Push时扩展字段信息(已废弃,请使用TIMMessage中offlinePushInfo进行配置) + * 上传时,文件的路径(设置 path 时,优先上传文件) */ -@property(nonatomic,strong) NSString * ext DEPRECATED_ATTRIBUTE; +@property(nonatomic,strong) NSString * path; /** - * 离线Push时声音字段信息(已废弃,请使用TIMMessage中offlinePushInfo进行配置) + * 文件内部 ID */ -@property(nonatomic,strong) NSString * sound DEPRECATED_ATTRIBUTE; +@property(nonatomic,strong) NSString * uuid; +/** + * 文件大小 + */ +@property(nonatomic,assign) int fileSize; +/** + * 文件显示名,发消息时设置 + */ +@property(nonatomic,strong) NSString * filename; + +/** + * 获取文件数据到指定路径的文件中 + * + * getFile 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。 + * + * @param path 文件保存路径 + * @param succ 成功回调,返回数据 + * @param fail 失败回调,返回错误码和错误描述 + */ +- (void)getFile:(NSString*)path succ:(TIMSucc)succ fail:(TIMFail)fail; + +/** + * 获取文件数据到指定路径的文件中(有进度回调) + * + * getFile 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。 + * + * @param path 文件保存路径 + * @param progress 文件下载进度 + * @param succ 成功回调,返回数据 + * @param fail 失败回调,返回错误码和错误描述 + */ +- (void)getFile:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; + @end +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (七)表情消息 +// +///////////////////////////////////////////////////////////////////////////////// /** * 表情消息类型 + * + * 1. 表情消息由 TIMFaceElem 定义,SDK 并不提供表情包,如果开发者有表情包,可使用 index 存储表情在表情包中的索引,由用户自定义,或者直接使用 data 存储表情二进制信息以及字符串 key,都由用户自定义,SDK 内部只做透传。 + * 2. index 和 data 只需要传入一个即可,ImSDK 只是透传这两个数据。 + * */ @interface TIMFaceElem : TIMElem @@ -240,39 +374,40 @@ @end -@interface TIMVideo : NSObject +///////////////////////////////////////////////////////////////////////////////// +// +// (八)地理位置消息 +// +///////////////////////////////////////////////////////////////////////////////// /** - * 视频ID,不用设置 + * 地理位置Elem */ -@property(nonatomic,strong) NSString * uuid; +@interface TIMLocationElem : TIMElem /** - * 视频文件类型,发送消息时设置 + * 地理位置描述信息,发送消息时设置 */ -@property(nonatomic,strong) NSString * type; +@property(nonatomic,strong) NSString * desc; /** - * 视频大小,不用设置 + * 纬度,发送消息时设置 */ -@property(nonatomic,assign) int size; +@property(nonatomic,assign) double latitude; /** - * 视频时长,发送消息时设置 + * 经度,发送消息时设置 */ -@property(nonatomic,assign) int duration; +@property(nonatomic,assign) double longitude; +@end +///////////////////////////////////////////////////////////////////////////////// +// +// (九)截图消息 +// +///////////////////////////////////////////////////////////////////////////////// /** - * 获取视频 - * - * @param path 视频保存路径 - * @param succ 成功回调 - * @param fail 失败回调,返回错误码和错误描述 + * 截图消息 Elem */ -- (void)getVideo:(NSString*)path succ:(TIMSucc)succ fail:(TIMFail)fail; -- (void)getVideo:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; -@end - - @interface TIMSnapshot : NSObject /** - * 图片ID,不用设置 + * 图片 ID,不用设置 */ @property(nonatomic,strong) NSString * uuid; /** @@ -295,48 +430,64 @@ /** * 获取图片 * + * getImage 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。 + * * @param path 图片保存路径 * @param succ 成功回调,返回图片数据 * @param fail 失败回调,返回错误码和错误描述 */ - (void)getImage:(NSString*)path succ:(TIMSucc)succ fail:(TIMFail)fail; -- (void)getImage:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; - -@end /** - * 微视频消息 + * 获取图片(有进度回调) + * + * getImage 接口每次都会从服务端下载,如需缓存或者存储,开发者可根据 uuid 作为 key 进行外部存储,ImSDK 并不会存储资源文件。 + * + * @param path 图片保存路径 + * @param progress 图片下载进度 + * @param succ 成功回调,返回图片数据 + * @param fail 失败回调,返回错误码和错误描述 */ -@interface TIMVideoElem : TIMElem +- (void)getImage:(NSString*)path progress:(TIMProgress)progress succ:(TIMSucc)succ fail:(TIMFail)fail; + +@end +///////////////////////////////////////////////////////////////////////////////// +// +// (十)自定义消息 +// +///////////////////////////////////////////////////////////////////////////////// /** - * 上传时任务Id,可用来查询上传进度 + * 自定义消息类型 + * + * 自定义消息是指当内置的消息类型无法满足特殊需求,开发者可以自定义消息格式,内容全部由开发者定义,IM SDK 只负责透传。自定义消息由 TIMCustomElem 定义,其中 data 存储消息的二进制数据,其数据格式由开发者定义,desc 存储描述文本。一条消息内可以有多个自定义 Elem,并且可以跟其他 Elem 混合排列,离线 Push 时叠加每个 Elem 的 desc 描述信息进行下发。 + * */ -@property(nonatomic,assign) uint32_t taskId; +@interface TIMCustomElem : TIMElem /** - * 视频文件路径,发送消息时设置 + * 自定义消息二进制数据 */ -@property(nonatomic,strong) NSString * videoPath; - +@property(nonatomic,strong) NSData * data; /** - * 视频信息,发送消息时设置 + * 自定义消息描述信息,做离线Push时文本展示(已废弃,请使用 TIMMessage 中 offlinePushInfo 进行配置) */ -@property(nonatomic,strong) TIMVideo * video; - +@property(nonatomic,strong) NSString * desc DEPRECATED_ATTRIBUTE; /** - * 截图文件路径,发送消息时设置 + * 离线Push时扩展字段信息(已废弃,请使用 TIMMessage 中 offlinePushInfo 进行配置) */ -@property(nonatomic,strong) NSString * snapshotPath; - +@property(nonatomic,strong) NSString * ext DEPRECATED_ATTRIBUTE; /** - * 视频截图,发送消息时设置 + * 离线Push时声音字段信息(已废弃,请使用 TIMMessage 中 offlinePushInfo 进行配置) */ -@property(nonatomic,strong) TIMSnapshot * snapshot; - +@property(nonatomic,strong) NSString * sound DEPRECATED_ATTRIBUTE; @end -#pragma mark - 群系统消息和tip消息 +///////////////////////////////////////////////////////////////////////////////// +// +// (十一)群 Tips 消息 +// +///////////////////////////////////////////////////////////////////////////////// /** * 群tips,成员变更信息 @@ -355,7 +506,7 @@ @end /** - * 群tips,群变更信息 + * 群 tips,群变更信息 */ @interface TIMGroupTipsElemGroupInfo : NSObject @@ -371,12 +522,12 @@ @end /** - * 群Tips + * 群 Tips */ @interface TIMGroupTipsElem : TIMElem /** - * 群组Id + * 群组 ID */ @property(nonatomic,strong) NSString * group; @@ -442,7 +593,11 @@ @end - +///////////////////////////////////////////////////////////////////////////////// +// +// (十二)群系统消息 +// +///////////////////////////////////////////////////////////////////////////////// /** * 群系统消息 */ @@ -454,7 +609,7 @@ @property(nonatomic,assign) TIM_GROUP_SYSTEM_TYPE type; /** - * 群组Id + * 群组 ID */ @property(nonatomic,strong) NSString * group; @@ -468,7 +623,6 @@ */ @property(nonatomic,strong) NSString * msg; - /** * 消息标识,客户端无需关心 */ @@ -480,7 +634,7 @@ @property(nonatomic,strong) NSData * authKey; /** - * 用户自定义透传消息体(type=TIM_GROUP_SYSTEM_CUSTOM_INFO时有效) + * 用户自定义透传消息体(type = TIM_GROUP_SYSTEM_CUSTOM_INFO 时有效) */ @property(nonatomic,strong) NSData * userData; @@ -496,16 +650,20 @@ /** * 操作方平台信息 - * 取值: iOS Android Windows Mac Web RESTAPI Unknown + * 取值: iOS、Android、Windows、Mac、Web、RESTAPI、Unknown */ @property(nonatomic,strong) NSString * platform; @end -#pragma mark - 消息体TIMMessage +///////////////////////////////////////////////////////////////////////////////// +// +// (十三)设置消息推送 +// +///////////////////////////////////////////////////////////////////////////////// /** - 填入sound字段表示接收时不会播放声音 + 填入 sound 字段表示接收时不会播放声音 */ extern NSString * const kIOSOfflinePushNoSound; @@ -515,7 +673,7 @@ extern NSString * const kIOSOfflinePushNoSound; */ @property(nonatomic,strong) NSString * desc; /** - * 离线Push时扩展字段信息 + * 离线 Push 时扩展字段信息 */ @property(nonatomic,strong) NSString * ext; /** @@ -533,33 +691,36 @@ extern NSString * const kIOSOfflinePushNoSound; @end +///////////////////////////////////////////////////////////////////////////////// +// +// (十四)消息封装 +// +///////////////////////////////////////////////////////////////////////////////// /** * 消息 */ @interface TIMMessage : NSObject /** - * 增加Elem + * 增加 Elem * - * @param elem elem结构 + * @param elem elem 结构 * - * @return 0 表示成功 - * 1 禁止添加Elem(文件或语音多于两个Elem) - * 2 未知Elem + * @return 0:表示成功;1:禁止添加 Elem(文件或语音多于两个 Elem);2:未知 Elem */ - (int)addElem:(TIMElem*)elem; /** - * 获取对应索引的Elem + * 获取对应索引的 Elem * * @param index 对应索引 * - * @return 返回对应Elem + * @return 返回对应 Elem */ - (TIMElem*)getElem:(int)index; /** - * 获取Elem数量 + * 获取 Elem 数量 * * @return elem数量 */ @@ -577,7 +738,7 @@ extern NSString * const kIOSOfflinePushNoSound; /** * 获得本消息离线推送配置信息 * - * @return 配置信息,没设置返回nil + * @return 配置信息,没设置返回 nil */ - (TIMOfflinePushInfo*)getOfflinePushInfo; @@ -585,14 +746,14 @@ extern NSString * const kIOSOfflinePushNoSound; * 设置业务命令字 * * @param buzCmds 业务命令字列表 - * @"im_open_busi_cmd.msg_robot" 表示发送给IM机器人 - * @"im_open_busi_cmd.msg_nodb" 表示不存离线 - * @"im_open_busi_cmd.msg_noramble" 表示不存漫游 - * @"im_open_busi_cmd.msg_nopush" 表示不实时下发给用户 + * @"im_open_busi_cmd.msg_robot":表示发送给IM机器人; + * @"im_open_busi_cmd.msg_nodb":表示不存离线; + * @"im_open_busi_cmd.msg_noramble":表示不存漫游; + * @"im_open_busi_cmd.msg_nopush":表示不实时下发给用户 * - * @return 0 成功 + * @return 0:成功;1:buzCmds 为 nil */ --(int) setBusinessCmd:(NSArray*)buzCmds; +-(int)setBusinessCmd:(NSArray*)buzCmds; /** * 获取会话 @@ -611,7 +772,7 @@ extern NSString * const kIOSOfflinePushNoSound; /** * 是否发送方 * - * @return TRUE 表示是发送消息 FALSE 表示是接收消息 + * @return TRUE:表示是发送消息;FALSE:表示是接收消息 */ - (BOOL)isSelf; @@ -623,12 +784,12 @@ extern NSString * const kIOSOfflinePushNoSound; - (NSString*)sender; /** - * 消息Id + * 消息 ID,当消息生成时,就已经固定,这种方式可能跟其他用户产生的消息冲突,需要再加一个时间约束,可以认为 10 分钟以内的消息可以使用 msgId 区分,需要在同一个会话内判断。 */ - (NSString*)msgId; /** - * 获取消息uniqueId + * 消息 uniqueId,当消息发送成功以后才能固定下来(uniqueId),这种方式能保证全局唯一,需要在同一个会话内判断。 * * @return uniqueId */ @@ -637,22 +798,25 @@ extern NSString * const kIOSOfflinePushNoSound; /** * 当前消息的时间戳 * - * @return 时间戳 + * @return 时间戳,该时间是 Server 时间,而非本地时间。在创建消息时,此时间为根据 Server 时间校准过的时间,发送成功后会改为准确的 Server 时间。 */ - (NSDate*)timestamp; - /** - * 获取发送者资料(发送者为自己时可能为空) + * 获取发送者资料 * - * @return 发送者资料,nil 表示没有获取资料,目前只有字段:identifier、nickname、faceURL、customInfo + * 如果本地有发送者资料,这里会直接通过 return 值 TIMUserProfile 返回发送者资料,如果本地没有发送者资料,这里会直接 return nil,SDK 内部会向服务器拉取发送者资料,并在 profileCallBack 回调里面返回发送者资料。 + * + * @param profileCallBack 发送者资料回调 + * + * @return 发送者资料,nil 表示本地没有获取到资料 */ -- (TIMUserProfile*)getSenderProfile; +- (TIMUserProfile*)getSenderProfile:(ProfileCallBack)profileCallBack; /** * 获取发送者群内资料(发送者为自己时可能为空) * - * @return 发送者群内资料,nil 表示没有获取资料或者不是群消息,目前只有字段:member、nameCard、role、customInfo + * @return 发送者群内资料,nil 表示没有获取资料或者不是群消息,目前仅能获取字段:member,nameCard,其他的字段获取建议通过 TIMGroupManager+Ext.h -> getGroupMembers 获取 */ - (TIMGroupMemberInfo*)getSenderGroupMemberProfile; @@ -666,20 +830,15 @@ extern NSString * const kIOSOfflinePushNoSound; - (BOOL)setPriority:(TIMMessagePriority)priority; /** - * 获取消息的优先级 + * 获取消息的优先级(仅对群组消息有效) + * + * 对于直播场景,会有点赞和发红包功能,点赞相对优先级较低,红包消息优先级较高,具体消息内容可以使用 TIMCustomElem 进行定义,发送消息时,可设置消息优先级。 * * @return 优先级 */ - (TIMMessagePriority)getPriority; /** - * 获取消息所属会话的接收消息选项(仅对群组消息有效) - * - * @return 接收消息选项 - */ -- (TIMGroupReceiveMessageOpt)getRecvOpt; - -/** * 拷贝消息中的属性(ELem、priority、online、offlinePushInfo) * * @param srcMsg 源消息 diff --git a/HHVDoctorSDK/ImSDK.framework/ImSDK b/HHVDoctorSDK/ImSDK.framework/ImSDK index 13cab3a..266eca4 100755 Binary files a/HHVDoctorSDK/ImSDK.framework/ImSDK and b/HHVDoctorSDK/ImSDK.framework/ImSDK differ diff --git a/HHVDoctorSDK/ImSDK.framework/Info.plist b/HHVDoctorSDK/ImSDK.framework/Info.plist index 03aa2fe..50c130b 100755 Binary files a/HHVDoctorSDK/ImSDK.framework/Info.plist and b/HHVDoctorSDK/ImSDK.framework/Info.plist differ diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXAudioCustomProcessDelegate.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXAudioCustomProcessDelegate.h index ca810c7..9155c38 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXAudioCustomProcessDelegate.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXAudioCustomProcessDelegate.h @@ -14,21 +14,21 @@ /** * 原始声音的回调 - * @prarm data pcm数据 - * @prarm timeStamp 时间戳 - * @prarm sampleRate 采样率 - * @prarm channels 声道数 - * @prarm withBgm 回调的数据是否包含bgm,当不开启回声消除时,回调的raw pcm会包含bgm + * @param data pcm数据 + * @param timeStamp 时间戳 + * @param sampleRate 采样率 + * @param channels 声道数 + * @param withBgm 回调的数据是否包含bgm,当不开启回声消除时,回调的raw pcm会包含bgm */ @optional - (void)onRecordRawPcmData:(NSData *)data timeStamp:(unsigned long long)timeStamp sampleRate:(int)sampleRate channels:(int)channels withBgm:(BOOL)withBgm; /** * 经过特效处理的声音回调 - * @prarm data pcm数据 - * @prarm timeStamp 时间戳 - * @prarm sampleRate 采样率 - * @prarm channels 声道数 + * @param data pcm数据 + * @param timeStamp 时间戳 + * @param sampleRate 采样率 + * @param channels 声道数 */ @optional - (void)onRecordPcmData:(NSData *)data timeStamp:(unsigned long long)timeStamp sampleRate:(int)sampleRate channels:(int)channels; diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXBitrateItem.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXBitrateItem.h index 0fa1e80..0ae929c 100755 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXBitrateItem.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXBitrateItem.h @@ -11,9 +11,9 @@ /// HLS多码率信息 @interface TXBitrateItem : NSObject -@property (nonatomic, assign) NSInteger index; /// m3u8文件中的序号 -@property (nonatomic, assign) NSInteger width; /// 此流的视频宽度 -@property (nonatomic, assign) NSInteger height; /// 此流的视频高度 -@property (nonatomic, assign) NSInteger bitrate; /// 此流的视频码率 +@property (nonatomic, assign) NSInteger index; ///< m3u8 文件中的序号 +@property (nonatomic, assign) NSInteger width; ///< 此流的视频宽度 +@property (nonatomic, assign) NSInteger height; ///< 此流的视频高度 +@property (nonatomic, assign) NSInteger bitrate; ///< 此流的视频码率 @end #endif /* TXBitrateItem_h */ diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiteAVCode.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiteAVCode.h new file mode 100644 index 0000000..0aa68ca --- /dev/null +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiteAVCode.h @@ -0,0 +1,309 @@ +#ifndef __TXLITEAVCODE_H__ +#define __TXLITEAVCODE_H__ + +///////////////////////////////////////////////////////////////////////////////// +// +// (一)错误码(严重) +// +///////////////////////////////////////////////////////////////////////////////// + +typedef enum TXLiteAVError +{ + ERR_NULL = 0, ///< 无错误 + + ERR_CAMERA_START_FAIL = -1301, ///< 打开摄像头失败,例如在 Windows 或 Mac 设备,摄像头的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序 + ERR_CAMERA_NOT_AUTHORIZED = -1314, ///< 摄像头设备未授权,通常在移动设备出现,可能是权限被用户拒绝了 + ERR_CAMERA_SET_PARAM_FAIL = -1315, ///< 摄像头参数设置出错(参数不支持或其它) + ERR_CAMERA_OCCUPY = -1316, ///< 摄像头正在被占用中,可尝试打开其他摄像头 + ERR_MIC_START_FAIL = -1302, ///< 打开麦克风失败,例如在 Windows 或 Mac 设备,麦克风的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序 + ERR_MIC_NOT_AUTHORIZED = -1317, ///< 麦克风设备未授权,通常在移动设备出现,可能是权限被用户拒绝了 + ERR_MIC_SET_PARAM_FAIL = -1318, ///< 麦克风设置参数失败 + ERR_MIC_OCCUPY = -1319, ///< 麦克风正在被占用中,例如移动设备正在通话时,打开麦克风会失败 + ERR_MIC_STOP_FAIL = -1320, ///< 停止麦克风失败 + ERR_SPEAKER_START_FAIL = -1321, ///< 打开扬声器失败,例如在 Windows 或 Mac 设备,扬声器的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序 + ERR_SPEAKER_SET_PARAM_FAIL = -1322, ///< 扬声器设置参数失败 + ERR_SPEAKER_STOP_FAIL = -1323, ///< 停止扬声器失败 + + ERR_VIDEO_ENCODE_FAIL = -1303, ///< 视频帧编码失败,例如 iOS 设备切换到其他应用时,硬编码器可能被系统释放,再切换回来时,硬编码器重启前,可能会抛出 + ERR_AUDIO_ENCODE_FAIL = -1304, ///< 音频帧编码失败,例如传入自定义音频数据,SDK 无法处理 + ERR_UNSUPPORTED_RESOLUTION = -1305, ///< 不支持的视频分辨率 + ERR_UNSUPPORTED_SAMPLERATE = -1306, ///< 不支持的音频采样率 + ERR_RTMP_PUSH_NET_DISCONNECT = -1307, ///< 直播,推流出现网络断开,且经过多次重试无法恢复 + ERR_SCREEN_CAPTURE_START_FAIL = -1308, ///< 开始录屏失败,如果在移动设备出现,可能是权限被用户拒绝了,如果在 Windows 或 Mac 系统的设备出现,请检查录屏接口的参数是否符合要求 + ERR_SCREEN_CAPTURE_UNSURPORT = -1309, ///< 录屏失败,在 Android 平台,需要5.0以上的系统 + ERR_RTMP_PUSH_INVALID_ADDRESS = -1313, ///< 直播,推流地址非法,例如不是 RTMP 协议的地址 + ERR_RTMP_PUSH_NET_ALLADDRESS_FAIL = -1324, ///< 直播,连接推流服务器失败(若支持智能选路,IP 全部失败) + ERR_RTMP_PUSH_NO_NETWORK = -1325, ///< 直播,网络不可用,请确认 WiFi、移动数据或者有线网络是否正常 + ERR_RTMP_PUSH_SERVER_REFUSE = -1326, ///< 直播,服务器拒绝连接请求,可能是该推流地址已经被占用,或者 TXSecret 校验失败,或者是过期了,或者是欠费了 + ERR_PIXEL_FORMAT_UNSUPPORTED = -1327, ///< 设置的 pixel format 不支持 + ERR_BUFFER_TYPE_UNSUPPORTED = -1328, ///< 设置的 buffer type 不支持 + + ERR_PLAY_LIVE_STREAM_NET_DISCONNECT = -2301, ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放 + ERR_GET_RTMP_ACC_URL_FAIL = -2302, ///< 直播,获取加速拉流的地址失败 + ERR_FILE_NOT_FOUND = -2303, ///< 播放的文件不存在 + ERR_HEVC_DECODE_FAIL = -2304, ///< H265 解码失败 + ERR_VOD_DECRYPT_FAIL = -2305, ///< 点播,音视频流解密失败 + ERR_GET_VODFILE_MEDIAINFO_FAIL = -2306, ///< 点播,获取点播文件信息失败 + ERR_PLAY_LIVE_STREAM_SWITCH_FAIL = -2307, ///< 直播,切流失败(切流可以播放不同画面大小的视频) + ERR_PLAY_LIVE_STREAM_SERVER_REFUSE = -2308, ///< 直播,服务器拒绝连接请求 + ERR_RTMP_ACC_FETCH_STREAM_FAIL = -2309, ///< 直播,RTMPACC 低延时拉流失败,且经过多次重试无法恢复 + + ERR_ROOM_ENTER_FAIL = -3301, ///< 进入房间失败 [例如 token 过期等原因,server 错误码梳理中,待细化] + ERR_ROOM_HEARTBEAT_FAIL = -3302, ///< 心跳失败,客户端定时向服务器发送数据包,告诉服务器自己活着,这个错误通常是发包超时 + ERR_ROOM_REQUEST_IP_FAIL = -3303, ///< 拉取接口机服务器地址失败 + ERR_ROOM_CONNECT_FAIL = -3304, ///< 连接接口机服务器失败 + ERR_ROOM_REQUEST_AVSEAT_FAIL = -3305, ///< 请求视频位失败 + ERR_ROOM_REQUEST_TOKEN_HTTPS_TIMEOUT = -3306, ///< 请求 token https 超时 + ERR_ROOM_REQUEST_IP_TIMEOUT = -3307, ///< 请求 IP 和 sig 超时 + ERR_ROOM_REQUEST_ENTER_ROOM_TIMEOUT = -3308, ///< 请求进房超时 + ERR_ROOM_REQUEST_VIDEO_FLAG_TIMEOUT = -3309, ///< 请求视频位超时 + ERR_ROOM_REQUEST_VIDEO_DATA_ROOM_TIMEOUT = -3310, ///< 请求视频数据超时 + ERR_ROOM_REQUEST_CHANGE_ABILITY_TIMEOUT = -3311, ///< 请求修改视频能力项超时 + ERR_ROOM_REQUEST_STATUS_REPORT_TIMEOUT = -3312, ///< 请求状态上报超时 + ERR_ROOM_REQUEST_CLOSE_VIDEO_TIMEOUT = -3313, ///< 请求关闭视频超时 + ERR_ROOM_REQUEST_SET_RECEIVE_TIMEOUT = -3314, ///< 请求接收视频项超时 + ERR_ROOM_REQUEST_TOKEN_INVALID_PARAMETER = -3315, ///< 请求 token 无效参数 + ERR_ENTER_ROOM_PARAM_NULL = -3316, ///< 进房参数为空 + ERR_SDK_APPID_INVALID = -3317, ///< 进房参数 sdkAppId 错误 + ERR_ROOM_ID_INVALID = -3318, ///< 进房参数 roomId 错误 + ERR_USER_ID_INVALID = -3319, ///< 进房参数 userID 不正确 + ERR_USER_SIG_INVALID = -3320, ///< 进房参数 userSig 不正确 + + ERR_PUBLISH_CDN_STREAM_REQUEST_TIME_OUT = -3321, ///< 旁路转推请求超时 + ERR_CLOUD_MIX_TRANSCODING_REQUEST_TIME_OUT = -3322, ///< 云端混流请求超时 + ERR_PUBLISH_CDN_STREAM_RESPON_ERROR = -3323, ///< 旁路转推回包异常 + ERR_CLOUD_MIX_TRANSCODING_RESPON_ERROR = -3324, ///< 云端混流回包异常 + ERR_ROOM_REQUEST_QUIT_ROOM_TIMEOUT = -3325, ///< 请求退房超时 + ERR_ROOM_REQUEST_CONN_ROOM_TIMEOUT = -3326, ///< 请求连麦超时 + ERR_ROOM_REQUEST_DISCONN_ROOM_TIMEOUT = -3327, ///< 请求退出连麦超时 + ERR_ROOM_REQUEST_CONN_ROOM_INVALID_PARAM = -3328, ///< 无效参数 + ERR_ROOM_REQUEST_AES_TOKEN_RETURN_ERROR = -3329, ///< 请求 AES TOKEN 时,server 返回的内容是空的 + ERR_CONNECT_OTHER_ROOM_AS_AUDIENCE = -3330, ///< 当前是观众角色,不能请求或断开跨房连麦 + ERR_ACCIP_LIST_EMPTY = -3331, ///< 请求接口机 IP 返回的列表为空的 + + // Info 服务器(查询接口机 IP), 服务器错误码,数值范围[-100000, -110000],但命名、含义在确认中 + + ERR_SERVER_INFO_UNPACKING_ERROR = -100000, ///< 请求解包错误 + ERR_SERVER_INFO_TOKEN_ERROR = -100001, ///< TOKEN 错误 + ERR_SERVER_INFO_ALLOCATE_ACCESS_FAILED = -100002, ///< 分配接口机错误 + ERR_SERVER_INFO_GENERATE_SIGN_FAILED = -100003, ///< 生成签名错误 + ERR_SERVER_INFO_TOKEN_TIMEOUT = -100004, ///< token 超时 + ERR_SERVER_INFO_INVALID_COMMAND = -100005, ///< 无效的命令字 + ERR_SERVER_INFO_PRIVILEGE_FLAG_ERROR = -100006, ///< 权限位校验失败 + ERR_SERVER_INFO_GENERATE_KEN_ERROR = -100007, ///< https 请求时,生成加密 key 错误 + ERR_SERVER_INFO_GENERATE_TOKEN_ERROR = -100008, ///< https 请求时,生成 token 错误 + ERR_SERVER_INFO_DATABASE = -100009, ///< 数据库查询失败(房间相关存储信息) + ERR_SERVER_INFO_BAD_ROOMID = -100010, ///< 房间号错误 + ERR_SERVER_INFO_BAD_SCENE_OR_ROLE = -100011, ///< 场景或角色错误 + ERR_SERVER_INFO_ROOMID_EXCHANGE_FAILED = -100012, ///< 房间号转换出错 + ERR_SERVER_INFO_SERVICE_SUSPENDED = -100013, ///< 欠费导致服务暂停 + + ERR_SERVER_INFO_STRGROUP_HAS_INVALID_CHARS = -100014, ///< 房间号非法 +// ERR_SERVER_INFO_LACK_SDKAPPID = -100015, ///< 暂时没用 + + // Access 接口机 + + ERR_SERVER_ACC_TOKEN_TIMEOUT = -101000, ///< token 超时 + ERR_SERVER_ACC_SIGN_ERROR = -101001, ///< 签名错误 + ERR_SERVER_ACC_SIGN_TIMEOUT = -101002, ///< 签名超时 + ERR_SERVER_ACC_ROOM_NOT_EXIST = -101003, ///< 房间不存在 + ERR_SERVER_ACC_ROOMID = -101004, ///< 后台房间标识roomid错误 + ERR_SERVER_ACC_LOCATIONID = -101005, ///< 后台用户位置标识locationid错误 + + // center 服务器(信令和流控处理等任务) + + ERR_SERVER_CENTER_SYSTEM_ERROR = -102000, ///< 后台错误 + ERR_SERVER_CENTER_INVALID_ROOMID = -102001, ///< 无效的房间 Id + ERR_SERVER_CENTER_CREATE_ROOM_FAILED = -102002, ///< 创建房间失败 + ERR_SERVER_CENTER_SIGN_ERROR = -102003, ///< 签名错误 + ERR_SERVER_CENTER_SIGN_TIMEOUT = -102004, ///< 签名过期 + ERR_SERVER_CENTER_ROOM_NOT_EXIST = -102005, ///< 房间不存在 + ERR_SERVER_CENTER_ADD_USER_FAILED = -102006, ///< 房间添加用户失败 + ERR_SERVER_CENTER_FIND_USER_FAILED = -102007, ///< 查找用户失败 + ERR_SERVER_CENTER_SWITCH_TERMINATION_FREQUENTLY = -102008, ///< 频繁切换终端 + ERR_SERVER_CENTER_LOCATION_NOT_EXIST = -102009, ///< locationid 错误 + ERR_SERVER_CENTER_NO_PRIVILEDGE_CREATE_ROOM = -102010, ///< 没有权限创建房间 + ERR_SERVER_CENTER_NO_PRIVILEDGE_ENTER_ROOM = -102011, ///< 没有权限进入房间 + ERR_SERVER_CENTER_INVALID_PARAMETER_SUB_VIDEO = -102012, ///< 辅路抢视频位、申请辅路请求类型参数错误 + ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_VIDEO = -102013, ///< 没有权限上视频 + ERR_SERVER_CENTER_ROUTE_TABLE_ERROR = -102014, ///< 没有空闲路由表 + ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_SUB_VIDEO = -102015, ///< 没有权限上行辅路 + ERR_SERVER_CENTER_ANOTHER_USER_PUSH_SUB_VIDEO = -102016, ///< 其他用户正在上行辅路 + ERR_SERVER_CENTER_NOT_PUSH_SUB_VIDEO = -102017, ///< 当前用户没有上行辅路 + ERR_SERVER_CENTER_USER_WAS_DELETED = -102018, ///< 用户被删除状态 + ERR_SERVER_CENTER_NO_PRIVILEDGE_REQUEST_VIDEO = -102019, ///< 没有权限请求视频 + + ERR_SERVER_CENTER_INVALID_PARAMETER = -102023, ///< 参数错误 + ERR_SERVER_CENTER_I_FRAME_UNKNOW_TYPE = -102024, ///< 请求 I 帧未知 opType + ERR_SERVER_CENTER_I_FRAME_INVALID_PACKET = -102025, ///< 请求 I 帧包格式错误 + ERR_SERVER_CENTER_I_FRAME_DEST_USER_NOT_EXIST = -102026, ///< 请求 I 帧目标用户不存在 + ERR_SERVER_CENTER_I_FRAME_ROOM_TOO_BIG = -102027, ///< 请求 I 帧房间用户太多 + ERR_SERVER_CENTER_I_FRAME_RPS_INVALID_PARAMETER = -102028, ///< 请求 I 帧参数错误 + ERR_SERVER_CENTER_INVALID_ROOM_ID = -102029, ///< 房间号非法 + ERR_SERVER_CENTER_ROOM_ID_TOO_LONG = -102030, ///< 房间号超过限制 + //跨房间连麦 + ERR_SERVER_CENTER_CONN_ROOM_NOT_SUPPORT = -102031, ///< 不支持跨房间连麦 + ERR_SERVER_CENTER_CONN_ROOM_REACH_MAX_NUM = -102032, ///< 达到跨房间连麦上限 + ERR_SERVER_CENTER_CONN_ROOM_REACH_MAX_RETRY_TIMES = -102033, ///< 跨房间连麦重试次数耗尽 + ERR_SERVER_CENTER_CONN_ROOM_REQ_TIMEOUT = -102034, ///< 跨房间连麦请求超时 + ERR_SERVER_CENTER_CONN_ROOM_REQ = -102035, ///< 跨房间连麦请求格式错误 + ERR_SERVER_CENTER_CONN_ROOM_NO_SIG = -102036, ///< 跨房间连麦无签名 + ERR_SERVER_CENTER_CONN_ROOM_DECRYPT_SIG = -102037, ///< 跨房间连麦签名解密失败 + ERR_SERVER_CENTER_CONN_ROOM_NO_KEY = -102038, ///< 未找到跨房间连麦签名解密密钥 + ERR_SERVER_CENTER_CONN_ROOM_PARSE_SIG = -102039, ///< 跨房间连麦签名解析错误 + ERR_SERVER_CENTER_CONN_ROOM_INVALID_SIG_TIME = -102040, ///< 跨房间连麦签名时间戳错误 + ERR_SERVER_CENTER_CONN_ROOM_SIG_GROUPID = -102041, ///< 跨房间连麦签名不匹配 + ERR_SERVER_CENTER_CONN_ROOM_NOT_CONNED = -102042, ///< 本房间无连麦 + ERR_SERVER_CENTER_CONN_ROOM_USER_NOT_CONNED = -102043, ///< 本用户未发起连麦 + ERR_SERVER_CENTER_CONN_ROOM_FAILED = -102044, ///< 跨房间连麦失败 + ERR_SERVER_CENTER_CONN_ROOM_CANCEL_FAILED = -102045, ///< 取消跨房间连麦失败 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_ROOM_NOT_EXIST = -102046, ///< 被连麦房间不存在 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_REACH_MAX_ROOM = -102047, ///< 被连麦房间达到连麦上限 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_NOT_EXIST = -102048, ///< 被连麦用户不存在 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_DELETED = -102049, ///< 被连麦用户已被删除 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_FULL = -102050, ///< 被连麦用户达到资源上限 + ERR_SERVER_CENTER_CONN_ROOM_INVALID_SEQ = -102051, ///< 连麦请求序号错乱 + ERR_SERVER_CENTER_ROOM_FULL = -102052, ///< 房间满员 + ERR_SERVER_CENTER_DECODE_JSON_FAIL = -102053, ///< json串解析失败 + ERR_SERVER_CENTER_UNKNOWN_SUB_CMD = -102054, ///< 未定义命令字 + ERR_SERVER_CENTER_INVALID_ROLE = -102055, ///< 未定义角色 + ERR_SERVER_CENTER_REACH_PROXY_MAX = -102056, ///< 代理机超出限制 + + //add by sunlitwang begin + ERR_SERVER_CENTER_RECORDID_STORE = -102057, ///< 无法保存用户自定义recordId + ERR_SERVER_CENTER_PB_SERIALIZE = -102058, ///< Protobuf序列化错误 + // https://cloud.tencent.com/document/product/269/1671#.E5.B8.90.E5.8F.B7.E7.B3.BB.E7.BB.9F , 帐号系统, 主要是70000 - 79999之间. + // 在请求 token 过程中,出现账号错误,SSO 返回的错误码,原为正数,现将其转换为负数。 + + ERR_SERVER_SSO_SIG_EXPIRED = -70001, ///< sig 过期,请尝试重新生成。如果是刚生成,就过期,请检查有效期填写的是否过小,或者填的 0 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_1 = -70003, ///< sig 校验失败,请确认下 sig 内容是否被截断,如缓冲区长度不够导致的内容截断 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_2 = -70004, ///< sig 校验失败,请确认下 sig 内容是否被截断,如缓冲区长度不够导致的内容截断 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_3 = -70005, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_4 = -70006, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_5 = -70007, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_6 = -70008, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_7 = -70009, ///< 用业务公钥验证 sig 失败,请确认生成的 usersig 使用的私钥和 sdkAppId 是否对应 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_8 = -70010, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确 + ERR_SERVER_SSO_SIG_VERIFICATION_ID_NOT_MATCH = -70013, ///< sig 中 identifier 与请求时的 identifier 不匹配,请检查登录时填写的 identifier 与 sig 中的是否一致 + ERR_SERVER_SSO_APPID_NOT_MATCH = -70014, ///< sig 中 sdkAppId 与请求时的 sdkAppId 不匹配,请检查登录时填写的 sdkAppId 与 sig 中的是否一致 + ERR_SERVER_SSO_VERIFICATION_EXPIRED = -70017, ///< 内部第三方票据验证超时,请重试,如多次重试不成功,请@TLS 帐号支持,QQ 3268519604 + ERR_SERVER_SSO_VERIFICATION_FAILED = -70018, ///< 内部第三方票据验证超时,请重试,如多次重试不成功,请@TLS 帐号支持,QQ 3268519604 + + ERR_SERVER_SSO_APPID_NOT_FOUND = -70020, ///< sdkAppId 未找到,请确认是否已经在腾讯云上配置 + ERR_SERVER_SSO_ACCOUNT_IN_BLACKLIST = -70051, ///< 帐号已被拉入黑名单,请联系 TLS 帐号支持 QQ 3268519604 + ERR_SERVER_SSO_SIG_INVALID = -70052, ///< usersig 已经失效,请重新生成,再次尝试 + ERR_SERVER_SSO_LIMITED_BY_SECURITY = -70114, ///< 安全原因被限制 + ERR_SERVER_SSO_INVALID_LOGIN_STATUS = -70221, ///< 登录状态无效,请使用 usersig 重新鉴权 + ERR_SERVER_SSO_APPID_ERROR = -70252, ///< sdkAppId 填写错误 + ERR_SERVER_SSO_TICKET_VERIFICATION_FAILED = -70346, ///< 票据校验失败,请检查各项参数是否正确 + ERR_SERVER_SSO_TICKET_EXPIRED = -70347, ///< 票据因过期原因校验失败 + ERR_SERVER_SSO_ACCOUNT_EXCEED_PURCHASES = -70398, ///< 创建账号数量超过已购买预付费数量限制 + ERR_SERVER_SSO_INTERNAL_ERROR = -70500, ///< 服务器内部错误,请重试 +} TXLiteAVError; + +///////////////////////////////////////////////////////////////////////////////// +// +// (二)错误码(警告) +// +///////////////////////////////////////////////////////////////////////////////// + +typedef enum TXLiteAVWarning +{ + WARNING_NET_BUSY = 1101, ///< 网络状况不佳:上行带宽太小,上传数据受阻 + WARNING_RTMP_SERVER_RECONNECT = 1102, ///< 直播,网络断连, 已启动自动重连(自动重连连续失败超过三次会放弃) + WARNING_HW_ENCODER_START_FAIL = 1103, ///< 硬编码启动失败,采用软编码 + WARNING_VIDEO_ENCODER_SW_TO_HW = 1107, ///< 视频编码器从软编码自动切换到硬编码,一般是由于 CPU 使用率过高触发的 + WARNING_INSUFFICIENT_CAPTURE_FPS = 1108, ///< 摄像头采集帧率不足,部分自带美颜算法的 Android 手机上会出现 + WARNING_SW_ENCODER_START_FAIL = 1109, ///< 软编码启动失败 + WARNING_REDUCE_CAPTURE_RESOLUTION = 1110, ///< 摄像头采集分辨率被降低,以满足当前帧率和性能最优解。 + + WARNING_VIDEO_FRAME_DECODE_FAIL = 2101, ///< 当前视频帧解码失败 + WARNING_AUDIO_FRAME_DECODE_FAIL = 2102, ///< 当前音频帧解码失败 + WARNING_LIVE_STREAM_SERVER_RECONNECT = 2103, ///< 直播,网络断连, 已启动自动重连(自动重连连续失败超过三次会放弃) + WARNING_RECV_DATA_LAG = 2104, ///< 网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀 + WARNING_VIDEO_PLAY_LAG = 2105, ///< 当前视频播放出现卡顿(用户直观感受) + WARNING_HW_DECODER_START_FAIL = 2106, ///< 硬解启动失败,采用软解码 + WARNING_VIDEO_DECODER_HW_TO_SW = 2108, ///< 当前流硬解第一个 I 帧失败,SDK 自动切软解 + WARNING_SW_DECODER_START_FAIL = 2109, ///< 软解码器启动失败 + + WARNING_RTMP_DNS_FAIL = 3001, ///< 直播,DNS 解析失败 + WARNING_RTMP_SEVER_CONN_FAIL = 3002, ///< 直播,服务器连接失败 + WARNING_RTMP_SHAKE_FAIL = 3003, ///< 直播,与 RTMP 服务器握手失败 + WARNING_RTMP_SERVER_BREAK_CONNECT = 3004, ///< 直播,服务器主动断开 + WARNING_RTMP_READ_WRITE_FAIL = 3005, ///< 直播,RTMP 读/写失败,将会断开连接 + WARNING_RTMP_WRITE_FAIL = 3006, ///< 直播,RTMP 写失败(SDK 内部错误码,不会对外抛出) + WARNING_RTMP_READ_FAIL = 3007, ///< 直播,RTMP 读失败(SDK 内部错误码,不会对外抛出) + WARNING_RTMP_NO_DATA = 3008, ///< 直播,超过30s 没有数据发送,主动断开连接 + WARNING_PLAY_LIVE_STREAM_INFO_CONNECT_FAIL = 3009, ///< 直播,connect 服务器调用失败(SDK 内部错误码,不会对外抛出) + WARNING_NO_STEAM_SOURCE_FAIL = 3010, ///< 直播,连接失败,该流地址无视频(SDK 内部错误码,不会对外抛出) + + WARNING_ROOM_DISCONNECT = 5101, ///< 网络断开连接 + WARNING_ROOM_RECONNECT = 5102, ///< 网络断连,已启动自动重连 + WARNING_ROOM_NET_BUSY = 5103, ///< 网络状况不佳:上行带宽太小,上传数据受阻 + + WARNING_IGNORE_UPSTREAM_FOR_AUDIENCE = 6001, ///< 当前是观众角色,忽略上行音视频数据 +} TXLiteAVWarning; + +///////////////////////////////////////////////////////////////////////////////// +// +// (三)事件列表 +// +///////////////////////////////////////////////////////////////////////////////// + +typedef enum TXLiteAVEvent +{ + EVT_RTMP_PUSH_CONNECT_SUCC = 1001, ///< 直播,已经连接 RTMP 推流服务器 + EVT_RTMP_PUSH_BEGIN = 1002, ///< 直播,已经与 RTMP 服务器握手完毕,开始推流 + EVT_CAMERA_START_SUCC = 1003, ///< 打开摄像头成功 + EVT_SCREEN_CAPTURE_SUCC = 1004, ///< 录屏启动成功 + EVT_UP_CHANGE_RESOLUTION = 1005, ///< 上行动态调整分辨率 + EVT_UP_CHANGE_BITRATE = 1006, ///< 码率动态调整 + EVT_FIRST_FRAME_AVAILABLE = 1007, ///< 首帧画面采集完成 + EVT_START_VIDEO_ENCODER = 1008, ///< 编码器启动成功 + EVT_SNAPSHOT_COMPLETE = 1022, ///< 一帧截图完成 + EVT_CAMERA_REMOVED = 1023, ///< 摄像头设备已被移出(Windows 和 Mac 版 SDK 使用) + EVT_CAMERA_AVAILABLE = 1024, ///< 摄像头设备重新可用(Windows 和 Mac 版 SDK 使用) + EVT_CAMERA_CLOSE = 1025, ///< 关闭摄像头完成(Windows 和 Mac 版 SDK 使用) + EVT_RTMP_PUSH_PUBLISH_START = 1026, ///< 直播,与 RTMP 服务器连接后,收到 NetStream.Publish.Start 消息,表明流发布成功(SDK 内部事件,不会对外抛出) + EVT_HW_ENCODER_START_SUCC = 1027, ///< 硬编码器启动成功 + EVT_SW_ENCODER_START_SUCC = 1028, ///< 软编码器启动成功 + + EVT_PLAY_LIVE_STREAM_CONNECT_SUCC = 2001, ///< 直播,已经连接 RTMP 拉流服务器 + EVT_PLAY_LIVE_STREAM_BEGIN = 2002, ///< 直播,已经与 RTMP 服务器握手完毕,开始拉流 + EVT_RENDER_FIRST_I_FRAME = 2003, ///< 渲染首个视频数据包(IDR) + EVT_VIDEO_PLAY_BEGIN = 2004, ///< 视频播放开始 + EVT_VIDEO_PLAY_PROGRESS = 2005, ///< 视频播放进度 + EVT_VIDEO_PLAY_END = 2006, ///< 视频播放结束 + EVT_VIDEO_PLAY_LOADING = 2007, ///< 视频播放 loading + EVT_START_VIDEO_DECODER = 2008, ///< 解码器启动 + EVT_DOWN_CHANGE_RESOLUTION = 2009, ///< 下行视频分辨率改变 + EVT_GET_VODFILE_MEDIAINFO_SUCC = 2010, ///< 点播,获取点播文件信息成功 + EVT_VIDEO_CHANGE_ROTATION = 2011, ///< 视频旋转角度发生改变 + EVT_PLAY_GET_MESSAGE = 2012, ///< 消息事件 + EVT_VOD_PLAY_PREPARED = 2013, ///< 点播,视频加载完毕 + EVT_VOD_PLAY_LOADING_END = 2014, ///< 点播,loading 结束 + EVT_PLAY_LIVE_STREAM_SWITCH_SUCC = 2015, ///< 直播,切流成功(切流可以播放不同画面大小的视频) + EVT_VOD_PLAY_TCP_CONNECT_SUCC = 2016, ///< 点播,TCP 连接成功(SDK 内部事件,不会对外抛出) + EVT_VOD_PLAY_FIRST_VIDEO_PACKET = 2017, ///< 点播,收到首帧数据(SDK 内部事件,不会对外抛出) + EVT_VOD_PLAY_DNS_RESOLVED = 2018, ///< 点播,DNS 解析完成(SDK 内部事件,不会对外抛出) + EVT_VOD_PLAY_SEEK_COMPLETE = 2019, ///< 点播,视频播放 Seek 完成(SDK 内部事件,不会对外抛出) + EVT_VIDEO_DECODER_CACHE_TOO_MANY_FRAMES = 2020, ///< 视频解码器缓存帧数过多,超过40帧(SDK 内部事件,不会对外抛出) + EVT_HW_DECODER_START_SUCC = 2021, ///< 硬解码器启动成功(SDK 内部事件,不会对外抛出) + EVT_SW_DECODER_START_SUCC = 2022, ///< 软解码器启动成功(SDK 内部事件,不会对外抛出) + EVT_AUDIO_JITTER_STATE_FIRST_LOADING = 2023, ///< 音频首次加载(SDK 内部事件,不会对外抛出) + EVT_AUDIO_JITTER_STATE_LOADING = 2024, ///< 音频正在加载(SDK 内部事件,不会对外抛出) + EVT_AUDIO_JITTER_STATE_PLAYING = 2025, ///< 音频正在播放(SDK 内部事件,不会对外抛出) + EVT_AUDIO_JITTER_STATE_FIRST_PLAY = 2026, ///< 音频首次播放(SDK 内部事件,不会对外抛出) + EVT_MIC_START_SUCC = 2027, ///< 麦克风启动成功 + EVT_PLAY_GET_METADATA = 2028, ///< 视频流MetaData事件 + + EVT_ROOM_ENTER = 1018, ///< 进入房间成功 + EVT_ROOM_EXIT = 1019, ///< 退出房间 + EVT_ROOM_USERLIST = 1020, ///< 下发房间成员列表(不包括自己) + EVT_ROOM_NEED_REENTER = 1021, ///< WiFi 切换到4G 会触发断线重连,此时需要重新进入房间(拉取最优的服务器地址) + EVT_ROOM_REQUEST_IP_SUCC = 8001, ///< 拉取接口机服务器地址成功 + EVT_ROOM_CONNECT_SUCC = 8002, ///< 连接接口机服务器成功 + EVT_ROOM_REQUEST_AVSEAT_SUCC = 8003, ///< 请求视频位成功 +} TXLiteAVEvent; + +#endif /* __TXLITEAVCODE_H__ */ diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiteAVSDK.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiteAVSDK.h index 8baba03..ed12e0b 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiteAVSDK.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiteAVSDK.h @@ -6,12 +6,13 @@ // Copyright © 2017年 Tencent. All rights reserved. // -#import <UIKit/UIKit.h> + #import <TXLiteAVSDK_Smart/TXAudioCustomProcessDelegate.h> #import <TXLiteAVSDK_Smart/TXAudioRawDataDelegate.h> #import <TXLiteAVSDK_Smart/TXBitrateItem.h> #import <TXLiteAVSDK_Smart/TXImageSprite.h> +#import <TXLiteAVSDK_Smart/TXLiteAVCode.h> #import <TXLiteAVSDK_Smart/TXLiveAudioSessionDelegate.h> #import <TXLiteAVSDK_Smart/TXLiveBase.h> #import <TXLiteAVSDK_Smart/TXLivePlayConfig.h> diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveAudioSessionDelegate.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveAudioSessionDelegate.h index 29ee5c3..b3209d2 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveAudioSessionDelegate.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveAudioSessionDelegate.h @@ -4,6 +4,7 @@ #import <AVFoundation/AVFoundation.h> @protocol TXLiveAudioSessionDelegate <NSObject> +#if TARGET_OS_IPHONE @optional - (BOOL)setActive:(BOOL)active error:(NSError **)outError; @@ -19,7 +20,6 @@ @optional - (BOOL)setCategory:(NSString *)category mode:(NSString *)mode options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError; - @optional - (BOOL)setPreferredIOBufferDuration:(NSTimeInterval)duration error:(NSError **)outError; @@ -28,6 +28,6 @@ @optional - (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError; - +#endif @end #endif /* TXLiveAudioSessionDelegate_h */ diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveBase.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveBase.h index 7e5b744..df5415f 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveBase.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveBase.h @@ -40,14 +40,14 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) { + (instancetype) sharedInstance; /** 设置log输出级别 - * @prarm level 参见 LOGLEVEL + * @param level 参见 LOGLEVEL * */ + (void) setLogLevel:(TX_Enum_Type_LogLevel)level; /** * 启用或禁用控制台日志打印 - * @param enabled指定是否启用 + * @param enabled 指定是否启用 */ + (void) setConsoleEnabled:(BOOL)enabled; diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayConfig.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayConfig.h index c8bcffa..c778c68 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayConfig.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayConfig.h @@ -1,64 +1,90 @@ +/* + * Module: TXLivePlayConfig @ TXLiteAVSDK + * + * Function: 腾讯云直播播放器的参数配置模块 + * + * Version: <:Version:> + */ + #import <Foundation/Foundation.h> +/** + * 腾讯云直播播放器的参数配置模块 + * + * 主要负责 TXLivePlayer 对应的参数设置,其中绝大多数设置项在播放开始之后再设置是无效的。 + */ @interface TXLivePlayConfig : NSObject -/// 播放器缓存时间 : 单位秒,取值需要大于0, 默认值为5 +///////////////////////////////////////////////////////////////////////////////// +// +// 常用设置项 +// +///////////////////////////////////////////////////////////////////////////////// + +///【字段含义】播放器缓存时间,单位秒,取值需要大于0,默认值:5 @property(nonatomic, assign) float cacheTime; -/** - * 是否自动调整播放器缓存时间 : YES:启用自动调整,自动调整的最大值和最小值可以分别通过修改maxCacheTime和minCacheTime来设置; - * NO:关闭自动调整,采用默认的指定缓存时间(1s),可以通过修改cacheTime来调整缓存时间. - * 默认值为YES - */ +///【字段含义】是否自动调整播放器缓存时间,默认值:YES +/// YES:启用自动调整,自动调整的最大值和最小值可以分别通过修改 maxCacheTime 和 minCacheTime 来设置 +/// NO:关闭自动调整,采用默认的指定缓存时间(1s),可以通过修改 cacheTime 来调整缓存时间 @property(nonatomic, assign) BOOL bAutoAdjustCacheTime; -/// 播放器缓存自动调整的最大时间 : 单位秒,取值需要大于0, 默认值为5 +///【字段含义】播放器缓存自动调整的最大时间,单位秒,取值需要大于0,默认值:5 @property(nonatomic, assign) float maxAutoAdjustCacheTime; -/// 播放器缓存自动调整的最小时间 : 单位秒,取值需要大于0, 默认值为1 +///【字段含义】播放器缓存自动调整的最小时间,单位秒,取值需要大于0,默认值为1 @property(nonatomic, assign) float minAutoAdjustCacheTime; -/// 播放器视频卡顿报警阈值,只有渲染间隔超过这个阈值的卡顿才会有PLAY_WARNING_VIDEO_PLAY_LAG通知 +///【字段含义】播放器视频卡顿报警阈值,单位毫秒 +///【推荐取值】800 +///【特别说明】只有渲染间隔超过这个阈值的卡顿才会有 PLAY_WARNING_VIDEO_PLAY_LAG 通知 @property(nonatomic, assign) int videoBlockThreshold; -/// 播放器连接重试次数 : 最小值为 1, 最大值为 10, 默认值为 3 +///【字段含义】播放器遭遇网络连接断开时 SDK 默认重试的次数,取值范围1 - 10,默认值:3。 @property(nonatomic, assign) int connectRetryCount; -/// 播放器连接重试间隔 : 单位秒,最小值为 3, 最大值为 30, 默认值为 3 +///【字段含义】网络重连的时间间隔,单位秒,取值范围3 - 30,默认值:3。 @property(nonatomic, assign) int connectRetryInterval; -/// 是否开启回声消除, 默认值为NO +///【字段含义】是否开启回声消除, 默认值为 NO @property(nonatomic, assign) BOOL enableAEC; -/// 是否开启消息通道, 默认值为NO +///【字段含义】是否开启消息通道, 默认值为 NO @property(nonatomic, assign) BOOL enableMessage; -/** - 视频渲染对象回调的视频格式. 仅支持 kCVPixelFormatType_420YpCbCr8Planar和kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, 默认值为kCVPixelFormatType_420YpCbCr8Planar -点播支持kCVPixelFormatType_32BGRA回调 -点播支持kCVPixelFormatType_32BGRA回调 -点播支持kCVPixelFormatType_32BGRA回调 - */ +///【字段含义】是否开启 MetaData 数据回调,默认值为 NO。 +/// YES:SDK 通过 EVT_PLAY_GET_METADATA 消息抛出视频流的 MetaData 数据; +/// NO:SDK 不抛出视频流的 MetaData 数据。 +/// 标准直播流都会在最开始的阶段有一个 MetaData 数据头,该数据头支持定制。 +/// 您可以通过 TXLivePushConfig 中的 metaData 属性设置一些自定义数据,再通过 TXLivePlayListener 中的 +/// onPlayEvent(EVT_PLAY_GET_METADATA) 消息接收到这些数据。 +///【特别说明】每条音视频流中只能设置一个 MetaData 数据头,除非断网重连,否则 TXLivePlayer 的 EVT_PLAY_GET_METADATA 消息也只会收到一次。 +@property(nonatomic, assign) BOOL enableMetaData; + +///【字段含义】视频渲染对象回调的视频格式,默认值:kCVPixelFormatType_420YpCbCr8Planar +///【特别说明】支持:kCVPixelFormatType_420YpCbCr8Planar 和 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange @property(nonatomic, assign) OSType playerPixelFormatType; -/** - * 只对加速拉流生效,用于指定加速拉流是否开启就近选路 (当前版本不启用) - */ + +///////////////////////////////////////////////////////////////////////////////// +// +// 待废弃设置项 +// +///////////////////////////////////////////////////////////////////////////////// + +///【字段含义】是否开启就近选路,待废弃,默认值:YES @property(nonatomic, assign) BOOL enableNearestIP; -/** - * RTMP传输通道的类型,取值为枚举值:TX_Enum_Type_RTMPChannel, 默认值为RTMP_CHANNEL_TYPE_AUTO - * RTMP_CHANNEL_TYPE_AUTO = 0, //自动 - * RTMP_CHANNEL_TYPE_STANDARD = 1, //标准的RTMP协议,网络层采用TCP协议 - * RTMP_CHANNEL_TYPE_PRIVATE = 2, //标准的RTMP协议,网络层采用私有通道传输(在UDP上封装的一套可靠快速的传输通道),能够更好地抵抗网络抖动;对于播放来说,私有传输通道只有在拉取低时延加速流时才可以生效 - - */ +///【字段含义】RTMP 传输通道的类型,待废弃,默认值为:RTMP_CHANNEL_TYPE_AUTO @property (nonatomic, assign) int rtmpChannelType; -/// 视频缓存目录,点播MP4、HLS有效 + +#if TARGET_OS_IPHONE +///【字段含义】视频缓存目录,点播 MP4、HLS 有效 @property NSString *cacheFolderPath; -/// 最多缓存文件个数 +///【字段含义】最多缓存文件个数,默认值:0 @property int maxCacheItems; -/// 自定义HTTP Headers +///【字段含义】自定义 HTTP Headers @property NSDictionary *headers; +#endif @end diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayListener.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayListener.h index 937aa31..1e7e3e5 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayListener.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayListener.h @@ -1,32 +1,28 @@ +/* + * Module: TXLivePlayListener @ TXLiteAVSDK + * + * Function: 腾讯云直播播放的回调通知 + * + * Version: <:Version:> + */ #import <Foundation/Foundation.h> #import "TXLiveSDKTypeDef.h" - -/// 直播通知 -@protocol TXLivePlayListener <NSObject> -/** - * 直播事件通知 - * - * @param EvtID 参见TXLiveSDKTypeDef.h - * @param param 参见TXLiveSDKTypeDef.h - */ --(void) onPlayEvent:(int)EvtID withParam:(NSDictionary*)param; +/// 腾讯云直播播放的回调通知 +@protocol TXLivePlayListener <NSObject> -/** - * 网络状态通知 - * - * @param param 参见TXLiveSDKTypeDef.h +/** + * 直播事件通知 + * @param EvtID 参见 TXLiveSDKEventDef.h + * @param param 参见 TXLiveSDKTypeDef.h */ --(void) onNetStatus:(NSDictionary*) param; - +- (void)onPlayEvent:(int)EvtID withParam:(NSDictionary *)param; /** - * SDK内部使用:通知FLV、VOD底层播放器初始化成功,FLV、VOD可以发起网络连接了; - * 底层播放器在SDK逻辑线程异步初始化,如果FLV、VOD先发起网络连接,会出现网络连接成功且收到音视频包后,底层播放器还没有初始化的问题 - * + * 网络状态通知 + * @param param 参见 TXLiveSDKTypeDef.h */ -@optional --(void) onRecvConnectNofity; +- (void)onNetStatus:(NSDictionary *)param; @end diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayer.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayer.h index dbd8824..cc634f4 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayer.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePlayer.h @@ -1,13 +1,14 @@ -// -// TXLivePlayer.h -// LiteAV -// -// Created by alderzhang on 2017/5/24. -// Copyright © 2017年 Tencent. All rights reserved. -// +/* + * + * Module: TXLivePlayer @ TXLiteAVSDK + * + * Function: 腾讯云直播播放器 + * + * Version: <:Version:> + */ #import <Foundation/Foundation.h> -#import <UIKit/UIKit.h> +#import "TXLiveSDKTypeDef.h" #import "TXLivePlayListener.h" #import "TXLivePlayConfig.h" #import "TXVideoCustomProcessDelegate.h" @@ -15,187 +16,321 @@ #import "TXLiveRecordListener.h" #import "TXAudioRawDataDelegate.h" +/** + * 支持的直播和点播类型 + * + * @note 新版本的点播 SDK,推荐参考 TXVodPlayer.h + */ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) { - /// RTMP直播 + /// RTMP 直播 PLAY_TYPE_LIVE_RTMP = 0, - /// FLV直播 - PLAY_TYPE_LIVE_FLV, - /// FLV点播 - PLAY_TYPE_VOD_FLV, - /// HLS点播 - PLAY_TYPE_VOD_HLS, + /// FLV 直播 + PLAY_TYPE_LIVE_FLV = 1, +#if TARGET_OS_IPHONE + /// FLV 点播 + PLAY_TYPE_VOD_FLV = 2, + /// HLS 点播 + PLAY_TYPE_VOD_HLS = 3, /// MP4点播 - PLAY_TYPE_VOD_MP4, - /// RTMP直播加速播放 - PLAY_TYPE_LIVE_RTMP_ACC, + PLAY_TYPE_VOD_MP4 = 4, +#endif + /// RTMP 直播加速播放 + PLAY_TYPE_LIVE_RTMP_ACC = 5, +#if TARGET_OS_IPHONE /// 本地视频文件 - PLAY_TYPE_LOCAL_VIDEO, + PLAY_TYPE_LOCAL_VIDEO = 6, +#endif }; -/// 直播播放器 + +/** + * 视频播放器 + * + * 主要负责将直播流的音视频画面进行解码和本地渲染,包含如下技术特点: + * - 针对腾讯云的拉流地址,可使用低延时拉流,实现直播连麦等相关场景。 + * - 针对腾讯云的拉流地址,可使用直播时移功能,能够实现直播观看与时移观看的无缝切换。 + * - 支持自定义的音视频数据处理,让您可以根据项目需要处理直播流中的音视频数据后,进行渲染以及播放。 + */ @interface TXLivePlayer : NSObject -/// 播放器回调 + +///////////////////////////////////////////////////////////////////////////////// +// +// (一)SDK 基础函数 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name SDK 基础函数 +/// @{ +/** + * 1.1 设置播放回调,见 “TXLivePlayListener.h” 文件中的详细定义 + */ @property(nonatomic, weak) id <TXLivePlayListener> delegate; -/// 视频处理回调 + +/** + * 1.2 设置视频处理回调,见 “TXVideoCustomProcessDelegate.h” 文件中的详细定义 + */ @property(nonatomic, weak) id <TXVideoCustomProcessDelegate> videoProcessDelegate; -/// 音频处理回调 + +/** + * 1.3 设置音频处理回调,见 “TXAudioRawDataDelegate.h” 文件中的详细定义 + */ @property(nonatomic, weak) id <TXAudioRawDataDelegate> audioRawDataDelegate; -/// 是否硬件加速 + +/** + * 1.4 是否开启硬件加速,默认值:NO + */ @property(nonatomic, assign) BOOL enableHWAcceleration; -/// 直播配置参数 + +/** + * 1.5 设置 TXLivePlayConfig 播放配置项,见 “TXLivePlayConfig.h” 文件中的详细定义 + */ @property(nonatomic, copy) TXLivePlayConfig *config; -/// 短视频录制回调 -@property (nonatomic, weak) id<TXLiveRecordListener> recordDelegate; -/// startPlay后是否立即播放,默认YES。点播有效 + +#if TARGET_OS_IPHONE +/** + * 1.6 设置短视频录制回调,见 “TXLiveRecordListener.h” 文件中的详细定义 + */ +@property (nonatomic, weak) id<TXLiveRecordListener> recordDelegate; + +/** + * 1.7 startPlay 后是否立即播放,默认 YES,只有点播有效 + */ @property BOOL isAutoPlay; +#endif +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (二)播放基础接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 播放基础接口 +/// @{ /** - * 创建Video渲染Widget,该控件承载着视频内容的展示。 - * @param frame Widget在父view中的rc - * @param view 父view - * @param idx Widget在父view上的层级位置 - * @discussion 变更历史:1.5.2版本将参数frame废弃,设置此参数无效,控件大小与参数view的大小保持一致,如需修改控件的大小及位置,请调整父view的大小及位置. 参考文档:https://www.qcloud.com/doc/api/258/4736#step-3.3A-.E7.BB.91.E5.AE.9A.E6.B8.B2.E6.9F.93.E7.95.8C.E9.9D.A2 + * 2.1 创建 Video 渲染 View,该控件承载着视频内容的展示。 + * + * 变更历史:1.5.2版本将参数 frame 废弃,设置此参数无效,控件大小与参数 view 的大小保持一致,如需修改控件的大小及位置,请调整父 view 的大小及位置。 参考文档:[绑定渲染界面](https://www.qcloud.com/doc/api/258/4736#step-3.3A-.E7.BB.91.E5.AE.9A.E6.B8.B2.E6.9F.93.E7.95.8C.E9.9D.A2) + * + * @param frame Widget 在父 view 中的 frame + * @param view 父 view + * @param idx Widget 在父 view 上 的层级位置 */ -- (void)setupVideoWidget:(CGRect)frame containView:(UIView *)view insertIndex:(unsigned int)idx; +- (void)setupVideoWidget:(CGRect)frame containView:(TXView *)view insertIndex:(unsigned int)idx; -/* 修改VideoWidget frame - * 变更历史:1.5.2版本将此方法废弃,调用此方法无效,如需修改控件的大小及位置,请调整父view的大小及位置 +/* + * 修改 VideoWidget frame + * 变更历史:1.5.2版本将此方法废弃,调用此方法无效,如需修改控件的大小及位置,请调整父 view 的大小及位置 * 参考文档:https://www.qcloud.com/doc/api/258/4736#step-3.3A-.E7.BB.91.E5.AE.9A.E6.B8.B2.E6.9F.93.E7.95.8C.E9.9D.A2 */ //- (void)resetVideoWidgetFrame:(CGRect)frame; /** - * 移除Video渲染Widget + * 2.2 移除 Video 渲染 Widget */ - (void)removeVideoWidget; - /** - * 启动从指定URL播放RTMP音视频流 - * @param url 完整的URL(如果播放的是本地视频文件,这里传本地视频文件的完整路径) - * @prarm playType 播放类型 - * @return 0 = OK + * 2.3 启动从指定 URL 播放 RTMP 音视频流 + * + * @param url 完整的 URL(如果播放的是本地视频文件,这里传本地视频文件的完整路径) + * @param playType 播放类型 + * @return 0表示成功,其它为失败 */ - (int)startPlay:(NSString *)url type:(TX_Enum_PlayType)playType; /** - * 停止播放音视频流 - * @return 0 = OK + * 2.4 停止播放音视频流 + * + * @return 0:成功;其它:失败 */ - (int)stopPlay; /** - * 是否正在播放 + * 2.5 是否正在播放 + * * @return YES 拉流中,NO 没有拉流 */ -- (bool)isPlaying; +- (BOOL)isPlaying; /** - * 暂停播放 - * @discussion 适用于点播,直播(此接口会暂停数据拉流,不会销毁播放器,暂停后,播放器会显示最后一帧数据图像) + * 2.6 暂停播放 + * + * 适用于点播,直播(此接口会暂停数据拉流,不会销毁播放器,暂停后,播放器会显示最后一帧数据图像) */ - (void)pause; /** - * 继续播放,适用于点播,直播 + * 2.6 继续播放,适用于点播,直播 */ - (void)resume; +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (三)视频相关接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 视频相关接口 +/// @{ /** - * 直播时移准备,拉取该直播流的起始播放时间。 - @ @param domain 时移域名 - * @param bizId 流bizId - * @return 0 = OK,-1 = 无播放地址,-2 = appId未配置 - * @discussion 使用时移功能需在播放开始后调用此方法,否者时移失败。时移的使用请参考文档 https://cloud.tencent.com/document/product/266/9237 - * @warning 非腾讯云直播地址不能时移 + * 3.1 设置画面的方向 + * + * @param rotation 方向 + * @see TX_Enum_Type_HomeOrientation */ -- (int)prepareLiveSeek:(NSString*)domain bizId:(NSInteger)bizId; +- (void)setRenderRotation:(TX_Enum_Type_HomeOrientation)rotation; /** - * 停止时移播放,返回直播 - * @return 0 = OK + * 3.2 设置画面的裁剪模式 + * + * @param renderMode 裁剪 + * @see TX_Enum_Type_RenderMode */ -- (int)resumeLive; +- (void)setRenderMode:(TX_Enum_Type_RenderMode)renderMode; +#if TARGET_OS_IPHONE /** - * 播放跳转到音视频流某个时间 - * @param time 流时间,单位为秒 - * @return 0 = OK + * 3.3 截屏 + * + * @param snapshotCompletionBlock 通过回调返回当前图像 */ -- (int)seek:(float)time; +- (void)snapshot:(void (^)(TXImage *))snapshotCompletionBlock; +#endif + +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (四)音频相关接口 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 音频相关接口 +/// @{ /** - * 设置画面的方向 - * @param rotation 方向 - * @see TX_Enum_Type_HomeOrientation + * 4.1 设置静音 */ -- (void)setRenderRotation:(TX_Enum_Type_HomeOrientation)rotation; +- (void)setMute:(BOOL)bEnable; +#if TARGET_OS_IPHONE /** - * 设置画面的裁剪模式 - * @param renderMode 裁剪 - * @see TX_Enum_Type_RenderMode + * 4.2 设置声音播放模式(切换扬声器,听筒) + * @param audioRoute 声音播放模式 */ -- (void)setRenderMode:(TX_Enum_Type_RenderMode)renderMode; ++ (void)setAudioRoute:(TXAudioRouteType)audioRoute; +#endif + +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (五)直播时移相关接口 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 直播时移相关接口 +/// @{ /** - * 设置静音 + * 5.1 直播时移准备,拉取该直播流的起始播放时间。 + * + * 使用时移功能需在播放开始后调用此方法,否则时移失败。时移的使用请参考文档 [超级播放器](https://cloud.tencent.com/document/product/881/20208#.E6.97.B6.E7.A7.BB.E6.92.AD.E6.94.BE) + * + * @warning 非腾讯云直播地址不能时移 + * + * @param domain 时移域名 + * @param bizId 流 bizId + * + * @return 0:OK;-1:无播放地址;-2:appId 未配置 */ -- (void)setMute:(BOOL)bEnable; +- (int)prepareLiveSeek:(NSString*)domain bizId:(NSInteger)bizId; -/*视频录制*/ /** - * 开始录制短视频 - * @param recordType 参见TXRecordType定义 - * @return 0 成功;-1 正在录制短视频;-2 videoRecorder初始化失败; + * 5.2 停止时移播放,返回直播 + * + * @return 0:成功;其它:失败 */ --(int) startRecord:(TXRecordType)recordType; +- (int)resumeLive; -/* - * 结束录制短视频 - * @return 0 成功;-1 不存在录制任务; -2 videoRecorder未初始化; +#if TARGET_OS_IPHONE +/** + * 5.3 播放跳转到音视频流某个时间 + * @param time 流时间,单位为秒 + * @return 0:成功;其它:失败 */ --(int) stopRecord; +- (int)seek:(float)time; +#endif -/* - * 截屏 - * @param snapshotCompletionBlock 通过回调返回当前图像 +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (六)视频录制相关接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 视频录制相关接口 +/// @{ +#if TARGET_OS_IPHONE +/** + * 6.1 开始录制短视频 + * + * @param recordType 参见 TXRecordType 定义 + * @return 0:成功;1:正在录制短视频;-2:videoRecorder 初始化失败。 */ -- (void)snapshot:(void (^)(UIImage *))snapshotCompletionBlock; +- (int)startRecord:(TXRecordType)recordType; /** - * 设置播放速率 - * @param rate 正常速度为1.0;小于为慢速;大于为快速。最大建议不超过2.0 + * 6.2 结束录制短视频 + * + * @return 0:成功;1:不存在录制任务;-2:videoRecorder 未初始化。 */ -- (void)setRate:(float)rate; +- (int)stopRecord; /** - * 设置状态浮层view在渲染view上的边距 - * @prarm margin 边距 + * 6.3 设置播放速率 + * + * @param rate 正常速度为1.0;小于为慢速;大于为快速。最大建议不超过2.0 */ -- (void)setLogViewMargin:(UIEdgeInsets)margin; +- (void)setRate:(float)rate; +#endif + +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (七)更多实用接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 更多实用接口 +/// @{ /** - * 是否显示播放状态统计及事件消息浮层view - * @prarm isShow 是否显示 + * 7.1 设置状态浮层 view 在渲染 view 上的边距 + * + * @param margin 边距 */ -- (void)showVideoDebugLog:(BOOL)isShow; +- (void)setLogViewMargin:(TXEdgeInsets)margin; /** - * 设置声音播放模式(切换扬声器,听筒) - * @prarm audioRoute 声音播放模式 + * 7.2 是否显示播放状态统计及事件消息浮层 view + * + * @param isShow 是否显示 */ -+ (void)setAudioRoute:(TXAudioRouteType)audioRoute; +- (void)showVideoDebugLog:(BOOL)isShow; /** - * flv直播无缝切换 + * 7.3 FLV 直播无缝切换 * - * 参 数: - * playUrl 播放地址 - * @return 0 = OK - * @warning playUrl必须是当前播放直播流的不同清晰度,切换到无关流地址可能会失败 + * @param playUrl 播放地址 + * @return 0:成功;其它:失败 + * @warning playUrl 必须是当前播放直播流的不同清晰度,切换到无关流地址可能会失败 */ - (int)switchStream:(NSString *)playUrl; @end + +/// @} diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePush.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePush.h index 2a1bc28..c3efc38 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePush.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePush.h @@ -1,406 +1,675 @@ -// -// TXLivePush.h -// LiteAV -// -// Created by alderzhang on 2017/5/24. -// Copyright © 2017年 Tencent. All rights reserved. -// +/* + * Module: TXLivePusher @ TXLiteAVSDK + * + * Function: 腾讯云直播推流用 RTMP SDK + * + * + * Version: <:Version:> + */ #import <Foundation/Foundation.h> #import <VideoToolbox/VideoToolbox.h> -#import <UIKit/UIKit.h> +#if TARGET_OS_IPHONE #import <ReplayKit/ReplayKit.h> +#endif #import "TXLivePushConfig.h" #import "TXLivePushListener.h" #import "TXVideoCustomProcessDelegate.h" #import "TXAudioCustomProcessDelegate.h" #import "TXLiveRecordListener.h" +#import "TXLiveSDKTypeDef.h" +#import <AVFoundation/AVFoundation.h> -///推流器 +/** + * 直播推流类 + * + * 主要负责将本地的音视频画面进行编码和 RTMP 推送,包含如下技术特点: + * + * - 针对腾讯云的推流地址,会采用 QUIC 协议进行加速,配合改进后的 BBR2 带宽测算方案,可以最大限度的利用主播的上行带宽,降低直播卡顿率。 + * - 内嵌套的 Qos 流量控制技术具备上行网络自适应能力,可以根据主播端网络的具体情况实时调节音视频数据量。 + * - 内嵌多套美颜磨皮算法(自然&光滑)和多款色彩空间滤镜(支持自定义滤镜),可以根据需要自行选择。 + * - 商业版包含了基于优图 AI 人脸识别技术的大眼、瘦脸、隆鼻以及动效挂架,只需要购买**优图 License**就可以零成本集成。 + * - 支持自定义的音视频采集和渲染,让您可以根据项目需要选择自己的音视频数据源。 + */ @interface TXLivePush : NSObject -///推流参数配置 -///@see TXLivePushConfig -@property(nonatomic, copy) TXLivePushConfig *config; - -///推流回调 -///@see TXLivePushListener; -@property(nonatomic, weak) id <TXLivePushListener> delegate; - -///视频自定义处理回调 -///@see TXVideoCustomProcessDelegate -@property(nonatomic, weak) id <TXVideoCustomProcessDelegate> videoProcessDelegate; - -///音频自定义处理回调 -///@see TXAudioCustomProcessDelegate -@property(nonatomic, weak) id <TXAudioCustomProcessDelegate> audioProcessDelegate; - -///推流端录制回调 -///@see TXLiveRecordListener -@property (nonatomic, weak) id<TXLiveRecordListener> recordDelegate; -///当前推流URL -@property(nonatomic, readonly) NSString *rtmpURL; -///当前是否为前置摄像头 -@property(nonatomic, readonly) BOOL frontCamera; +///////////////////////////////////////////////////////////////////////////////// +// +// (一)SDK 基础函数 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name SDK 基础函数 +/// @{ /** - 初始化推流器 - @param config 推流参数配置 + * 1.1 创建 TXLivePusher 示例 + * + * @param config TXLivePushConfig 推流配置项,见 “TXLivePushConfig.h” 文件中的详细定义 */ - (id)initWithConfig:(TXLivePushConfig *)config; /** - 启动到指定URL地址推流 - @param rtmpURL 推流地址 - @return 0:启动成功 -1:出错 + * 1.2 设置 TXLivePushConfig 推流配置项,见 “TXLivePushConfig.h” 文件中的详细定义 */ -- (int)startPush:(NSString *)rtmpURL; +@property(nonatomic,copy) TXLivePushConfig *config; /** -停止推流 + * 1.3 设置推流回调接口,见“TXLivePushListener.h” 文件中的详细定义 */ -- (void)stopPush; +@property(nonatomic,weak) id <TXLivePushListener> delegate; + +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (二)推流基础接口 +// +///////////////////////////////////////////////////////////////////////////////// +/// @name 推流基础接口 +/// @{ /** - 后台推送默认数据,在切后台或打断场合需要调用 - 当从前台切到后台的时候,调用pausePush会推配置里设置的图片(TXLivePushConfig.pauseImg) - - pauseImg 设置后台推流的默认图片,不设置为默认黑色背景 - pauseFps 设置后台推流帧率,最小值为5,最大值为20,默认10 - pauseTime 设置后台推流持续时长,单位秒,默认300秒 - 具体使用方式请参考demo里面的示例 - @note 暂停推流,后台视频发送TXLivePushConfig里面设置的图像,音频会继续录制声音发送, 如果不需要录制声音,需要再调下setMute接口 - */ -- (void)pausePush; + * 2.1 启动摄像头预览 + * + * 启动预览后并不会立刻开始 RTMP 推流,需要调用 startPush() 才能真正开始推流。 + * + * @param view 承载视频画面的控件 + */ +- (int)startPreview:(TXView *)view; -///恢复推流, 当从后台回到前台的时候,调用resumePush恢复推送camera采集的数据 -- (void)resumePush; +/** + * 2.2 停止摄像头预览 + */ +- (void)stopPreview; +/** + * 2.3 启动 RTMP 推流 + * + * 针对腾讯云的推流地址,会采用 QUIC 协议进行加速,配合改进后的 BBR2 带宽测算方案,可以最大限度的利用主播的上行带宽,降低直播卡顿率。 + * + * @param rtmpURL 推流地址,参考文档:[获取推流地址](https://cloud.tencent.com/document/product/267/32720 )。 + * + * @note -5 返回码代表 license 校验失败,TXLivePusher 需要 [license](https://cloud.tencent.com/document/product/454/34750) 校验通过才能工作。 + * + * @return 0: 启动成功;-1: 启动失败;-5:license 校验失败。 + */ +- (int)startPush:(NSString *)rtmpURL; /** - 是否正常推流 - @return YES: 推流中,NO: 没有推流 + * 2.4 停止 RTMP 推流 */ -- (bool)isPublishing; +- (void)stopPush; /** - *视频录制 - *开始录制短视频,开始推流后才能启动录制 - @note 1,录制过程中请勿动态切换分辨率和软硬编,可能导致生成的视频异常 - 2,目前仅支持 企业版 和 Professional SDK版本,其他版本调用无效 - @param videoPath 视频录制后存储路径 - @return - 返回值 | 涵义 - ------|------ - 0 | 成功 - -1 | videoPath 为nil - -2 | 上次录制未结束,请先stopRecord - -3 | 推流未开始 - + * 2.5 暂停摄像头采集并进入垫片推流状态 + * + * SDK 会暂时停止摄像头采集,并使用 TXLivePushConfig.pauseImg 中指定的图片作为替代图像进行推流,也就是所谓的“垫片”。 + * 这项功能常用于 App 被切到后台运行的场景,尤其是在 iOS 系统中,当 App 切到后台以后,操作系统不会再允许该 App 继续使用摄像头。 + * 此时就可以通过调用 pausePush() 进入垫片状态。 + * + * 对于绝大多数推流服务器而言,如果超过一定时间不推视频数据,服务器会断开当前的推流链接。 + * + * 在 TXLivePushConfig 您可以指定: + * - pauseImg 设置后台推流的默认图片,不设置为默认黑色背景。 + * - pauseFps 设置后台推流帧率,最小值为5,最大值为20,默认10。 + * - pauseTime 设置后台推流持续时长,单位秒,默认300秒。 + * + * @note 请注意调用顺序:startPush => ( pausePush => resumePush ) => stopPush(),错误的调用顺序会导致 SDK 表现异常。 */ --(int) startRecord:(NSString *)videoPath; +- (void)pausePush; /** - 结束录制短视频,停止推流后,如果视频还在录制中,SDK内部会自动结束录制 - @return 0: 成功 -1:不存在录制任务; + * 2.6 恢复摄像头采集并结束垫片推流状态 */ --(int) stopRecord; +- (void)resumePush; /** - 开始推流画面的预览 - @param view 预览控件所在的父控件 - @return 0 (异步处理,返回总是0) + * 2.7 查询是否正在推流 + * + * @return YES:推流中;NO:没有在推流。 */ -- (int)startPreview:(UIView *)view; +- (bool)isPublishing; /** - 停止预览 + * 2.8 获取当前推流的 RTMP 地址 */ -- (void)stopPreview; +@property(nonatomic,readonly) NSString *rtmpURL; + +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (三)视频相关接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 视频相关接口 +/// @{ + +/** + * 3.1 设置视频编码质量 + * + * 推荐设置:秀场直播 quality:HIGH_DEFINITION;adjustBitrate:NO;adjustResolution:NO。 + * 参考文档:[设定清晰度](https://cloud.tencent.com/document/product/454/7879#step-4.3A-.E8.AE.BE.E5.AE.9A.E6.B8.85.E6.99.B0.E5.BA.A6) + * + * @param quality 画质类型(标清,高清,超高清) + * @param adjustBitrate 动态码率开关 + * @param adjustResolution 动态切分辨率开关 + * + * @note adjustResolution 早期被引入是为了让 TXLivePusher 能够满足视频通话这一封闭场景下的一些需求,现已不推荐使用。 + * 如果您有视频通话的需求,可以使用我们专门为视频通话打造的 [TRTC](https://cloud.tencent.com/product/trtc) 服务。 + * 由于目前很多 H5 播放器不支持分辨率动态变化,所以开启分辨率自适应以后,会导致 H5 播放端和录制文件的很多兼容问题。 + */ +- (void)setVideoQuality:(TX_Enum_Type_VideoQuality)quality + adjustBitrate:(BOOL) adjustBitrate + adjustResolution:(BOOL) adjustResolution; + /** - 切换前后摄像头 + * 3.2 切换前后摄像头(iOS) */ - (int)switchCamera; - -/** 设置镜像 - @param isMirror YES:播放端看到的是镜像画面 NO:播放端看到的是非镜像画面 - @note 推流端前置摄像头默认看到的是镜像画面,后置摄像头默认看到的是非镜像画面 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE +/** + * 3.2 选择摄像头(macOS) */ -- (void)setMirror:(BOOL)isMirror; - +- (void)selectCamera:(AVCaptureDevice *)camera; +#endif /** - 设置美颜 和 美白 效果级别 - @param beautyStyle TX_Enum_Type_BeautyStyle - @param beautyLevel : 美颜级别取值范围 0 ~ 9; 0 表示关闭 1 ~ 9值越大 效果越明显。 - @param whitenessLevel : 美白级别取值范围 0 ~ 9; 0 表示关闭 1 ~ 9值越大 效果越明显。 - @param ruddinessLevel : 红润级别取值范围 0 ~ 9; 0 表示关闭 1 ~ 9值越大 效果越明显。 - @see TX_Enum_Type_BeautyStyle -*/ -- (void)setBeautyStyle:(TX_Enum_Type_BeautyStyle)beautyStyle beautyLevel:(float)beautyLevel whitenessLevel:(float)whitenessLevel ruddinessLevel:(float)ruddinessLevel; + * 3.3 查询当前是否为前置摄像头 + */ +@property(nonatomic,readonly) BOOL frontCamera; /** - 设置大眼级别(企业版有效,其它版本设置此参数无效) - @param eyeScaleLevel 大眼级别取值范围 0 ~ 9; 0 表示关闭 1 ~ 9值越大 效果越明显。 + * 3.4 设置视频镜像效果 + * + * 由于前置摄像头采集的画面是取自手机的观察视角,如果将采集到的画面直接展示给观众,是完全没有问题的。 + * 但如果将采集到的画面也直接显示给主播,则会跟主播照镜子时的体验完全相反,会让主播感觉到很奇怪。 + * 因此,SDK 会默认开启本地摄像头预览画面的镜像效果,让主播直播时跟照镜子时保持一个体验效果。 + * + * setMirror 所影响的则是观众端看到的视频效果,如果想要保持观众端看到的效果跟主播端保持一致,需要开启镜像; + * 如果想要让观众端看到正常的未经处理过的画面(比如主播弹吉他的时候有类似需求),则可以关闭镜像。 + * + * @note 仅当前使用前置摄像头时,setMirror 接口才会生效,在使用后置摄像头时此接口无效。 + * + * @param isMirror YES:播放端看到的是镜像画面;NO:播放端看到的是非镜像画面。 */ -- (void)setEyeScaleLevel:(float)eyeScaleLevel; +- (void)setMirror:(BOOL)isMirror; -/**设置瘦脸级别(企业版有效,其它版本设置此参数无效) - @param faceScaleLevel 瘦脸级别取值范围 0 ~ 9; 0 表示关闭 1 ~ 9值越大 效果越明显。 +/** + * 3.5 设置本地摄像头预览画面的旋转方向 + * + * 该接口仅能够改变主播本地预览画面的方向,而不会改变观众端的画面效果。 + * 如果希望改变观众端看到的视频画面的方向,比如原来是540x960,希望变成960x540,则可以通过设置 TXLivePushConfig 中的 homeOrientation 来实现。 + * + * <pre> + * // 竖屏推流(HOME 键在下) + * _config.homeOrientation = HOME_ORIENTATION_DOWN; + * [_txLivePublisher setConfig:_config]; + * [_txLivePublisher setRenderRotation:0]; + * // 横屏推流(HOME 键在右) + * _config.homeOrientation = HOME_ORIENTATION_RIGHT; + * [_txLivePublisher setConfig:_config]; + * [_txLivePublisher setRenderRotation:90]; + * </pre> + * + * @param rotation 取值为0 ,90,180,270(其他值无效),表示主播端摄像头预览视频的顺时针旋转角度。 */ -- (void)setFaceScaleLevel:(float)faceScaleLevel; +- (void)setRenderRotation:(int)rotation; /** - 设置指定素材滤镜特效 - @param image 指定素材,即颜色查找表图片。 - @note 一定要用png格式!!!demo用到的滤镜查找表图片位于TXLiteAVDemo/Resource/Beauty/filter/FilterResource.bundle中 + * 3.6 打开后置摄像头旁边的闪关灯 + * + * 此操作对于前置摄像头是无效的,因为绝大多数手机都没有给前置摄像头配置闪光灯。 + * + * @param bEnable YES:打开;NO:关闭。 + * @return YES:打开成功;NO:打开失败。 */ -- (void)setFilter:(UIImage *)image; +- (BOOL)toggleTorch:(BOOL)bEnable; /** - 设置滤镜效果程度 - @prarm specialValue 从0到1,越大滤镜效果越明显,默认取值0.5 + * 3.7 调整摄像头的焦距 + * + * @param distance 焦距大小,取值范围1 - 5,默认值建议设置为1即可。 + * @note 当 distance 为1的时候为最远视角(正常镜头),当为5的时候为最近视角(放大镜头),最大值不要超过5,超过5后画面会模糊不清。 */ -- (void)setSpecialRatio:(float)specialValue; - - +- (void)setZoom:(CGFloat)distance; + /** - 设置V脸(企业版有效,其它版本设置此参数无效) - @param faceVLevel V脸级别取值范围 0 ~ 9; 0 表示关闭 1 ~ 9值越大 效果越明显。 + * 3.8 设置手动对焦区域 + * + * SDK 默认使用摄像头自动对焦功能,您也可以通过 TXLivePushConfig 中的 touchFocus 选项关闭自动对焦,改用手动对焦。 + * 改用手动对焦之后,需要由主播自己点击摄像头预览画面上的某个区域,来手动指导摄像头对焦。 + * + * @note 早期 SDK 版本仅仅提供了手动和自动对焦的选择开关,并不支持设置对焦位置,3.0 版本以后,手动对焦的接口才开放出来。 */ -- (void)setFaceVLevel:(float)faceVLevel; +- (void)setFocusPosition:(CGPoint)touchPoint; + +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (四)美颜相关接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 美颜相关接口 +/// @{ /** - 设置下巴拉伸或收缩(企业版有效,其它版本设置此参数无效) - @param chinLevel 下巴拉伸或收缩级别取值范围 -9 ~ 9; 0 表示关闭 -9收缩 ~ 9拉伸。 + * 4.1 设置美颜级别和美白级别 + * + * @param beautyStyle 使用哪种磨皮算法,支持光滑和自然两种,光滑风格磨皮更加明显,适合秀场直播。见 “TXLiveSDKTypeDef.h” 中的 TX_Enum_Type_BeautyStyle 定义。 + * @param beautyLevel 美颜级别,取值范围0 - 9; 0表示关闭,1 - 9值越大,效果越明显。 + * @param whitenessLevel 美白级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 + * @param ruddinessLevel 红润级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 */ -- (void)setChinLevel:(float)chinLevel; +- (void)setBeautyStyle:(TX_Enum_Type_BeautyStyle)beautyStyle + beautyLevel:(float)beautyLevel + whitenessLevel:(float)whitenessLevel + ruddinessLevel:(float)ruddinessLevel; /** - 设置短脸(企业版有效,其它版本设置此参数无效) - @param faceShortlevel 短脸级别取值范围 0 ~ 9; 0 表示关闭 1 ~ 9值越大 效果越明显。 + * 4.2 设置指定素材滤镜特效 + * + * @note 滤镜图片一定要用 png 格式,demo 用到的滤镜查找表图片位于 TXLiteAVDemo/Resource/Beauty/filter/FilterResource.bundle 中 */ -- (void)setFaceShortLevel:(float)faceShortlevel; +- (void)setFilter:(TXImage *)image; /** - 设置瘦鼻(企业版有效,其它版本设置此参数无效) - @param noseSlimLevel 瘦鼻级别取值范围 0 ~ 9; 0 表示关闭 1 ~ 9值越大 效果越明显。 + * 4.3 设置滤镜浓度 + * + * 在美女秀场等应用场景里,滤镜浓度的要求会比较高,以便更加突显主播的差异。 + * 我们默认的滤镜浓度是0.5,如果您觉得滤镜效果不明显,可以使用下面的接口进行调节。 + * + * @param specialValue 取值范围0 - 1的浮点型数字,取值越大滤镜效果越明显,默认取值0.5。 */ -- (void)setNoseSlimLevel:(float)noseSlimLevel; +- (void)setSpecialRatio:(float)specialValue; +/// @} +///////////////////////////////////////////////////////////////////////////////// +// +// (五)商用企业版美颜和动效挂件 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 商用企业版美颜和动效挂件 +/// @{ /** - 打开闪关灯。 - @param bEnable YES: 打开 NO: 关闭 - @return YES: 打开成功 NO: 打开失败 + * 5.1 设置大眼级别(商用企业版有效,其它版本设置此参数无效) + * + * @param eyeScaleLevel 大眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 */ -- (BOOL)toggleTorch:(BOOL)bEnable; +- (void)setEyeScaleLevel:(float)eyeScaleLevel; /** - 设置本地视频方向 - @param rotation 取值为 0 , 90, 180, 270(其他值无效) 表示推流端本地视频向右旋转的角度 - @note 横竖屏推流,activty旋转可能会改变本地视频流方向,可以设置此参数让本地视频回到正方向,具体请参考demo设置,如果demo里面的设置满足不了您的业务需求,请自行setRenderRotation到自己想要的方向(tips:推流端setRenderRotation不会改变观众端的视频方向) + * 5.2 设置瘦脸级别(商用企业版有效,其它版本设置此参数无效) + * + * @param faceScaleLevel 瘦脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 */ -- (void)setRenderRotation:(int)rotation; +- (void)setFaceScaleLevel:(float)faceScaleLevel; +/** + * 5.3 设置 V 脸级别(商用企业版有效,其它版本设置此参数无效) + * + * @param faceVLevel V 脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 + */ +- (void)setFaceVLevel:(float)faceVLevel; /** - 设置静音 - @param bEnable YES: 静音 NO:关闭静音 + * 5.4 设置下巴拉伸或收缩(商用企业版有效,其它版本设置此参数无效) + * + * @param chinLevel 下巴拉伸或收缩级别,取值范围 -9 - 9;0 表示关闭,小于0表示收缩,大于0表示拉伸。 */ -- (void)setMute:(BOOL)bEnable; +- (void)setChinLevel:(float)chinLevel; /** - 发送客户自定义的音频PCM数据 - @param data 要发送的PCM数据 - @param len 数据长度 - @note 目前SDK只支持16位采样的PCM编码;如果是单声道,请保证传入的PCM长度为2048;如果是双声道,请保证传入的PCM长度为4096 + * 5.5 设置短脸级别(商用企业版有效,其它版本设置此参数无效) + * + * @param faceShortlevel 短脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 */ -- (void)sendCustomPCMData:(unsigned char *)data len:(unsigned int)len; +- (void)setFaceShortLevel:(float)faceShortlevel; /** - 发送自定义的SampleBuffer,内部有简单的帧率控制,发太快会自动丢帧;超时则会重发最后一帧 - @param sampleBuffer 要发送的视频sampleBuffer - @note autoSampleBufferSize优先级高于sampleBufferSize @see TXLivePushConfig - @property sampleBufferSize,设置输出分辨率,如果此分辨率不等于sampleBuffer中数据分辨率则会对视频数据做缩放 - @property autoSampleBufferSize,输出分辨率等于输入分辨率,即sampleBuffer中数据的实际分辨率 + * 5.6 设置瘦鼻级别(商用企业版有效,其它版本设置此参数无效) + * + * @param noseSlimLevel 瘦鼻级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 */ -- (void)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; +- (void)setNoseSlimLevel:(float)noseSlimLevel; /** - Replaykit发送自定义音频包 - @prama sampleBuffer 声音sampleBuffer - @prama sampleBufferType RPSampleBufferTypeAudioApp or RPSampleBufferTypeAudioMic, - @note 当两种声音都发送时,内部做混音;否则只发送一路声音 + * 5.7 设置绿幕背景视频(商用企业版有效,其它版本设置此参数无效) + * + * 此处的绿幕功能并非智能抠背,它需要被拍摄者的背后有一块绿色的幕布来辅助产生特效 + * + * @param file 视频文件路径。支持 MP4;nil 表示关闭特效。 */ -- (void)sendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType; +- (void)setGreenScreenFile:(NSURL *)file; /** - Replaykit发送静音包,在InApp类型录制切后台场合时需要调用。系统屏幕录制不需要 - @param muted YES: 静音 NO:关闭静音 + * 5.8 选择使用哪一款 AI 动效挂件(商用企业版有效,其它版本设置此参数无效) + * + * @param tmplName 动效名称 + * @param tmplDir 动效所在目录 */ -- (void)setSendAudioSampleBufferMuted:(BOOL)muted; +- (void)selectMotionTmpl:(NSString *)tmplName inDir:(NSString *)tmplDir; /** - 调用手动对焦功能 - @param touchPoint 为传入的对焦点位置 - @note 早期SDK版本手动对焦功能是由SDK内部触发,现在把手动对焦的接口开放出来,客户可以根据自己需求触发 ,如果客户调用这个接口,SDK内部触发对焦的逻辑将会停止,避免重复触发对焦逻辑 + * 5.9 设置动效静音(商用企业版有效,其它版本设置此参数无效) + * + * 有些挂件本身会有声音特效,通过此 API 可以关闭这些特效播放时所带的声音效果。 + * + * @param motionMute YES:静音;NO:不静音。 */ -- (void)setFocusPosition:(CGPoint)touchPoint; +- (void)setMotionMute:(BOOL)motionMute; + +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (六)音频相关接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 音频相关接口 +/// @{ /** -调整焦距 -@param distance 焦距大小, 取值范围 1~5 -@note 当为1的时候为最远视角(正常镜头),当为5的时候为最近视角(放大镜头),这里最大值推荐为5,超过5后视频数据会变得模糊不清 -*/ -- (void)setZoom:(CGFloat)distance; + * 6.1 开启静音 + * + * 开启静音后,SDK 并不会继续采集麦克风的声音,但是会用非常低(5kbps 左右)的码率推送伪静音数据, + * 这样做的目的是为了兼容 H5 上的 video 标签,并让录制出来的 MP4 文件有更好的兼容性。 + * + * @param bEnable 是否开启静音。 + */ +- (void)setMute:(BOOL)bEnable; /** - 播放背景音乐, 用于混音处理,背景音与Mic采集到的人声混合 - @param path 本地音乐文件路径 - @return YES:成功 NO:失败 + * 6.2 播放背景音乐 + * + * SDK 会将背景音乐和麦克风采集的声音进行混合并一起推送到云端。 + * + * @param path 本地音乐文件路径 + * @return YES:成功;NO:失败。 */ - (BOOL)playBGM:(NSString *)path; /** - 播放背景音乐 - @param path 本地音乐文件路径 - @param beginNotify 音乐播放开始的回调通知 - @param progressNotify 音乐播放的进度通知,单位毫秒 - @param completeNotify 音乐播放结束的回调通知 - @return YES:成功 NO:失败 - + * 6.3 播放背景音乐(高级版本) + * + * @param path 本地音乐文件路径 + * @param beginNotify 播放开始的回调 + * @param progressNotify 播放进度回调 + * @param completeNotify 播放完毕回调 + * @return YES:成功;NO:失败。 */ - (BOOL) playBGM:(NSString *)path withBeginNotify:(void (^)(NSInteger errCode))beginNotify -withProgressNotify:(void (^)(NSInteger progressMS, NSInteger durationMS))progressNotify +withProgressNotify:(void (^)(NSInteger progressMS,NSInteger durationMS))progressNotify andCompleteNotify:(void (^)(NSInteger errCode))completeNotify; /** - 停止播放背景音乐 - @return YES:成功 NO:失败 + * 6.4 停止播放背景音乐 */ - (BOOL)stopBGM; /** - 暂停播放背景音乐 - @return YES:成功 NO:失败 + * 6.5 暂停播放背景音乐 */ - (BOOL)pauseBGM; /** - 继续播放背景音乐 - @return YES:成功 NO:失败 + * 6.6 继续播放背景音乐 */ - (BOOL)resumeBGM; /** - 获取音乐文件总时长,单位毫秒 - @param path 音乐文件路径,如果path为空,那么返回当前正在播放的music时长 + * 6.7 获取背景音乐文件的总时长,单位是毫秒 + * @param path 音乐文件路径,如果 path 为空,那么返回当前正在播放的背景音乐的时长。 */ - (int)getMusicDuration:(NSString *)path; /** - 设置麦克风的音量大小,播放背景音乐混音时使用,用来控制麦克风音量大小 - @param volume 音量大小,1为正常音量,建议值为0~2,如果需要调大音量可以设置更大的值 - @return YES:成功 NO:失败 + * 6.8 设置混音时背景音乐的音量大小,仅在播放背景音乐混音时使用。 + * + * @param volume 音量大小,1为正常音量,建议值为0 - 2之间的浮点数,如果需要增益可以设置更大的值。 + * @return YES:成功;NO:失败。 + */ +- (BOOL)setBGMVolume:(float)volume; + +/** + * 6.9 设置混音时麦克风音量大小,仅在播放背景音乐混音时使用。 + * + * @param volume 音量大小,1为正常音量,建议值为0 - 2之间的浮点数,如果需要增益可以设置更大的值。 + * @return YES:成功;NO:失败。 */ - (BOOL)setMicVolume:(float)volume; - + /** - 设置背景音乐的音量大小,播放背景音乐混音时使用,用来控制背景音音量大小 - @param volume 音量大小,1为正常音量,建议值为0~2,如果需要调大背景音量可以设置更大的值 - @return YES:成功 NO:失败 + * 6.10 调整背景音乐的音调高低 + * + * @param pitch 音调,默认值是0.0f,范围是-1 - 1之间的浮点数; + * @return YES:成功;NO:失败。 */ -- (BOOL)setBGMVolume:(float)volume; +- (BOOL)setBGMPitch:(float)pitch; /** - 设置背景音的变声类型 - @param pitch 音调, 默认值是0.f;范围是 [-1,1]; - @return YES:成功 NO:失败 + * 6.11 设置混响效果 + * + * @param reverbType 混响类型,详见 “TXLiveSDKTypeDef.h” 中的 TXReverbType 定义。 + * @return YES:成功;NO:失败。 */ -- (BOOL)setBgmPitch:(float)pitch; +- (BOOL)setReverbType:(TXReverbType)reverbType; + +/** + * 6.12 设置变声类型 + * + * @param voiceChangerType 混响类型,详见 “TXLiveSDKTypeDef.h” 中的 voiceChangerType 定义。 + * @return YES:成功;NO:失败。 + */ +- (BOOL)setVoiceChangerType:(TXVoiceChangerType)voiceChangerType; /** -设置视频质量 -@param quality 画质类型(标清,高清,超高清) -@param adjustBitrate 动态码率开关 -@param adjustResolution 动态切分辨率开关 + * 6.13 指定背景音乐的播放位置 + * + * @note 请尽量避免频繁地调用该接口,因为该接口可能会再次读写 BGM 文件,耗时稍高。 + * 例如:当配合进度条使用时,请在进度条拖动完毕的回调中调用,而避免在拖动过程中实时调用。 + * + * @param position 背景音乐的播放位置,单位ms。 + * + * @return 结果是否成功,YES:成功;NO:失败。 */ -- (void)setVideoQuality:(TX_Enum_Type_VideoQuality)quality - adjustBitrate:(BOOL) adjustBitrate - adjustResolution:(BOOL) adjustResolution; +- (BOOL)setBGMPosition:(NSInteger)position; + +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (七)本地录制和截图 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 本地录制接口 +/// @{ /** - 设置混响效果 - @param reverbType :混响类型 ,详见 TXReverbType - @return YES:成功 NO:失败 - @see TXReverbType + * 7.1 录制回调接口,详见 "TXLiveRecordTypeDef.h" 中的 TXLiveRecordListener 定义。 */ -- (BOOL)setReverbType:(TXReverbType)reverbType; +@property (nonatomic,weak) id<TXLiveRecordListener> recordDelegate; + +/** + * 7.2 开始录制短视频 + * + * @note 1. 只有启动推流后才能开始录制,非推流状态下启动录制无效。 + * 2. 出于安装包体积的考虑,仅专业版和商用企业版两个版本的 LiteAVSDK 支持该功能,直播精简版仅定义了接口但并未实现。 + * 3. 录制过程中请勿动态切换分辨率和软硬编,会有很大概率导致生成的视频异常。 + * + * @param videoPath 视频录制后存储路径 + * @return 0:成功;-1:videoPath 为空;-2:上次录制尚未结束,请先调用 stopRecord;-3:推流尚未开始。 + */ +-(int) startRecord:(NSString *)videoPath; /** - 设置变声类型 - @param voiceChangerType 变声类型, 详见 TXVoiceChangerType - @return YES:成功 NO:失败 - @see TXVoiceChangerType + * 7.3 结束录制短视频,当停止推流后,如果视频还在录制中,SDK 内部会自动结束录制。 + * @return 0:成功; -1:不存在录制任务。 */ -- (BOOL)setVoiceChangerType:(TXVoiceChangerType)voiceChangerType; +-(int) stopRecord; + +/** + * 7.4 推流过程中本地截图 + * + * @param snapshotCompletionBlock 截图完成的回调函数 + */ +- (void)snapshot:(void (^)(TXImage *))snapshotCompletionBlock; + +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (八)自定义采集和处理 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 自定义采集和处理 +/// @{ +/** + * 8.1 自定义视频采集,向 SDK 发送自己采集的视频数据。 + * + * 在自定义视频采集模式下,SDK 不再继续从摄像头采集图像,只保留编码和发送能力,您需要定时地发送自己采集的 SampleBuffer。 + * 要开启自定义视频采集,需要完成如下两个步骤: + * + * 1. 开启自定义采集:给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_VIDEO_CAPTURE 选项,代表开启自定义视频采集。 + * 2. 设定视频分辨率:将 TXLivePushConfig 中的 sampleBufferSize 属性设置为您期望的分辨率。 + * 如果期望编码分辨率跟采集分辨率一致,可以不设置 sampleBufferSize 属性,而是将 autoSampleBufferSize 设置为 YES。 + * + * @note 1. 开启自定义视频采集后,即无需再调用 startPreview 来开启摄像头采集。 + * 2. SDK 内部有简单的帧率控制,如果发送太快时 SDK 会自动丢弃多余的帧率;如果超时不发送,SDK 会不断地重复发送的最后一帧。 + * + * @param sampleBuffer 向 SDK 发送的 SampleBuffer + */ +- (void)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer; /** - 设置绿幕文件。仅企业版有效 - @param file 绿幕文件路径。支持mp4; nil 关闭绿幕 + * 8.2 自定义音频采集,向 SDK 发送自己采集的音频 PCM 数据。 + * + * 在自定义音频采集模式下,SDK 不再继续从麦克风采集声音,只保留编码和发送能力,您需要定时地发送自己采集的声音数据(PCM 格式) + * 要开启自定义音频采集,需要完成如下两个步骤: + * + * 1. 开启自定义采集:给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_AUDIO_CAPTURE 选项,代表开启自定义音频采集。 + * 2. 设定音频采样率:将 TXLivePushConfig 中的 audioSampleRate 属性设置为您期望的音频采样率,audioChannels 设置为期望的声道数,默认值:1(单声道)。 + * + * @note SDK 对每次传入的 PCM buffer 大小有严格要求,每一个采样点要求是16位宽。 + * 如果是单声道,请保证传入的 PCM 长度为2048;如果是双声道,请保证传入的 PCM 长度为4096。 + * + * @param data 要发送的 PCM buffer + * @param len 数据长度 */ -- (void)setGreenScreenFile:(NSURL *)file; +- (void)sendCustomPCMData:(unsigned char *)data len:(unsigned int)len; /** - 选择动效。仅企业版有效 - @param tmplName 动效名称 - @param tmplDir 动效所在目录 + * 8.3 自定义音频采集,向 SDK 发送自己采集的音频数据。 + * + * 相比于 sendCustomPCMData,sendAudioSampleBuffer 主要用于 ReplayKit 录屏推流的场景。 + * 要开启自定义音频采集,需要完成如下两个步骤: + * + * 1. 开启自定义采集:给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_AUDIO_CAPTURE 选项,代表开启自定义音频采集。 + * 2. 设定音频采样率:将 TXLivePushConfig 中的 audioSampleRate 属性设置为您期望的音频采样率,audioChannels 设置为期望的声道数,默认值:1(单声道)。 + * + * 当使用 ReplayKit 做录屏推流时,iOS 的 ReplayKit 接口会回调两种类型的声音数据: + * - RPSampleBufferTypeAudioApp,也就是要录制的 App 的声音数据。 + * - RPSampleBufferTypeAudioMic,也就是要录制的麦克风的声音数据。 + * + * 当您通过 sendAudioSampleBuffer 向 SDK 调用各种类型的声音数据时,SDK 内部会进行混流,否则只会发送一路的声音数据。 + * + * @param sampleBuffer 采集到的声音 sampleBuffer + * @param sampleBufferType RPSampleBufferTypeAudioApp:ReplayKit 采集到的 App 声音;RPSampleBufferTypeAudioMic:ReplayKit 采集到的麦克风声音。 + */ +#if TARGET_OS_IPHONE +- (void)sendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType; +#endif + +/** + * 8.4 要求 SDK 发送静音数据 + * + * 该函数配合 sendAudioSampleBuffer 使用,在 InApp 类型录制切后台场合时需要调用,系统屏幕录制不需要。 + * + * @param muted YES;静音;NO;关闭静音。 */ -- (void)selectMotionTmpl:(NSString *)tmplName inDir:(NSString *)tmplDir; +- (void)setSendAudioSampleBufferMuted:(BOOL)muted; /** - 设置动效静音 (企业版有效,其它版本设置此参数无效) - @param motionMute YES 静音, NO 不静音 + * 8.5 自定义视频处理回调 + * + * 自定义视频采集和自定义视频处理不能同时开启,与自定义视频采集不同,自定义视频处理依然是由 SDK 采集摄像头的画面, + * 但 SDK 会通过 TXVideoCustomProcessDelegate(见“TXVideoCustomProcessDelegate.h”)回调将数据回调给您的 App 进行二次加工。 + * + * 如果要开启自定义视频处理,需要给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_VIDEO_PREPROCESS 选项。 + * + * @note 出于性能和稳定性考虑,一般不建议开启此特性。 */ -- (void)setMotionMute:(BOOL)motionMute; +@property(nonatomic,weak) id <TXVideoCustomProcessDelegate> videoProcessDelegate; + +/** + * 8.5 自定义视频处理回调 + * + * 自定义音频采集和自定义音频处理不能同时开启,与自定义音频采集不同,自定义音频处理依然是由 SDK 采集麦克风的声音, + * 但 SDK 会通过 TXAudioCustomProcessDelegate(见“TXAudioCustomProcessDelegate.h”)回调将数据回调给您的 App 进行二次加工。 + * + * 如果要开启自定义音频处理,需要给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_AUDIO_PREPROCESS 选项。 + * + * @note 出于性能和稳定性考虑,一般不建议开启此特性。 + */ +@property(nonatomic,weak) id <TXAudioCustomProcessDelegate> audioProcessDelegate; +/// @} + +///////////////////////////////////////////////////////////////////////////////// +// +// (九)更多实用接口 +// +///////////////////////////////////////////////////////////////////////////////// + +/// @name 更多实用接口 +/// @{ + /** - 设置状态浮层view在渲染view上的边距 - @param margin logView在渲染view上的边距 + * 9.1 发送 SEI 消息,播放端(TXLivePlayer)通过 onPlayEvent(EVT_PLAY_GET_MESSAGE)来接收该消息。 + * + * 本接口是将数据直接塞入视频数据头中,因此不能太大(几个字节比较合适),一般常用于塞入自定义时间戳等信息。 + * + * @note - sendMessage 已经不推荐使用,会导致 H5 播放器产生兼容性问题,请使用 sendMessageEx。 + * - 若您使用过 sendMessage,不推荐立刻升级到 sendMessageEx。 + * - sendMessageEx 发送消息给旧版本的5.0 及以前的 SDK 版本时,消息会无法正确解析,但播放不受影响。 */ -- (void)setLogViewMargin:(UIEdgeInsets)margin; +- (BOOL)sendMessageEx:(NSData *) data; +- (void)sendMessage:(NSData *) data; /** - 是否显示播放状态统计及事件消息浮层view - @param isShow YES:显示 NO:隐藏 + * 9.2 打开包含视频状态信息的调试浮层,该浮层一般用于 SDK 调试期间,外发版本请不要打开。 */ - (void)showVideoDebugLog:(BOOL)isShow; /** - 推流截图 - @params snapshotCompletionBlock 截图完成回调 + * 9.3 设置调试浮层在视频 view 上的位置。 */ -- (void)snapshot:(void (^)(UIImage *))snapshotCompletionBlock; +- (void)setLogViewMargin:(TXEdgeInsets)margin; /** - 发送消息,播放端通过 onPlayEvent(PLAY_EVT_GET_MESSAGE)接收 - @param data 要发送的消息数据 - @note 1. 若您使用过该接口,切换到sendMessageEx接口时会有兼容性问题: sendMessageEx发送消息给旧版本的SDK(5.0及5.0以下)时,消息会无法正确解析,但播放不受影响。 - @note 2. 若您未使用过该接口,请直接使用sendMessageEx + * 9.4 设置推流是否覆盖时钟 + * + * 开始后可以在 TXLivePlayer 中的仪表盘显示画面延迟时间 + * @note 需要双方的时间相同才能获取准确的延迟时间 */ -- (void)sendMessage:(NSData *) data; +- (void)setEnableClockOverlay:(BOOL)enabled; /** - 发送消息,播放端通过 onPlayEvent(PLAY_EVT_GET_MESSAGE)接收 - @param data 要发送的消息数据 - @note 1. 消息大小不允许超过2K - @note 2. 该接口发送消息,能够解决旧的sendMessage接口会导致在iOS上无法播放对应的HLS流的问题 + * 9.5 获取当前推流画面是否有覆盖时钟 */ -- (BOOL)sendMessageEx:(NSData *) data; +- (BOOL)enableClockOverlay; + +/// @} + @end diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePushConfig.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePushConfig.h index 49e049d..a70ed42 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePushConfig.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePushConfig.h @@ -1,151 +1,215 @@ +/* + * Module: TXLivePushConfig @ TXLiteAVSDK + * + * Function: 腾讯云直播推流用 RTMP SDK 的参数配置模块 + * + * Version: <:Version:> + */ + #import <Foundation/NSObject.h> +#if TARGET_OS_IPHONE #import <UIKit/UIKit.h> +#endif #import "TXLiveSDKTypeDef.h" -#define CUSTOM_MODE_AUDIO_CAPTURE 0X001 //客户自定义音频采集 -#define CUSTOM_MODE_VIDEO_CAPTURE 0X002 //客户自定义视频采集 -#define CUSTOM_MODE_AUDIO_PREPROCESS 0X004 //客户自定义音频预处理逻辑 -#define CUSTOM_MODE_VIDEO_PREPROCESS 0X008 //客户自定义视频预处理逻辑 - +#define CUSTOM_MODE_AUDIO_CAPTURE 0X001 ///> 客户自定义音频采集 +#define CUSTOM_MODE_VIDEO_CAPTURE 0X002 ///> 客户自定义视频采集 +#define CUSTOM_MODE_AUDIO_PREPROCESS 0X004 ///> 客户自定义音频处理 +#define CUSTOM_MODE_VIDEO_PREPROCESS 0X008 ///> 客户自定义视频处理 -#define TXRTMPSDK_LINKMIC_STREAMTYPE_MAIN 1 //连麦模式下主播的流 -#define TXRTMPSDK_LINKMIC_STREAMTYPE_SUB 2 //连麦模式下连麦观众的流 +#define TXRTMPSDK_LINKMIC_STREAMTYPE_MAIN 1 ///> 连麦模式下主播的流 +#define TXRTMPSDK_LINKMIC_STREAMTYPE_SUB 2 ///> 连麦模式下连麦观众的流 +/** + * 腾讯云直播推流用 RTMP SDK 的参数配置模块 + * + * 主要负责 TXLivePusher 对应的参数设置,**其中绝大多数设置项在推流开始之后再设置是无效的**。 + */ @interface TXLivePushConfig : NSObject -/// 客户自定义模式 -@property(nonatomic, assign) int customModeType; +///////////////////////////////////////////////////////////////////////////////// +// +// 常用设置项 +// +///////////////////////////////////////////////////////////////////////////////// -/// 美颜强度 0 ~ 9, 默认值为0 -@property(nonatomic, assign) float beautyFilterDepth; +///【字段含义】HOME 键所在方向,用来切换横竖屏推流,默认值:HOME_ORIENTATION_DOWN(竖屏推流)。 +///【特别说明】常用的还有 HOME_ORIENTATION_RIGHT 和 HOME_ORIENTATION_LEFT,也就是横屏推流。 +/// 改变该字段的设置以后,本地摄像头的预览画面方向也会发生改变,请调用 TXLivePush 的 setRenderRotation 进行矫正。 +@property(nonatomic, assign) int homeOrientation; -/// 美白强度:0 ~ 9, 默认值为0 -@property(nonatomic, assign) float whiteningFilterDepth; +///【字段含义】是否允许点击曝光聚焦,默认值:NO。 +@property(nonatomic, assign) BOOL touchFocus; -/// 开启硬件加速, iOS系统版本>8.0 默认开启 -@property(nonatomic, assign) BOOL enableHWAcceleration; +///【字段含义】是否允许双指手势放大预览画面,默认值:NO。 +@property(nonatomic, assign) BOOL enableZoom; -/** - home键所在方向,用来切换横竖屏推流, 默认值为HOME_ORIENTATION_DOWN - - 1. homeOrientation=HOME_ORIENTATION_RIGHT Home键在下竖屏推流 - 2. homeOrientation=HOME_ORIENTATION_RIGHT Home键在右横屏推流 - 3. homeOrientation=HOME_ORIENTATION_LEFT Home键在左横屏推流 - @note 此参数的设置可能会改变推流端本地视频流方向,此参数设置后,请调用TXLivePush 里的setRenderRotation 来修正推流端本地视频流方向,具体请参考demo设置 - @see TX_Enum_Type_HomeOrientation -*/ -@property(nonatomic, assign) int homeOrientation; +///【字段含义】水印图片,设为 nil 等同于关闭水印。 +@property(nonatomic, retain) TXImage *watermark; -/// 视频采集帧率, 默认值为15 -@property(nonatomic, assign) int videoFPS; +///【字段含义】水印图片位置,水印大小为图片实际大小,待废弃,推荐使用 watermarkNormalization。 +@property(nonatomic, assign) CGPoint watermarkPos; + +///【字段含义】水印图片相对于推流分辨率的归一化坐标 +///【推荐取值】假设推流分辨率为:540x960,该字段设置为:(0.1,0.1,0.1,0.0),那么水印的实际像素坐标为: +/// (540 × 0.1, 960 × 0.1, 水印宽度 × 0.1,水印高度会被自动计算) +///【特别说明】watermarkNormalization 的优先级高于 watermarkPos。 +@property(nonatomic, assign) CGRect watermarkNormalization; -/// 视频分辨率, 默认值为VIDEO_RESOLUTION_TYPE_360_640 -/// @see TX_Enum_Type_VideoResolution + +///////////////////////////////////////////////////////////////////////////////// +// +// 垫片推流(App 切后台) +// +///////////////////////////////////////////////////////////////////////////////// + +///【字段含义】垫片推流的最大持续时间,单位秒,默认值:300s。 +///【特别说明】调用 TXLivePusher 的 pausePush() 接口,会暂停摄像头采集并进入垫片推流状态,如果该状态一直保持, +/// 可能会消耗主播过多的手机流量,本字段用于指定垫片推流的最大持续时间,超过后即断开与云服务器的连接。 +@property(nonatomic, assign) int pauseTime; + +///【字段含义】垫片推流时的视频帧率,取值范围3 - 8,默认值:5 FPS。 +@property(nonatomic, assign) int pauseFps; + +///【字段含义】垫片推流时使用的图片素材,最大尺寸不能超过1920 x 1920。 +@property(nonatomic, retain) TXImage *pauseImg; + + +///////////////////////////////////////////////////////////////////////////////// +// +// 音视频编码参数 +// +///////////////////////////////////////////////////////////////////////////////// + +///【字段含义】视频分辨率,默认值:VIDEO_RESOLUTION_TYPE_360_640。 +///【特别说明】推荐直接使用 TXLivePusher 的 setVideoQuality 接口调整画面质量。 @property(nonatomic, assign) int videoResolution; -/// 视频固定码率,默认值为700 -@property(nonatomic, assign) int videoBitratePIN; +///【字段含义】视频帧率,默认值:15FPS。 +///【特别说明】推荐直接使用 TXLivePusher 的 setVideoQuality 接口调整画面质量。 +@property(nonatomic, assign) int videoFPS; -/// 视频编码GOP,单位second 秒, 默认值为3 +///【字段含义】视频编码 GOP,也就是常说的关键帧间隔,单位:秒;默认值:3s。 +///【特别说明】推荐直接使用 TXLivePusher 的 setVideoQuality 接口调整画面质量。 @property(nonatomic, assign) int videoEncodeGop; -/// 音频采样率 , 取值设置为 枚举值 TX_Enum_Type_AudioSampleRate,也可直接设置为对应的采样率 ,比如 audioSampleRate = AUDIO_SAMPLE_RATE_48000 或 audioSampleRate = 48000, 默认值为AUDIO_SAMPLE_RATE_48000 -///@see TX_Enum_Type_AudioSampleRate -@property(nonatomic, assign) int audioSampleRate; - -/// 音频声道数, 默认值为1 -@property(nonatomic, assign) int audioChannels; +///【字段含义】视频编码的平均码率,默认值:700kbps。 +///【特别说明】推荐直接使用 TXLivePusher 的 setVideoQuality 接口调整画面质量。 +@property(nonatomic, assign) int videoBitratePIN; -/// 码率自适应: SDK会根据网络情况自动调节视频码率, 调节范围在 (videoBitrateMin - videoBitrateMax), 默认值为NO +///【字段含义】码率自适应开关,开启后,SDK 会根据网络情况自动调节视频码率,调节范围在 (videoBitrateMin - videoBitrateMax)。 +///【推荐取值】NO @property(nonatomic, assign) BOOL enableAutoBitrate; -/// 码率自适应: SDK会根据网络情况自动调节视频码率,同时自动调整分辨率, 默认值为AUTO_ADJUST_BITRATE_STRATEGY_1 -///@see TX_Enum_Type_AutoAdjustStrategy +///【字段含义】码率自适应算法 +///【推荐取值】AUTO_ADJUST_BITRATE_STRATEGY_1 @property(nonatomic, assign) int autoAdjustStrategy; -/// 视频最大码率,仅当enableAutoBitrate = YES时有效, 默认值为1000 +///【字段含义】码率自适应 - 最高码率,默认值:1000kpbs @property(nonatomic, assign) int videoBitrateMax; -/// 视频最小码率,仅当enableAutoBitrate = YES时有效, 默认值为400 +///【字段含义】码率自适应 - 最低码率,默认值:400kpbs +///【推荐取值】不要设置太低的数值,过低的码率会导致运动画面出现大面积马赛克。 @property(nonatomic, assign) int videoBitrateMin; -/// 噪音抑制, 默认值为YES -@property(nonatomic, assign) BOOL enableNAS; +///【字段含义】音频采样率,采样率越高音质越好,对于有音乐的场景请使用48000的采样率。 +///【推荐取值】AUDIO_SAMPLE_RATE_48000 +@property(nonatomic, assign) int audioSampleRate; -/// 是否前置camera, 默认值为YES -@property(nonatomic, assign) BOOL frontCamera; +///【字段含义】音频声道数,默认值:1(单声道)。 +@property(nonatomic, assign) int audioChannels; -/// 是否允许点击曝光聚焦, 默认为YES -@property(nonatomic, assign) BOOL touchFocus; +///【字段含义】是否开启耳返特效 +///【推荐取值】NO +///【特别说明】开启耳返会消耗更多的 CPU,只有在主播带耳机唱歌的时候才有必要开启此功能。 +@property(nonatomic, assign) BOOL enableAudioPreview; -/// 是否允许双指手势放大预览画面,默认为NO -@property(nonatomic, assign) BOOL enableZoom; +///【字段含义】是否为纯音频推流 +///【推荐取值】NO +///【特别说明】如果希望实现纯音频推流的功能,需要在推流前就设置该参数,否则播放端会有兼容性问题。 +@property(nonatomic, assign) BOOL enablePureAudioPush; + +///////////////////////////////////////////////////////////////////////////////// +// +// 网络相关参数 +// +///////////////////////////////////////////////////////////////////////////////// -///推流器连接重试次数 : 最小值为 1, 最大值为 10, 默认值为 3 +///【字段含义】推流遭遇网络连接断开时 SDK 默认重试的次数,取值范围1 - 10,默认值:3。 @property(nonatomic, assign) int connectRetryCount; -///推流器连接重试间隔 : 单位秒,最小值为 3, 最大值为 30, 默认值为 3 +///【字段含义】网络重连的时间间隔,单位秒,取值范围3 - 30,默认值:3。 @property(nonatomic, assign) int connectRetryInterval; -///设置水印图片. 设为nil等同于关闭水印 -@property(nonatomic, retain) UIImage *watermark; - -///设置水印图片位置,水印大小为图片实际大小 -@property(nonatomic, assign) CGPoint watermarkPos; +///////////////////////////////////////////////////////////////////////////////// +// +// 自定义采集和处理 +// +///////////////////////////////////////////////////////////////////////////////// -/** - 水印相对于推流分辨率的归一化坐标,x,y,width,height 取值范围 0~1;height不用设置,sdk内部会根据水印宽高比自动计算height - - eg: 推流分辨率为(540,960) watermarkNormalization设置为(0.1,0.1,0.1,0),水印的实际像素坐标为(540 * 0.1,960 * 0.1,540 * 0.1 ,540 * - 0.1 * waterMark.size.height / waterMark.size.width) - @note watermarkNormalization坐标与watermarkPos坐标只能设置一种,如果设置了watermarkNormalization则优先使用归一化坐标 - */ -@property(nonatomic, assign) CGRect watermarkNormalization; +///【字段含义】自定义采集和自定义处理开关 +///【特别说明】该字段需要使用与运算符进行级联操作(自定义采集和自定义处理不能同时开启): +/// 开启自定义视频采集:_config.customModeType |= CUSTOM_MODE_VIDEO_CAPTURE; +/// 开启自定义音频采集:_config.customModeType |= CUSTOM_MODE_AUDIO_CAPTURE; +@property(nonatomic, assign) int customModeType; -/** - 发送自定义CMSampleBuffer的输出分辨率 当设置此属性时,videoResolution自动失效 - @warn 此值设置需与源SampleBuffer的画面比例一致,否则会引起画面变形 - @warn 调用sendVideoSampleBuffer才会使用此值,或者设置autoSampleBufferSize=YES - */ +///【字段含义】仅开启自定义采集时有效,用于设置编码分辨率。 +///【特别说明】此值设置需与调用 sendVideoSampleBuffer 时传入的 SampleBuffer 的宽高比一致,否则会引起画面变形。 +/// 如果指定 autoSampleBufferSize 为 YES,则不需要设置该字段。 @property(assign) CGSize sampleBufferSize; -/// 设置YES时,调用sendVideoSampleBuffer输出分辨率等于输入分辨率, 默认值为NO +///【字段含义】仅开启自定义采集时有效,YES 代表编码分辨率等于输入的 SampleBuffer 的分辨率,默认值:NO。 @property BOOL autoSampleBufferSize; -/// 开启音频硬件加速, 默认值为YES -@property(nonatomic, assign) BOOL enableAudioAcceleration; - -/// 后台推流时长,单位秒,默认300秒 -@property(nonatomic, assign) int pauseTime; -/// 后台推流帧率,最小值为3,最大值为8,默认5 -@property(nonatomic, assign) int pauseFps; +///////////////////////////////////////////////////////////////////////////////// +// +// 专业设置项(慎用) +// +///////////////////////////////////////////////////////////////////////////////// -/// 后台推流图片,图片最大尺寸不能超过1920*1920 -@property(nonatomic, retain) UIImage *pauseImg; +///【字段含义】是否开启噪声抑制(注意:早期版本引入了拼写错误,考虑到接口兼容一直没有修正,正确拼写应该是 ANS) +///【推荐取值】NO:ANS 对于直播环境中由其它设备外放的音乐是不友好的,通过 playBGM 设置的背景音不受影响。 +///【特别说明】如果直播场景只有主播在说话,ANS 有助于让主播的声音更清楚,但如果主播在吹拉弹唱,ANS 会损伤乐器的声音。 +@property(nonatomic, assign) BOOL enableNAS; -/// 是否开启回声消除, 默认值为YES +///【字段含义】是否开启回声抑制 +///【推荐取值】NO:回声抑制会启用通话模式音量,导致音质变差,非连麦场景下请不要开启。 +///【特别说明】只有在连麦模式下才需要开启 AEC,如果是普通的直播,将主播的手机和观众的手机放在一起所产生的啸叫是正常现象。 @property(nonatomic, assign) BOOL enableAEC; -/// 是否开启耳返, 默认值为NO -@property(nonatomic, assign) BOOL enableAudioPreview; +///【字段含义】开启视频硬件加速, 默认值:YES。 +@property(nonatomic, assign) BOOL enableHWAcceleration; +///【字段含义】开启音频硬件加速, 默认值:YES。 +@property(nonatomic, assign) BOOL enableAudioAcceleration; -/// 是否纯音频推流, 默认值为NO -@property(nonatomic, assign) BOOL enablePureAudioPush; -/// 是否就近选路, 默认值为YES. 注: 内部有自动处理,可不需要关注此值 +///////////////////////////////////////////////////////////////////////////////// +// +// 待废弃设置项 +// +///////////////////////////////////////////////////////////////////////////////// + +///【字段含义】是否前置摄像头,待废弃,建议直接使用 TXLivePusher 的 frontCamera 属性和 switchCamera 函数。 +@property(nonatomic, assign) BOOL frontCamera; + +///【字段含义】美颜强度,待废弃,建议直接使用 TXLivePusher 的 setBeautyStyle 函数。 +@property(nonatomic, assign) float beautyFilterDepth; + +///【字段含义】美白强度,待废弃,建议直接使用 TXLivePusher 的 setBeautyStyle 函数。 +@property(nonatomic, assign) float whiteningFilterDepth; + +///【字段含义】是否开启就近选路,待废弃,默认值:YES。 @property(nonatomic, assign) BOOL enableNearestIP; -/** - RTMP传输通道的类型,取值为枚举值:TX_Enum_Type_RTMPChannel, 默认值为RTMP_CHANNEL_TYPE_AUTO - @see TX_Enum_Type_RTMPChannel - - RTMP_CHANNEL_TYPE_AUTO = 0, //自动 - RTMP_CHANNEL_TYPE_STANDARD = 1, //标准的RTMP协议,网络层采用TCP协议 - RTMP_CHANNEL_TYPE_PRIVATE = 2, //标准的RTMP协议,网络层采用私有通道传输(在UDP上封装的一套可靠快速的传输通道),能够更好地抵抗网络抖动 - */ -@property (nonatomic, assign) int rtmpChannelType; +///【字段含义】RTMP 传输通道的类型,待废弃,默认值为:AUTO。 +@property (nonatomic, assign) int rtmpChannelType; + +///【字段含义】自定义 MetaData +/// 以 key,value 方式填入 MetaData,value 只支持字符串类型,最多只支持12组数据 +///【特别说明】需要在推流前设置,设置的值放到 RTMP 流的 MetaData 段,播放端收到对应的 MetaData +@property(nonatomic, copy) NSDictionary *metaData; @end diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePushListener.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePushListener.h index 3fbce55..b39e253 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePushListener.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLivePushListener.h @@ -1,18 +1,27 @@ +/* + * Module: TXLivePushListener @ TXLiteAVSDK + * + * Function: 腾讯云直播推流的回调通知 + * + * Version: <:Version:> + */ + #import <Foundation/Foundation.h> -@protocol TXLivePushListener <NSObject> +/// 腾讯云直播推流的回调通知 +@protocol TXLivePushListener <NSObject> /** - * - * + * 事件通知 + * @param EvtID 参见 TXLiveSDKEventDef.h + * @param param 参见 TXLiveSDKTypeDef.h */ --(void) onPushEvent:(int)EvtID withParam:(NSDictionary*)param; +- (void)onPushEvent:(int)EvtID withParam:(NSDictionary *)param; /** - * - * + * 状态通知 + * @param param 参见 TXLiveSDKTypeDef.h */ --(void) onNetStatus:(NSDictionary*) param; - +- (void)onNetStatus:(NSDictionary *)param; @end diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveRecordListener.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveRecordListener.h index 8835007..fd86b08 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveRecordListener.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveRecordListener.h @@ -1,27 +1,25 @@ #import "TXLiveRecordTypeDef.h" -/********************************************** - ************** 短视频录制回调定义 ************** - **********************************************/ +/** + * 短视频录制回调定义 + */ @protocol TXLiveRecordListener <NSObject> +@optional /** * 短视频录制进度 */ -@optional -(void) onRecordProgress:(NSInteger)milliSecond; /** * 短视频录制完成 */ -@optional -(void) onRecordComplete:(TXRecordResult*)result; /** * 短视频录制事件通知 */ -@optional -(void) onRecordEvent:(NSDictionary*)evt; @end diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveRecordTypeDef.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveRecordTypeDef.h index ad7170f..7159c30 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveRecordTypeDef.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveRecordTypeDef.h @@ -1,5 +1,5 @@ #import <Foundation/Foundation.h> -#import <UIKit/UIKit.h> +#import "TXLiveSDKTypeDef.h" /// PlayRecord 录制类型定义 typedef NS_ENUM(NSInteger, TXRecordType) @@ -31,6 +31,6 @@ typedef NS_ENUM(NSInteger, TXRecordResultCode) /// 视频文件path @property (nonatomic, strong) NSString* videoPath; /// 视频封面 -@property (nonatomic, strong) UIImage* coverImage; +@property (nonatomic, strong) TXImage* coverImage; @end diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveSDKEventDef.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveSDKEventDef.h index e5e6aa1..5e422b7 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveSDKEventDef.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveSDKEventDef.h @@ -1,90 +1,96 @@ #ifndef __TX_LIVE_SDK_EVENT_DEF_H__ #define __TX_LIVE_SDK_EVENT_DEF_H__ +#include "TXLiteAVCode.h" + enum EventID { - /** - * 推流事件列表 - */ -/*step2*/ PUSH_EVT_CONNECT_SUCC = 1001, // 已经连接推流服务器 -/*step3*/ PUSH_EVT_PUSH_BEGIN = 1002, // 已经与服务器握手完毕,开始推流 -/*step1*/ PUSH_EVT_OPEN_CAMERA_SUCC = 1003, // 打开摄像头成功 - PUSH_EVT_CHANGE_RESOLUTION = 1005, // 推流动态调整分辨率 - PUSH_EVT_CHANGE_BITRATE = 1006, // 推流动态调整码率 - PUSH_EVT_FIRST_FRAME_AVAILABLE = 1007, // 首帧画面采集完成 - PUSH_EVT_START_VIDEO_ENCODER = 1008, // 编码器启动 - PUSH_EVT_ROOM_IN = 1018, // 已经在webrtc房间里面,进房成功后通知 - PUSH_EVT_ROOM_OUT = 1019, // 不在webrtc房间里面,进房失败或者中途退出房间时通知 - PUSH_EVT_ROOM_USERLIST = 1020, // 下发webrtc房间成员列表(不包括自己) - PUSH_EVT_ROOM_NEED_REENTER = 1021, // WiFi切换到4G会触发断线重连,此时需要重新进入webrtc房间(拉取最优的服务器地址) + /********************************************************************************** + * 推流事件列表 + **********************************************************************************/ + PUSH_EVT_CONNECT_SUCC = EVT_RTMP_PUSH_CONNECT_SUCC, //> 直播: 已经连接RTMP推流服务器 + PUSH_EVT_PUSH_BEGIN = EVT_RTMP_PUSH_BEGIN, //> 直播: 已经与RTMP服务器握手完毕,开始推流 + PUSH_EVT_OPEN_CAMERA_SUCC = EVT_CAMERA_START_SUCC, //> 打开摄像头成功 + PUSH_EVT_CHANGE_RESOLUTION = EVT_UP_CHANGE_RESOLUTION, //> 推流动态调整分辨率 + PUSH_EVT_CHANGE_BITRATE = EVT_UP_CHANGE_BITRATE, //> 推流动态调整码率 + PUSH_EVT_FIRST_FRAME_AVAILABLE = EVT_FIRST_FRAME_AVAILABLE, //> 首帧画面采集完成 + PUSH_EVT_START_VIDEO_ENCODER = EVT_START_VIDEO_ENCODER, //> 编码器启动 + PUSH_EVT_ROOM_IN = EVT_ROOM_ENTER, //> 已经在webrtc房间里面,进房成功后通知 + PUSH_EVT_ROOM_OUT = EVT_ROOM_EXIT, //> 不在webrtc房间里面,进房失败或者中途退出房间时通知 + PUSH_EVT_ROOM_USERLIST = EVT_ROOM_USERLIST, //> 下发webrtc房间成员列表(不包括自己) + PUSH_EVT_ROOM_NEED_REENTER = EVT_ROOM_NEED_REENTER, //> WiFi切换到4G会触发断线重连,此时需要重新进入webrtc房间(拉取最优的服务器地址) + + PUSH_ERR_OPEN_CAMERA_FAIL = ERR_CAMERA_START_FAIL, //> 打开摄像头失败 + PUSH_ERR_OPEN_MIC_FAIL = ERR_MIC_START_FAIL, //> 打开麦克风失败 + PUSH_ERR_VIDEO_ENCODE_FAIL = ERR_VIDEO_ENCODE_FAIL, //> 视频编码失败 + PUSH_ERR_AUDIO_ENCODE_FAIL = ERR_AUDIO_ENCODE_FAIL, //> 音频编码失败 + PUSH_ERR_UNSUPPORTED_RESOLUTION = ERR_UNSUPPORTED_RESOLUTION, //> 不支持的视频分辨率 + PUSH_ERR_UNSUPPORTED_SAMPLERATE = ERR_UNSUPPORTED_SAMPLERATE, //> 不支持的音频采样率 + PUSH_ERR_NET_DISCONNECT = ERR_RTMP_PUSH_NET_DISCONNECT, //> 网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启推流 + PUSH_ERR_AUDIO_SYSTEM_NOT_WORK = -1308, //> 系统异常,录音失败 + PUSH_ERR_INVALID_ADDRESS = ERR_RTMP_PUSH_INVALID_ADDRESS, //> 推流地址非法 + + PUSH_WARNING_NET_BUSY = WARNING_NET_BUSY, //> 网络状况不佳:上行带宽太小,上传数据受阻 + PUSH_WARNING_RECONNECT = WARNING_RTMP_SERVER_RECONNECT, //> 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃) + PUSH_WARNING_HW_ACCELERATION_FAIL = WARNING_HW_ENCODER_START_FAIL, //> 硬编码启动失败,采用软编码 + PUSH_WARNING_VIDEO_ENCODE_FAIL = 1104, //> 视频编码失败,非致命错,内部会重启编码器 + PUSH_WARNING_BEAUTYSURFACE_VIEW_INIT_FAIL = 1105, //> 视频编码码率异常,警告 + PUSH_WARNING_VIDEO_ENCODE_BITRATE_OVERFLOW = 1106, //> 视频编码码率异常,警告 + PUSH_WARNING_DNS_FAIL = WARNING_RTMP_DNS_FAIL, //> RTMP -DNS解析失败 + PUSH_WARNING_SEVER_CONN_FAIL = WARNING_RTMP_SEVER_CONN_FAIL, //> RTMP服务器连接失败 + PUSH_WARNING_SHAKE_FAIL = WARNING_RTMP_SHAKE_FAIL, //> RTMP服务器握手失败 + PUSH_WARNING_SERVER_DISCONNECT = WARNING_RTMP_SERVER_BREAK_CONNECT, //> RTMP服务器主动断开,请检查推流地址的合法性或防盗链有效期 + PUSH_WARNING_READ_WRITE_FAIL = WARNING_RTMP_READ_WRITE_FAIL, //> RTMP 读/写失败,将会断开连接。 - /*step1*/ PUSH_ERR_OPEN_CAMERA_FAIL = -1301, // 打开摄像头失败 -/*step1*/ PUSH_ERR_OPEN_MIC_FAIL = -1302, // 打开麦克风失败 -/*step3*/ PUSH_ERR_VIDEO_ENCODE_FAIL = -1303, // 视频编码失败 -/*step3*/ PUSH_ERR_AUDIO_ENCODE_FAIL = -1304, // 音频编码失败 -/*step1*/ PUSH_ERR_UNSUPPORTED_RESOLUTION = -1305, // 不支持的视频分辨率 -/*step1*/ PUSH_ERR_UNSUPPORTED_SAMPLERATE = -1306, // 不支持的音频采样率 + /*内部事件*/INNER_EVT_SET_BITRATE_4_SCREEN_CAPTURE = 100001, //> 动态设置录屏编码码率 + /*内部事件*/INNER_EVT_BGM_PLAY_FINISH = 100002, //> BGM播放完毕 -/*step2*/ PUSH_ERR_NET_DISCONNECT = -1307, // 网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启推流 -/*step1*/ PUSH_ERR_AUDIO_SYSTEM_NOT_WORK = -1308, // 系统异常,录音失败 - PUSH_ERR_INVALID_ADDRESS = -1313, // 推流地址非法 -/*step3*/ PUSH_WARNING_NET_BUSY = 1101, // 网络状况不佳:上行带宽太小,上传数据受阻 -/*step2*/ PUSH_WARNING_RECONNECT = 1102, // 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃) -/*step3*/ PUSH_WARNING_HW_ACCELERATION_FAIL= 1103, // 硬编码启动失败,采用软编码 -/*step3*/ PUSH_WARNING_VIDEO_ENCODE_FAIL = 1104, // 视频编码失败,非致命错,内部会重启编码器 -/*step3*/ PUSH_WARNING_BEAUTYSURFACE_VIEW_INIT_FAIL = 1105, // 视频编码码率异常,警告 -/*step3*/ PUSH_WARNING_VIDEO_ENCODE_BITRATE_OVERFLOW = 1106, // 视频编码码率异常,警告 -/*step2*/ PUSH_WARNING_DNS_FAIL = 3001, // RTMP -DNS解析失败 -/*step2*/ PUSH_WARNING_SEVER_CONN_FAIL = 3002, // RTMP服务器连接失败 -/*step2*/ PUSH_WARNING_SHAKE_FAIL = 3003, // RTMP服务器握手失败 -/*step3*/ PUSH_WARNING_SERVER_DISCONNECT = 3004, // RTMP服务器主动断开,请检查推流地址的合法性或防盗链有效期 - PUSH_WARNING_READ_WRITE_FAIL = 3005, // RTMP 读/写失败,将会断开连接。 -/*内部事件*/ INNER_EVT_SET_BITRATE_4_SCREEN_CAPTURE = 100001, // 动态设置录屏编码码率 -/*内部事件*/ INNER_EVT_BGM_PLAY_FINISH = 100002, // BGM播放完毕 - /** - * 播放事件列表 - */ -/*step1*/ PLAY_EVT_CONNECT_SUCC = 2001, // 已经连接服务器 -/*step2*/ PLAY_EVT_RTMP_STREAM_BEGIN = 2002, // 已经连接服务器,开始拉流 -/*step3*/ PLAY_EVT_RCV_FIRST_I_FRAME = 2003, // 渲染首个视频数据包(IDR) -/*step3*/ PLAY_EVT_PLAY_BEGIN = 2004, // 视频播放开始 -/*step3*/ PLAY_EVT_PLAY_PROGRESS = 2005, // 视频播放进度 -/*step3*/ PLAY_EVT_PLAY_END = 2006, // 视频播放结束 -/*step3*/ PLAY_EVT_PLAY_LOADING = 2007, // 视频播放loading - PLAY_EVT_START_VIDEO_DECODER = 2008, // 解码器启动 - PLAY_EVT_CHANGE_RESOLUTION = 2009, // 视频分辨率改变 - PLAY_EVT_GET_PLAYINFO_SUCC = 2010, // 获取点播文件信息成功 - PLAY_EVT_CHANGE_ROTATION = 2011, // MP4视频旋转角度 - PLAY_EVT_GET_MESSAGE = 2012, // 消息事件 - PLAY_EVT_VOD_PLAY_PREPARED = 2013, // 视频加载完毕(点播) - PLAY_EVT_VOD_LOADING_END = 2014, // loading结束(点播) - PLAY_EVT_STREAM_SWITCH_SUCC = 2015, // 直播切流完成 + /********************************************************************************** + * 播放事件列表 + **********************************************************************************/ + PLAY_EVT_CONNECT_SUCC = EVT_PLAY_LIVE_STREAM_CONNECT_SUCC, //> 直播,已经连接RTMP拉流服务器 + PLAY_EVT_RTMP_STREAM_BEGIN = EVT_PLAY_LIVE_STREAM_BEGIN, //> 直播,已经与RTMP服务器握手完毕,开始拉流 + PLAY_EVT_RCV_FIRST_I_FRAME = EVT_RENDER_FIRST_I_FRAME, //> 渲染首个视频数据包(IDR) + PLAY_EVT_PLAY_BEGIN = EVT_VIDEO_PLAY_BEGIN, //> 视频播放开始 + PLAY_EVT_PLAY_PROGRESS = EVT_VIDEO_PLAY_PROGRESS, //> 视频播放进度 + PLAY_EVT_PLAY_END = EVT_VIDEO_PLAY_END, //> 视频播放结束 + PLAY_EVT_PLAY_LOADING = EVT_VIDEO_PLAY_LOADING, //> 视频播放loading + PLAY_EVT_START_VIDEO_DECODER = EVT_START_VIDEO_DECODER, //> 解码器启动 + PLAY_EVT_CHANGE_RESOLUTION = EVT_DOWN_CHANGE_RESOLUTION, //> 视频分辨率改变 + PLAY_EVT_GET_PLAYINFO_SUCC = EVT_GET_VODFILE_MEDIAINFO_SUCC, //> 获取点播文件信息成功 + PLAY_EVT_CHANGE_ROTATION = EVT_VIDEO_CHANGE_ROTATION, //> MP4视频旋转角度 + PLAY_EVT_GET_MESSAGE = EVT_PLAY_GET_MESSAGE, //> 消息事件 + PLAY_EVT_VOD_PLAY_PREPARED = EVT_VOD_PLAY_PREPARED, //> 点播,视频加载完毕 + PLAY_EVT_VOD_LOADING_END = EVT_VOD_PLAY_LOADING_END, //> 点播,loading结束 + PLAY_EVT_STREAM_SWITCH_SUCC = EVT_PLAY_LIVE_STREAM_SWITCH_SUCC, //> 直播,切流成功(切流可以播放不同画面大小的视频) + PLAY_EVT_GET_METADATA = EVT_PLAY_GET_METADATA, //> TXLivePlayer 接收到视频流中的 metadata 头信息(一条视频流仅触发一次) + -/*step1*/ PLAY_ERR_NET_DISCONNECT = -2301, // 网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放 - PLAY_ERR_GET_RTMP_ACC_URL_FAIL = -2302, // 获取加速拉流地址失败 - PLAY_ERR_FILE_NOT_FOUND = -2303, // 播放文件不存在 - PLAY_ERR_HEVC_DECODE_FAIL = -2304, // H265解码失败 - PLAY_ERR_HLS_KEY = -2305, // HLS解码key获取失败 - PLAY_ERR_GET_PLAYINFO_FAIL = -2306, // 获取点播文件信息失败 - PLAY_ERR_STREAM_SWITCH_FAIL = -2307, // 切流失败 + PLAY_ERR_NET_DISCONNECT = ERR_PLAY_LIVE_STREAM_NET_DISCONNECT, //> 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放 + PLAY_ERR_GET_RTMP_ACC_URL_FAIL = ERR_GET_RTMP_ACC_URL_FAIL, //> 直播,获取加速拉流地址失败 + PLAY_ERR_FILE_NOT_FOUND = ERR_FILE_NOT_FOUND, //> 播放文件不存在 + PLAY_ERR_HEVC_DECODE_FAIL = ERR_HEVC_DECODE_FAIL, //> H265解码失败 + PLAY_ERR_HLS_KEY = ERR_VOD_DECRYPT_FAIL, //> HLS解码key获取失败 + PLAY_ERR_GET_PLAYINFO_FAIL = ERR_GET_VODFILE_MEDIAINFO_FAIL, //> 获取点播文件信息失败 + PLAY_ERR_STREAM_SWITCH_FAIL = ERR_PLAY_LIVE_STREAM_SWITCH_FAIL, //> 直播,切流失败(切流可以播放不同画面大小的视频) -/*step3*/ PLAY_WARNING_VIDEO_DECODE_FAIL = 2101, // 当前视频帧解码失败 -/*step3*/ PLAY_WARNING_AUDIO_DECODE_FAIL = 2102, // 当前音频帧解码失败 -/*step1*/ PLAY_WARNING_RECONNECT = 2103, // 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃) -/*step3*/ PLAY_WARNING_RECV_DATA_LAG = 2104, // 网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀 -/*step3*/ PLAY_WARNING_VIDEO_PLAY_LAG = 2105, // 当前视频播放出现卡顿(用户直观感受) -/*step3*/ PLAY_WARNING_HW_ACCELERATION_FAIL= 2106, // 硬解启动失败,采用软解 -/*step3*/ PLAY_WARNING_VIDEO_DISCONTINUITY = 2107, // 当前视频帧不连续,可能丢帧 -/*step3*/ PLAY_WARNING_FIRST_IDR_HW_DECODE_FAIL = 2108, // 当前流硬解第一个I帧失败,SDK自动切软解 -/*step1*/ PLAY_WARNING_DNS_FAIL = 3001, // RTMP -DNS解析失败 -/*step1*/ PLAY_WARNING_SEVER_CONN_FAIL = 3002, // RTMP服务器连接失败 -/*step1*/ PLAY_WARNING_SHAKE_FAIL = 3003, // RTMP服务器握手失败 -/*step1*/ PLAY_WARNING_SERVER_DISCONNECT = 3004, // RTMP服务器主动断开 - PLAY_WARNING_READ_WRITE_FAIL = 3005, // RTMP 读/写失败,将会断开连接。 + PLAY_WARNING_VIDEO_DECODE_FAIL = WARNING_VIDEO_FRAME_DECODE_FAIL, //> 当前视频帧解码失败 + PLAY_WARNING_AUDIO_DECODE_FAIL = WARNING_AUDIO_FRAME_DECODE_FAIL, //> 当前音频帧解码失败 + PLAY_WARNING_RECONNECT = WARNING_LIVE_STREAM_SERVER_RECONNECT, //> 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃) + PLAY_WARNING_RECV_DATA_LAG = WARNING_RECV_DATA_LAG, //> 网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀 + PLAY_WARNING_VIDEO_PLAY_LAG = WARNING_VIDEO_PLAY_LAG, //> 当前视频播放出现卡顿(用户直观感受) + PLAY_WARNING_HW_ACCELERATION_FAIL = WARNING_HW_DECODER_START_FAIL, //> 硬解启动失败,采用软解 + PLAY_WARNING_VIDEO_DISCONTINUITY = 2107, //> 当前视频帧不连续,可能丢帧 + PLAY_WARNING_FIRST_IDR_HW_DECODE_FAIL = WARNING_VIDEO_DECODER_HW_TO_SW, //> 当前流硬解第一个I帧失败,SDK自动切软解 + PLAY_WARNING_DNS_FAIL = WARNING_RTMP_DNS_FAIL, //> RTMP -DNS解析失败 + PLAY_WARNING_SEVER_CONN_FAIL = WARNING_RTMP_SEVER_CONN_FAIL, //> RTMP服务器连接失败 + PLAY_WARNING_SHAKE_FAIL = WARNING_RTMP_SHAKE_FAIL, //> RTMP服务器握手失败 + PLAY_WARNING_SERVER_DISCONNECT = WARNING_RTMP_SERVER_BREAK_CONNECT, //> RTMP服务器主动断开 + PLAY_WARNING_READ_WRITE_FAIL = WARNING_RTMP_READ_WRITE_FAIL, //> RTMP 读/写失败,将会断开连接。 -/* UGC*/ UGC_WRITE_FILE_FAIL = 4001, //UGC写文件失败 + /*UGC*/UGC_WRITE_FILE_FAIL = 4001, //> UGC写文件失败 }; #endif // __TX_LIVE_SDK_TYPE_DEF_H__ diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveSDKTypeDef.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveSDKTypeDef.h index e9f767a..a2765b8 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveSDKTypeDef.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXLiveSDKTypeDef.h @@ -4,299 +4,326 @@ #include "TXLiveSDKEventDef.h" #import <Foundation/Foundation.h> -/// 屏幕旋转方法 +#if TARGET_OS_IPHONE +#import <UIKit/UIKit.h> +typedef UIView TXView; +typedef UIImage TXImage; +typedef UIEdgeInsets TXEdgeInsets; +#elif TARGET_OS_MAC +#import <AppKit/AppKit.h> +typedef NSView TXView; +typedef NSImage TXImage; +typedef NSEdgeInsets TXEdgeInsets; +#endif + + + +///////////////////////////////////////////////////////////////////////////////// +// +// 【视频相关枚举值定义】 +// +///////////////////////////////////////////////////////////////////////////////// + +/** + * 1.1 视频分辨率 + * + * 在普通模式下,TXLivePusher 只支持三种固定的分辨率,即:360 × 640、540 × 960 以及 720 × 1280。 + * + *【如何横屏推流】 + * 如果希望使用 640 × 360、960 × 540、1280 × 720 这样的横屏分辨率,需要设置 TXLivePushConfig 中的 homeOrientation 属性, + * 并使用 TXLivePusher 中的 setRenderRotation 接口进行画面旋转。 + * + *【自定义分辨率】 + * 如果希望使用其他分辨率,可以设置 TXLivePushConfig 中的 customModeType 为 CUSTOM_MODE_VIDEO_CAPTURE, + * 自己采集 SampleBuffer 送给 TXLivePusher 的 sendVideoSampleBuffer 接口。 + * + *【建议的分辨率】 + * 手机直播场景下最常用的分辨率为 9:16 的竖屏分辨率 540 × 960。 + * 从清晰的角度,540 × 960 比 360 × 640 要清晰,同时跟 720 × 1280 相当。 + * 从性能的角度,540 × 960 可以避免前置摄像头开启 720 × 1280 的采集分辨率,对于美颜开销很大的场景能节省不少的计算量。 + */ +typedef NS_ENUM(NSInteger, TX_Enum_Type_VideoResolution) { + + /// 竖屏分辨率,宽高比为 9:16 + VIDEO_RESOLUTION_TYPE_360_640 = 0, ///< 建议码率 800kbps + VIDEO_RESOLUTION_TYPE_540_960 = 1, ///< 建议码率 1200kbps + VIDEO_RESOLUTION_TYPE_720_1280 = 2, ///< 建议码率 1800kbps + + /// 如下均为内建分辨率,为 SDK 内部使用,不支持通过接口进行设置 + VIDEO_RESOLUTION_TYPE_640_360 = 3, + VIDEO_RESOLUTION_TYPE_960_540 = 4, + VIDEO_RESOLUTION_TYPE_1280_720 = 5, + + VIDEO_RESOLUTION_TYPE_320_480 = 6, + VIDEO_RESOLUTION_TYPE_180_320 = 7, + VIDEO_RESOLUTION_TYPE_270_480 = 8, + VIDEO_RESOLUTION_TYPE_320_180 = 9, + VIDEO_RESOLUTION_TYPE_480_270 = 10, + + VIDEO_RESOLUTION_TYPE_240_320 = 11, + VIDEO_RESOLUTION_TYPE_360_480 = 12, + VIDEO_RESOLUTION_TYPE_480_640 = 13, + VIDEO_RESOLUTION_TYPE_320_240 = 14, + VIDEO_RESOLUTION_TYPE_480_360 = 15, + VIDEO_RESOLUTION_TYPE_640_480 = 16, + + VIDEO_RESOLUTION_TYPE_480_480 = 17, + VIDEO_RESOLUTION_TYPE_270_270 = 18, + VIDEO_RESOLUTION_TYPE_160_160 = 19, +}; + +/** + * 1.2 画面质量挡位 + * + * 如果您希望调整直播的编码参数,建议您直接使用 TXLivePusher 提供的 setVideoQuality 接口。 + * 由于视频编码参数中的分辨率,码率和帧率对最终效果都有着复杂的影响,如果您之前没有相关操作经验,不建议直接修改这些编码参数。 + * 我们在 setVideoQuality 接口中提供了如下几个挡位供您选择: + * + * 1. 标清:采用 360 × 640 的分辨率,码率调控范围 300kbps - 800kbps,关闭网络自适应时的码率为 800kbps,适合网络较差的直播环境。 + * 2. 高清:采用 540 × 960 的分辨率,码率调控范围 600kbps - 1500kbps,关闭网络自适应时的码率为 1200kbps,常规手机直播的推荐挡位。 + * 3. 超清:采用 720 × 1280 的分辨率,码率调控范围 600kbps - 1800kbps,关闭网络自适应时的码率为 1800kbps,能耗高,但清晰度较标清提升并不明显。 + * 4. 连麦(大主播):主播从原来的“推流状态”进入“连麦状态”后,可以通过 setVideoQuality 接口调整自 MAIN_PUBLISHER 挡位。 + * 5. 连麦(小主播):观众从原来的“播放状态”进入“连麦状态”后,可以通过 setVideoQuality 接口调整自 SUB_PUBLISHER 挡位。 + * 6. 视频通话:该选项后续会逐步废弃,如果您希望实现纯视频通话而非直播功能,推荐使用腾讯云 [TRTC](https://cloud.tencent.com/product/trtc) 服务。 + * + * 【推荐设置】如果您对整个平台的清晰度要求比较高,推荐使用 setVideoQuality(HIGH_DEFINITION, NO, NO) 的组合。 + * 如果您的主播有很多三四线城市的网络适配要求,推荐使用 setVideoQuality(HIGH_DEFINITION, YES, NO) 的组合。 + * + * @note 在开启硬件加速后,您可能会发现诸如 368 × 640 或者 544 × 960 这样的“不完美”分辨率。 + * 这是由于部分硬编码器要求像素能被 16 整除所致,属于正常现象,您可以通过播放端的填充模式解决“小黑边”问题。 + */ +typedef NS_ENUM(NSInteger, TX_Enum_Type_VideoQuality) { + VIDEO_QUALITY_STANDARD_DEFINITION = 1, ///< 标清:采用 360 × 640 的分辨率 + VIDEO_QUALITY_HIGH_DEFINITION = 2, ///< 高清:采用 540 × 960 的分辨率 + VIDEO_QUALITY_SUPER_DEFINITION = 3, ///< 超清:采用 720 × 1280 的分辨率 + VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER = 4, ///< 连麦场景下的大主播使用 + VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER = 5, ///< 连麦场景下的小主播(连麦的观众)使用 + VIDEO_QUALITY_REALTIME_VIDEOCHAT = 6, ///< 纯视频通话场景使用(待废弃) +}; + +/** + * 1.3 画面旋转方向 + */ typedef NS_ENUM(NSInteger, TX_Enum_Type_HomeOrientation) { - /// home在右边 - HOME_ORIENTATION_RIGHT = 0, - /// home在下面 - HOME_ORIENTATION_DOWN, - /// home在左边 - HOME_ORIENTATION_LEFT, - /// home在上面 - HOME_ORIENTATION_UP, + HOME_ORIENTATION_RIGHT = 0, ///< HOME 键在右边,横屏模式 + HOME_ORIENTATION_DOWN = 1, ///< HOME 键在下面,手机直播中最常见的竖屏直播模式 + HOME_ORIENTATION_LEFT = 2, ///< HOME 键在左边,横屏模式 + HOME_ORIENTATION_UP = 3, ///< HOME 键在上边,竖屏直播(适合小米 MIX2) }; - -/// 渲染方式 + +/** + * 1.4 画面填充模式 + */ typedef NS_ENUM(NSInteger, TX_Enum_Type_RenderMode) { - /// 图像铺满屏幕 - RENDER_MODE_FILL_SCREEN = 0, - /// 图像长边填满屏幕 - RENDER_MODE_FILL_EDGE -}; - -/// 美颜程度, 取值1-9, 这里定义了关闭和最大值 -typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyFilterDepth) { - /// 关闭美颜 - BEAUTY_FILTER_DEPTH_CLOSE = 0, - /// 最大美颜强度 - BEAUTY_FILTER_DEPTH_MAX = 9, + + RENDER_MODE_FILL_SCREEN = 0, ///< 图像铺满屏幕,不留黑边,如果图像宽高比不同于屏幕宽高比,部分画面内容会被裁剪掉。 + RENDER_MODE_FILL_EDGE = 1, ///< 图像适应屏幕,保持画面完整,但如果图像宽高比不同于屏幕宽高比,会有黑边的存在。 }; - -/// 美颜处理方式 + +/** + * 1.5 美颜风格 + */ typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyStyle) { - /// 光滑 - BEAUTY_STYLE_SMOOTH = 0, - /// 自然 - BEAUTY_STYLE_NATURE = 1, - /// pitu美颜, 需要企业版SDK - BEAUTY_STYLE_PITU = 2, + BEAUTY_STYLE_SMOOTH = 0, ///< 光滑,磨皮程度较高,更适合秀场直播类场景下使用。 + BEAUTY_STYLE_NATURE = 1, ///< 自然,磨皮算法会最大限度保留皮肤细节。 + BEAUTY_STYLE_PITU = 2, ///< 天天P图版美颜, 需要商用企业版 SDK 才能支持,普通版本设置此选项无效。 }; - -/** 视频分辨率 - SDK的视频采集模块只支持前3种分辨率,即:360*640 540*960 720*1280 - 如果客户自己负责视频采集,向SDK填充YUV数据,可以使用全部6种分辨率 + +/** + * 1.6 美颜程度,取值范围1 - 9,该枚举值定义了关闭和最大值。 */ -typedef NS_ENUM(NSInteger, TX_Enum_Type_VideoResolution) { - VIDEO_RESOLUTION_TYPE_360_640 = 0, - VIDEO_RESOLUTION_TYPE_540_960 = 1, - VIDEO_RESOLUTION_TYPE_720_1280 = 2, - VIDEO_RESOLUTION_TYPE_640_360 = 3, - VIDEO_RESOLUTION_TYPE_960_540 = 4, - VIDEO_RESOLUTION_TYPE_1280_720 = 5, - /// @name 连麦专用,采用固定码率。 - VIDEO_RESOLUTION_TYPE_320_480 = 6, - VIDEO_RESOLUTION_TYPE_180_320 = 7, - VIDEO_RESOLUTION_TYPE_270_480 = 8, - VIDEO_RESOLUTION_TYPE_320_180 = 9, - VIDEO_RESOLUTION_TYPE_480_270 = 10, - - VIDEO_RESOLUTION_TYPE_240_320 = 11, - VIDEO_RESOLUTION_TYPE_360_480 = 12, - VIDEO_RESOLUTION_TYPE_480_640 = 13, - VIDEO_RESOLUTION_TYPE_320_240 = 14, - VIDEO_RESOLUTION_TYPE_480_360 = 15, - VIDEO_RESOLUTION_TYPE_640_480 = 16, - - VIDEO_RESOLUTION_TYPE_480_480 = 17, - VIDEO_RESOLUTION_TYPE_270_270 = 18, - VIDEO_RESOLUTION_TYPE_160_160 = 19, +typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyFilterDepth) { + BEAUTY_FILTER_DEPTH_CLOSE = 0, ///< 关闭美颜 + BEAUTY_FILTER_DEPTH_MAX = 9, ///< 最大美颜强度 }; + /** -* \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 推流的画面质量选项 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -* -* - 1.9.1 版本开始引入推流画质接口 setVideoQuality 用于傻瓜化的选择推流画质效果。 -* - TXLivePush::setVideoQuality 内部通过 TXLivePushConfig 实现几种不同场景和风格的推流质量 -* - 目前支持的几种画质选项如下: -* -* (1)标清 - 采用 360 * 640 级别分辨率,码率会在 400kbps - 800kbps 之间自适应,如果主播的网络条件不理想, -* 直播的画质会偏模糊,但总体卡顿率不会太高。 -* Android平台下这一档我们会选择采用软编码,软编码虽然更加耗电,但在运动画面的表现要由于硬编码。 -* -* (2)高清 - 采用 540 * 960 级别分辨率,码率会锁定在 1200kbps,如果主播的网络条件不理想,直播画质不会有变化, -* 但这段时间内会出现频繁的卡顿和跳帧。 两个平台下,这一档我们都会采用硬编码。 -* -* (3)超清 - 采用 720 * 1280 级别分辨率,码率会锁定在 1500kbps,对主播的上行带宽要求比较高,适合观看端是大屏的业务场景。 -* -* (4)大主播 - 顾名思义,连麦中大主播使用,因为是观众的主画面,追求清晰一些的效果,所以分辨率会优先选择 540 * 960。 -* -* (5)小主播 - 顾名思义,连麦中小主播使用,因为是小画面,画面追求流畅,分辨率采用 320 * 480, 码率 350kbps 固定。 -* -* 【特别说明】 -* 1. 如果是秀场直播,iOS 和 Android 都推荐使用[高清],虽说“马上看壮士,月下观美人”是有这么一说,但是看完某椒就知道清晰有多么重要了。 -* 2. 使用 setVideoQuality 之后,依然可以使用 TXLivePushConfig 设置画质,以最后一次的设置为准。 -* 3. 如果您是手机端观看,那么一般不推荐使用【超清】选项,我们做过多组的画质主观评测,尤其是iOS平台,在小屏幕上观看几乎看不出差别。 -* -*/ -typedef NS_ENUM(NSInteger, TX_Enum_Type_VideoQuality) { - ///标清:建议追求流畅性的客户使用该选项 - VIDEO_QUALITY_STANDARD_DEFINITION = 1, - ///高清:建议对清晰度有要求的客户使用该选项 - VIDEO_QUALITY_HIGH_DEFINITION = 2, - ///超清:如果不是大屏观看,不推荐使用 - VIDEO_QUALITY_SUPER_DEFINITION = 3, - ///连麦大主播 - VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER = 4, - ///连麦小主播 - VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER = 5, - ///实时音视频 - VIDEO_QUALITY_REALTIME_VIDEOCHAT = 6, -}; - -///流控策略 -typedef NS_ENUM(NSInteger, TX_Enum_Type_AutoAdjustStrategy) { - /// 无流控 - AUTO_ADJUST_NONE = -1, - /// 适用于普通直播推流的流控策略,该策略敏感度比较低,会缓慢适应带宽变化,有利于在带宽波动时保持画面的清晰度。 + * 1.6 网络自适应算法,推荐选项:AUTO_ADJUST_LIVEPUSH_STRATEGY + */ +typedef NS_ENUM(NSInteger, TX_Enum_Type_AutoAdjustStrategy) { + AUTO_ADJUST_NONE = -1, ///< 非法数值,用于 SDK 内部做合法性检查 + + AUTO_ADJUST_LIVEPUSH_STRATEGY = 0, ///< 最适合直播模式下的流控算法 + AUTO_ADJUST_LIVEPUSH_RESOLUTION_STRATEGY = 1, ///< 不推荐:SDK 内部会调整视频分辨率,如果有 H5 分享的需求请勿使用 + AUTO_ADJUST_REALTIME_VIDEOCHAT_STRATEGY = 5, ///< 待废弃,请使用腾讯云 TRTC 服务 + + AUTO_ADJUST_BITRATE_STRATEGY_1 = 0, ///< 已经废弃 + AUTO_ADJUST_BITRATE_RESOLUTION_STRATEGY_1 = 1, ///< 已经废弃 + AUTO_ADJUST_BITRATE_STRATEGY_2 = 2, ///< 已经废弃 + AUTO_ADJUST_BITRATE_RESOLUTION_STRATEGY_2 = 3, ///< 已经废弃 + AUTO_ADJUST_REALTIME_BITRATE_STRATEGY = 4, ///< 已经废弃 + AUTO_ADJUST_REALTIME_BITRATE_RESOLUTION_STRATEGY = 5, ///< 已经废弃 +}; + +/** + * 1.7 视频帧的数据格式(未压缩前的) + */ +typedef NS_ENUM(NSInteger, TXVideoType) { - AUTO_ADJUST_LIVEPUSH_STRATEGY = 0, - /// 适用于普通直播推流的流控策略,与 LIVEPUSH_STRATEGY 的差别是改模式下 SDK 会根据当前码率自动调整出适合的分辨率 - AUTO_ADJUST_LIVEPUSH_RESOLUTION_STRATEGY = 1, - - /// 适用于实时音视频通话的流控策略,也就是 VIDEO_QUALITY_REALTIME_VIDEOCHAT 所使用流控策略, 该策略敏感度比较高,网络稍有风吹草动就会进行自适应调整 - AUTO_ADJUST_REALTIME_VIDEOCHAT_STRATEGY = 5, + VIDEO_TYPE_420SP = 1, ///< Android 视频采集格式,PixelFormat.YCbCr_420_SP 17 + VIDEO_TYPE_420YpCbCr = 2, ///< iOS 视频采集格式,kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange + VIDEO_TYPE_420P = 3, ///< yuv420p格式 + VIDEO_TYPE_BGRA8888 = 4, ///< BGRA8888 + VIDEO_TYPE_RGBA8888 = 5, ///< RGBA8888 + VIDEO_TYPE_NV12 = 6, ///< NV12(iOS) +}; + +///////////////////////////////////////////////////////////////////////////////// +// +// 【音频相关枚举值定义】 +// +///////////////////////////////////////////////////////////////////////////////// - /// @name 下面是个是老版本中的常量定义,由于名字起得过于奇葩,在宰杀了一个“代码猴子”以后,我们进行如上调整 +/** + * 2.1 音频采样率 + */ +typedef NS_ENUM(NSInteger, TX_Enum_Type_AudioSampleRate) { - /// 已经废弃不用 - AUTO_ADJUST_BITRATE_STRATEGY_1 = 0, - /// 已经废弃不用 - AUTO_ADJUST_BITRATE_RESOLUTION_STRATEGY_1 = 1, - /// 已经废弃不用 - AUTO_ADJUST_BITRATE_STRATEGY_2 = 2, - /// 已经废弃不用 - AUTO_ADJUST_BITRATE_RESOLUTION_STRATEGY_2 = 3, - ///实时:只调码率 - AUTO_ADJUST_REALTIME_BITRATE_STRATEGY = 4, - ///实时:同时调码率和分辨率 - AUTO_ADJUST_REALTIME_BITRATE_RESOLUTION_STRATEGY = 5, + AUDIO_SAMPLE_RATE_8000 = 0, ///< 8k采样率 + AUDIO_SAMPLE_RATE_16000 = 1, ///< 16k采样率 + AUDIO_SAMPLE_RATE_32000 = 2, ///< 32k采样率 + AUDIO_SAMPLE_RATE_44100 = 3, ///< 44.1k采样率 + AUDIO_SAMPLE_RATE_48000 = 4, ///< 48k采样率 }; - -/// 声音采样率 -typedef NS_ENUM(NSInteger, TX_Enum_Type_AudioSampleRate) { - /// 8k采样率 - AUDIO_SAMPLE_RATE_8000 = 0, - /// 16k采样率 - AUDIO_SAMPLE_RATE_16000, - /// 32k采样率 - AUDIO_SAMPLE_RATE_32000, - /// 44.1k采样率 - AUDIO_SAMPLE_RATE_44100, - /// 48k采样率 - AUDIO_SAMPLE_RATE_48000, + +/** + * 2.2 混响类型 + */ +typedef NS_ENUM(NSInteger, TXReverbType) { + REVERB_TYPE_0 = 0, ///< 关闭混响 + REVERB_TYPE_1 = 1, ///< KTV + REVERB_TYPE_2 = 2, ///< 小房间 + REVERB_TYPE_3 = 3, ///< 大会堂 + REVERB_TYPE_4 = 4, ///< 低沉 + REVERB_TYPE_5 = 5, ///< 洪亮 + REVERB_TYPE_6 = 6, ///< 金属声 + REVERB_TYPE_7 = 7, ///< 磁性 }; - -typedef NS_ENUM(NSInteger, TXVideoType) { - /// Android 视频采集格式 PixelFormat.YCbCr_420_SP 17 - VIDEO_TYPE_420SP = 1, - /// iOS 视频采集格式 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange - VIDEO_TYPE_420YpCbCr = 2, - /// yuv420p格式 客户自己负责视频采集,直接向SDK填充YUV数据 - VIDEO_TYPE_420P = 3, - /// BGRA8888 - VIDEO_TYPE_BGRA8888 = 4, - /// RGBA8888 - VIDEO_TYPE_RGBA8888 = 5, - /// NV12 - VIDEO_TYPE_NV12 = 6, + +/** + * 2.3 变声选项 + */ +typedef NS_ENUM(NSInteger, TXVoiceChangerType) { + + VOICECHANGER_TYPE_0 = 0, ///< 关闭变声 + VOICECHANGER_TYPE_1 = 1, ///< 熊孩子 + VOICECHANGER_TYPE_2 = 2, ///< 萝莉 + VOICECHANGER_TYPE_3 = 3, ///< 大叔 + VOICECHANGER_TYPE_4 = 4, ///< 重金属 + VOICECHANGER_TYPE_5 = 5, ///< 感冒 + VOICECHANGER_TYPE_6 = 6, ///< 外国人 + VOICECHANGER_TYPE_7 = 7, ///< 困兽 + VOICECHANGER_TYPE_8 = 8, ///< 死肥仔 + VOICECHANGER_TYPE_9 = 9, ///< 强电流 + VOICECHANGER_TYPE_10 = 10, ///< 重机械 + VOICECHANGER_TYPE_11 = 11, ///< 空灵 }; - -///混响类型 -typedef NS_ENUM(NSInteger, TXReverbType) { - /// 关闭混响 - REVERB_TYPE_0 = 0, - /// KTV - REVERB_TYPE_1 = 1, - /// 小房间 - REVERB_TYPE_2 = 2, - /// 大会堂 - REVERB_TYPE_3 = 3, - /// 低沉 - REVERB_TYPE_4 = 4, - /// 洪亮 - REVERB_TYPE_5 = 5, - /// 金属声 - REVERB_TYPE_6 = 6, - /// 磁性 - REVERB_TYPE_7 = 7, -}; - -/// 变声选项 -typedef NS_ENUM(NSInteger, TXVoiceChangerType) { - /// 关闭变声 - VOICECHANGER_TYPE_0 = 0, - /// 熊孩子 - VOICECHANGER_TYPE_1 = 1, - /// 萝莉 - VOICECHANGER_TYPE_2 = 2, - /// 大叔 - VOICECHANGER_TYPE_3 = 3, - /// 重金属 - VOICECHANGER_TYPE_4 = 4, - /// 感冒 - VOICECHANGER_TYPE_5 = 5, - /// 外国人 - VOICECHANGER_TYPE_6 = 6, - /// 困兽 - VOICECHANGER_TYPE_7 = 7, - /// 死肥仔 - VOICECHANGER_TYPE_8 = 8, - /// 强电流 - VOICECHANGER_TYPE_9 = 9, - /// 重机械 - VOICECHANGER_TYPE_10 = 10, - /// 空灵 - VOICECHANGER_TYPE_11 = 11, -}; - -///音频播放类型 -typedef NS_ENUM(NSInteger, TXAudioRouteType) { - /// 扬声器 - AUDIO_ROUTE_SPEAKER = 0, - /// 听筒 - AUDIO_ROUTE_RECEIVER = 1, + +/** + * 2.4 声音播放模式(音频路由) + * + * 一般手机都有两个扬声器,设置音频路由的作用就是要决定声音从哪个扬声器播放出来。 + * - Speakerphone:扬声器,位于手机底部,声音偏大,适合外放音乐。 + * - Earpiece:听筒,位于手机顶部,声音偏小,适合通话。 + */ +typedef NS_ENUM(NSInteger, TXAudioRouteType) { + AUDIO_ROUTE_SPEAKER = 0, ///< 扬声器,位于手机底部,声音偏大,适合外放音乐。 + AUDIO_ROUTE_RECEIVER = 1, ///< 听筒,位于手机顶部,声音偏小,适合通话。 }; - -///传输通道 + +/** + * 2.5 推流用网络通道(待废弃) + */ typedef NS_ENUM(NSInteger, TX_Enum_Type_RTMPChannel) { - /// 自动 - RTMP_CHANNEL_TYPE_AUTO = 0, - /// 标准的RTMP协议,网络层采用TCP协议 - RTMP_CHANNEL_TYPE_STANDARD = 1, - /// 标准的RTMP协议,网络层采用私有通道传输(在UDP上封装的一套可靠快速的传输通道),能够更好地抵抗网络抖动 - RTMP_CHANNEL_TYPE_PRIVATE = 2, + + RTMP_CHANNEL_TYPE_AUTO = 0, ///< 自动:推腾讯云使用加速协议,推友商云使用标准 RTMP 协议。 + RTMP_CHANNEL_TYPE_STANDARD = 1, ///< 标准 RTMP 协议 + RTMP_CHANNEL_TYPE_PRIVATE = 2, ///< 腾讯云专属加速协议 }; -/// @name 状态键名定义 -/// cpu使用率 -#define NET_STATUS_CPU_USAGE @"CPU_USAGE" -/// 设备总CPU占用 -#define NET_STATUS_CPU_USAGE_D @"CPU_USAGE_DEVICE" -/// 当前视频编码器输出的比特率,也就是编码器每秒生产了多少视频数据,单位 kbps -#define NET_STATUS_VIDEO_BITRATE @"VIDEO_BITRATE" -/// 当前音频编码器输出的比特率,也就是编码器每秒生产了多少音频数据,单位 kbps -#define NET_STATUS_AUDIO_BITRATE @"AUDIO_BITRATE" -/// 当前视频帧率,也就是视频编码器每条生产了多少帧画面 -#define NET_STATUS_VIDEO_FPS @"VIDEO_FPS" -/// 当前视频GOP,也就是每两个关键帧(I帧)间隔时长,单位s -#define NET_STATUS_VIDEO_GOP @"VIDEO_GOP" -/// 当前的发送速度 -#define NET_STATUS_NET_SPEED @"NET_SPEED" -/// 网络抖动情况,抖动越大,网络越不稳定 -#define NET_STATUS_NET_JITTER @"NET_JITTER" -/// 缓冲区大小,缓冲区越大,说明当前上行带宽不足以消费掉已经生产的视频数据 -#define NET_STATUS_CACHE_SIZE @"CACHE_SIZE" -/// 视频缓冲帧数 (包括jitterbuffer和解码器两部分缓冲) -#define NET_STATUS_VIDEO_CACHE_SIZE @"VIDEO_CACHE_SIZE" -/// 视频解码器缓冲帧数 -#define NET_STATUS_V_DEC_CACHE_SIZE @"V_DEC_CACHE_SIZE" -///视频当前渲染帧的timestamp和音频当前播放帧的timestamp的差值,标示当时音画同步的状态 -#define NET_STATUS_AV_PLAY_INTERVAL @"AV_PLAY_INTERVAL" -///jitterbuffer最新收到的视频帧和音频帧的timestamp的差值,标示当时jitterbuffer收包同步的状态 -#define NET_STATUS_AV_RECV_INTERVAL @"AV_RECV_INTERVAL" -///jitterbuffer当前的播放速度 -#define NET_STATUS_AUDIO_PLAY_SPEED @"AUDIO_PLAY_SPEED" -///当前流的音频信息,包括采样率信息和声道数信息 -#define NET_STATUS_AUDIO_INFO @"AUDIO_INFO" -#define NET_STATUS_DROP_SIZE @"DROP_SIZE" -#define NET_STATUS_VIDEO_WIDTH @"VIDEO_WIDTH" -#define NET_STATUS_VIDEO_HEIGHT @"VIDEO_HEIGHT" -#define NET_STATUS_SERVER_IP @"SERVER_IP" -///编解码缓冲大小 -#define NET_STATUS_CODEC_CACHE @"CODEC_CACHE" -///编解码队列DROPCNT -#define NET_STATUS_CODEC_DROP_CNT @"CODEC_DROP_CNT" -#define NET_STATUS_SET_VIDEO_BITRATE @"SET_VIDEO_BITRATE" - -#define EVT_MSG @"EVT_MSG" -#define EVT_TIME @"EVT_TIME" -#define EVT_PARAM1 @"EVT_PARAM1" -#define EVT_PARAM2 @"EVT_PARAM2" -#define EVT_PLAY_PROGRESS @"EVT_PLAY_PROGRESS" -#define EVT_PLAY_DURATION @"EVT_PLAY_DURATION" -#define EVT_PLAYABLE_DURATION @"PLAYABLE_DURATION" -#define EVT_REPORT_TOKEN @"EVT_REPORT_TOKEN" -#define EVT_GET_MSG @"EVT_GET_MSG" -///视频封面 -#define EVT_PLAY_COVER_URL @"EVT_PLAY_COVER_URL" -///视频播放地址 -#define EVT_PLAY_URL @"EVT_PLAY_URL" -///视频名称 -#define EVT_PLAY_NAME @"EVT_PLAY_NAME" -///视频简介 -#define EVT_PLAY_DESCRIPTION @"EVT_PLAY_DESCRIPTION" - -#define STREAM_ID @"STREAM_ID" - -#endif + +/** + * 2.6 屏幕采集源(用于录屏推流) + */ +#if TARGET_OS_OSX +typedef NS_ENUM(NSInteger, TXCaptureVideoInputSource) { + TXCaptureVideoInputSourceCamera, + TXCaptureVideoInputSourceScreen, + TXCaptureVideoInputSourceWindow +}; +#endif + + + + +///////////////////////////////////////////////////////////////////////////////// +// +// 【状态通知字段名 onNetStatus】 +// +///////////////////////////////////////////////////////////////////////////////// + +/** + * TXLivePushListener 和 TXLivePlayListener 的 onNetStatus() 会以 2s 一次的时间间隔,定时通知网络状态和内部指标, + * 这些数值采用 key-value 的组织格式,其中 key 值的定义如下: + */ + +#define NET_STATUS_CPU_USAGE @"CPU_USAGE" ///> 进程 CPU 占用率 +#define NET_STATUS_CPU_USAGE_D @"CPU_USAGE_DEVICE" ///> 系统 CPU 占用率 + +#define NET_STATUS_VIDEO_WIDTH @"VIDEO_WIDTH" ///> 视频分辨率宽度 +#define NET_STATUS_VIDEO_HEIGHT @"VIDEO_HEIGHT" ///> 视频分辨率高度 +#define NET_STATUS_VIDEO_FPS @"VIDEO_FPS" ///> 视频帧率:也就是视频编码器每秒生产了多少帧画面。 +#define NET_STATUS_VIDEO_GOP @"VIDEO_GOP" ///> 关键帧间隔:即每两个关键帧(I帧)间隔时长,单位:秒。 +#define NET_STATUS_VIDEO_BITRATE @"VIDEO_BITRATE" ///> 视频码率:即视频编码器每秒生产了多少视频数据,单位:kbps。 +#define NET_STATUS_AUDIO_BITRATE @"AUDIO_BITRATE" ///> 音频码率:即音频编码器每秒生产了多少音频数据,单位:kbps。 +#define NET_STATUS_NET_SPEED @"NET_SPEED" ///> 传输速度:即每秒钟发送或接收了多少字节的数据。 + +#define NET_STATUS_VIDEO_CACHE @"VIDEO_CACHE" ///> TXLivePusher:主播端堆积的视频帧数;TXLivePlayer:播放端缓冲的视频总时长。 +#define NET_STATUS_AUDIO_CACHE @"AUDIO_CACHE" ///> TXLivePusher:主播端堆积的音频帧数;TXLivePlayer:播放端缓冲的音频总时长。 +#define NET_STATUS_VIDEO_DROP @"VIDEO_DROP" ///> TXLivePusher:主播端主动丢弃的视频帧数;TXLivePlayer: N/A。 +#define NET_STATUS_AUDIO_DROP @"AUDIO_DROP" ///> 暂未使用 + +#define NET_STATUS_V_DEC_CACHE_SIZE @"V_DEC_CACHE_SIZE" ///> TXLivePlayer:播放端解码器中缓存的视频帧数(Android 端硬解码时存在)。 +#define NET_STATUS_V_SUM_CACHE_SIZE @"V_SUM_CACHE_SIZE" ///> TXLivePlayer:播放端缓冲的总视频帧数,该数值越大,播放延迟越高。 +#define NET_STATUS_AV_PLAY_INTERVAL @"AV_PLAY_INTERVAL" ///> TXLivePlayer:音画同步错位时间(播放),单位 ms,此数值越小,音画同步越好。 +#define NET_STATUS_AV_RECV_INTERVAL @"AV_RECV_INTERVAL" ///> TXLivePlayer:音画同步错位时间(网络),单位 ms,此数值越小,音画同步越好。 +#define NET_STATUS_AUDIO_CACHE_THRESHOLD @"AUDIO_CACHE_THRESHOLD" ///> TXLivePlayer:音频缓冲时长阈值,缓冲超过该阈值后,播放器会开始调控延时。 + +#define NET_STATUS_AUDIO_INFO @"AUDIO_INFO" ///> 音频信息:包括采样率信息和声道数信息 +#define NET_STATUS_NET_JITTER @"NET_JITTER" ///> 网络抖动:数值越大表示抖动越大,网络越不稳定 +#define NET_STATUS_SERVER_IP @"SERVER_IP" ///> 连接的Server IP地址 + + +///////////////////////////////////////////////////////////////////////////////// +// +// 【事件通知字段名 onPushEvent onPlayEvent】 +// +///////////////////////////////////////////////////////////////////////////////// + + +/** + * 腾讯云 LiteAVSDK 通过 TXLivePushListener 中的 onPushEvent(),TXLivePlayListener 中的 onPlayEvent() 向您通知内部错误、警告和事件: + * - 错误:严重且不可恢复的错误,会中断 SDK 的正常逻辑。 + * - 警告:非致命性的提醒和警告,可以不理会。 + * - 事件:SDK 的流程和状态通知,比如开始推流,开始播放,等等。 + * + * 这些数值采用 key-value 的组织格式,其中 key 值的定义如下: + */ +#define EVT_MSG @"EVT_MSG" ///> 事件ID +#define EVT_TIME @"EVT_TIME" ///> 事件发生的UTC毫秒时间戳 +#define EVT_PARAM1 @"EVT_PARAM1" ///> 事件参数1 +#define EVT_PARAM2 @"EVT_PARAM2" ///> 事件参数2 +#define EVT_GET_MSG @"EVT_GET_MSG" ///> 消息内容,收到PLAY_EVT_GET_MESSAGE事件时,通过该字段获取消息内容 +#define EVT_PLAY_PROGRESS @"EVT_PLAY_PROGRESS" ///> 点播:视频播放进度 +#define EVT_PLAY_DURATION @"EVT_PLAY_DURATION" ///> 点播:视频总时长 +#define EVT_PLAYABLE_DURATION @"PLAYABLE_DURATION" ///> 点播:视频可播放时长 +#define EVT_PLAY_COVER_URL @"EVT_PLAY_COVER_URL" ///> 点播:视频封面 +#define EVT_PLAY_URL @"EVT_PLAY_URL" ///> 点播:视频播放地址 +#define EVT_PLAY_NAME @"EVT_PLAY_NAME" ///> 点播:视频名称 +#define EVT_PLAY_DESCRIPTION @"EVT_PLAY_DESCRIPTION" ///> 点播:视频简介 + +#define STREAM_ID @"STREAM_ID" + +#endif diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVideoCustomProcessDelegate.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVideoCustomProcessDelegate.h index 4d80f95..98be4fa 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVideoCustomProcessDelegate.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVideoCustomProcessDelegate.h @@ -7,8 +7,13 @@ // #import <Foundation/Foundation.h> +#if TARGET_OS_IPHONE #include <OpenGLES/ES2/gl.h> #include <OpenGLES/ES2/glext.h> +#elif TARGET_OS_MAC +#import <OpenGL/OpenGL.h> +#import <OpenGL/gl.h> +#endif @protocol TXVideoCustomProcessDelegate <NSObject> @optional @@ -38,7 +43,7 @@ #pragma mark - Player /** * 视频渲染对象回调 - * @prarm pixelBuffer 渲染图像 + * @param pixelBuffer 渲染图像 * @return 返回YES则SDK不再显示;返回NO则SDK渲染模块继续渲染 * 说明:渲染图像的数据类型为config中设置的renderPixelFormatType */ diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVodPlayConfig.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVodPlayConfig.h index 241b399..e91255a 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVodPlayConfig.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVodPlayConfig.h @@ -20,31 +20,32 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayerType) { /// 播放器配置参数 @interface TXVodPlayConfig : NSObject -/// 播放器连接重试次数 : 最小值为 1, 最大值为 10, 默认值为 3 +/// 播放器连接重试次数:最小值为1,最大值为10,默认值为 3 @property(nonatomic, assign) int connectRetryCount; -/// 播放器连接重试间隔 : 单位秒,最小值为 3, 最大值为 30, 默认值为 3 +/// 播放器连接重试间隔:单位秒,最小值为3, 最大值为30,默认值为3 @property(nonatomic, assign) int connectRetryInterval; -@property NSTimeInterval timeout; /// 超时时间: 单位秒,默认10s +/// 超时时间:单位秒,默认10s +@property NSTimeInterval timeout; -/// 视频渲染对象回调的视频格式. 支持kCVPixelFormatType_32BGRA、kCVPixelFormatType_420YpCbCr8BiPlanarFullRange、kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange +/// 视频渲染对象回调的视频格式。支持kCVPixelFormatType_32BGRA、kCVPixelFormatType_420YpCbCr8BiPlanarFullRange、kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange @property(nonatomic, assign) OSType playerPixelFormatType; /** * 注意:缓存目录应该是单独的目录,SDK可能会清掉其中的文件 */ -@property NSString *cacheFolderPath; /// 视频缓存目录,点播MP4、HLS有效 +@property NSString *cacheFolderPath; ///< 视频缓存目录,点播MP4、HLS有效 -@property int maxCacheItems; /// 最多缓存文件个数 +@property int maxCacheItems; ///< 最多缓存文件个数 -@property NSInteger playerType; /// 播放器类型 +@property NSInteger playerType; ///< 播放器类型 -@property NSDictionary *headers; /// 自定义HTTP Headers +@property NSDictionary *headers; ///< 自定义 HTTP Headers -@property BOOL enableAccurateSeek; /// 是否精确seek,默认YES. 开启精确后seek,seek的时间平均多出200ms +@property BOOL enableAccurateSeek; ///< 是否精确 seek,默认YES。开启精确后seek,seek 的时间平均多出200ms -@property BOOL autoRotate; /// 播放mp4文件时,若设为YES则根据文件中的旋转角度自动旋转。旋转角度可在PLAY_EVT_CHANGE_ROTATION事件中获得。默认YES +@property BOOL autoRotate; ///< 播放 MP4 文件时,若设为YES则根据文件中的旋转角度自动旋转。旋转角度可在 EVT_VIDEO_CHANGE_ROTATION 事件中获得。默认YES /** * 平滑切换码率。默认NO @@ -57,6 +58,12 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayerType) { * 若不设置,SDK默认间隔0.5秒回调一次 */ @property NSTimeInterval progressInterval; + +/** + * 最大预加载大小,单位 MB + * 此设置会影响playableDuration,设置越大,提前缓存的越多 + */ +@property int maxBufferSize; @end #endif /* TXVodPlayConfig_h */ diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVodPlayer.h b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVodPlayer.h index ad01fcb..ab0d191 100644 --- a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVodPlayer.h +++ b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Headers/TXVodPlayer.h @@ -40,7 +40,6 @@ /** * 点播配置 - * @see TXVodPlayConfig */ @property(nonatomic, copy) TXVodPlayConfig *config; @@ -48,7 +47,7 @@ @property BOOL isAutoPlay; /** - * 加密HLS的token。设置此值后,播放器自动在URL中的文件名之前增加voddrm.token.<Token> + * 加密HLS的token。设置此值后,播放器自动在URL中的文件名之前增加 voddrm.token.TOKEN */ @property (nonatomic, strong) NSString *token; @@ -72,14 +71,16 @@ /** * startPlay 启动从指定URL播放 * - * @prarm url 完整的URL(如果播放的是本地视频文件,这里传本地视频文件的完整路径) + * @param url 完整的URL(如果播放的是本地视频文件,这里传本地视频文件的完整路径) * @return 0 = OK */ - (int)startPlay:(NSString *)url; /** - * 通过fileid方式播放. - * @discussion fileid的获取方式可参考 https://cloud.tencent.com/document/product/454/12148#step-3.3A-.E5.90.AF.E5.8A.A8.E6.92.AD.E6.94.BE + * 通过fileid方式播放。 + * + * fileid的获取方式可参考 [启动播放](https://cloud.tencent.com/document/product/454/12148#step-3.3A-.E5.90.AF.E5.8A.A8.E6.92.AD.E6.94.BE) + * * @param params 认证参数 * @return 0 = OK */ @@ -173,7 +174,7 @@ /** * 当播放地址为master playlist,返回支持的码率(清晰度) * - * @warning 在收到PLAY_EVT_PLAY_BEGIN事件后才能正确返回结果 + * @warning 在收到EVT_VIDEO_PLAY_BEGIN事件后才能正确返回结果 * @return 无多码率返回空数组 */ - (NSArray<TXBitrateItem *> *)supportedBitrates; diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Info.plist b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Info.plist index d8883f6..292c23d 100644 Binary files a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Info.plist and b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/Info.plist differ diff --git a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/TXLiteAVSDK_Smart b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/TXLiteAVSDK_Smart index bacb941..c00b20a 100644 Binary files a/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/TXLiteAVSDK_Smart and b/HHVDoctorSDK/TXLiteAVSDK_Smart.framework/TXLiteAVSDK_Smart differ