TXLivePush.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. /*
  2. * Module: TXLivePusher @ TXLiteAVSDK
  3. *
  4. * Function: 腾讯云直播推流用 RTMP SDK
  5. *
  6. *
  7. * Version: <:Version:>
  8. */
  9. #import <Foundation/Foundation.h>
  10. #import <VideoToolbox/VideoToolbox.h>
  11. #if TARGET_OS_IPHONE
  12. #import <ReplayKit/ReplayKit.h>
  13. #endif
  14. #import "TXLivePushConfig.h"
  15. #import "TXLivePushListener.h"
  16. #import "TXVideoCustomProcessDelegate.h"
  17. #import "TXAudioCustomProcessDelegate.h"
  18. #import "TXLiveRecordListener.h"
  19. #import "TXLiveSDKTypeDef.h"
  20. #import <AVFoundation/AVFoundation.h>
  21. /**
  22. * 直播推流类
  23. *
  24. * 主要负责将本地的音视频画面进行编码和 RTMP 推送,包含如下技术特点:
  25. *
  26. * - 针对腾讯云的推流地址,会采用 QUIC 协议进行加速,配合改进后的 BBR2 带宽测算方案,可以最大限度的利用主播的上行带宽,降低直播卡顿率。
  27. * - 内嵌套的 Qos 流量控制技术具备上行网络自适应能力,可以根据主播端网络的具体情况实时调节音视频数据量。
  28. * - 内嵌多套美颜磨皮算法(自然&光滑)和多款色彩空间滤镜(支持自定义滤镜),可以根据需要自行选择。
  29. * - 商业版包含了基于优图 AI 人脸识别技术的大眼、瘦脸、隆鼻以及动效挂架,只需要购买 优图 License 就可以零成本集成。
  30. * - 支持自定义的音视频采集和渲染,让您可以根据项目需要选择自己的音视频数据源。
  31. */
  32. @interface TXLivePush : NSObject
  33. /////////////////////////////////////////////////////////////////////////////////
  34. //
  35. // (一)SDK 基础函数
  36. //
  37. /////////////////////////////////////////////////////////////////////////////////
  38. /// @name SDK 基础函数
  39. /// @{
  40. /**
  41. * 1.1 创建 TXLivePusher 示例
  42. *
  43. * @param config TXLivePushConfig 推流配置项,见 “TXLivePushConfig.h” 文件中的详细定义
  44. */
  45. - (id)initWithConfig:(TXLivePushConfig *)config;
  46. /**
  47. * 1.2 设置 TXLivePushConfig 推流配置项,见 “TXLivePushConfig.h” 文件中的详细定义
  48. */
  49. @property(nonatomic,copy) TXLivePushConfig *config;
  50. /**
  51. * 1.3 设置推流回调接口,见“TXLivePushListener.h” 文件中的详细定义
  52. */
  53. @property(nonatomic,weak) id <TXLivePushListener> delegate;
  54. /// @}
  55. /////////////////////////////////////////////////////////////////////////////////
  56. //
  57. // (二)推流基础接口
  58. //
  59. /////////////////////////////////////////////////////////////////////////////////
  60. /// @name 推流基础接口
  61. /// @{
  62. /**
  63. * 2.1 启动摄像头预览
  64. *
  65. * 启动预览后并不会立刻开始 RTMP 推流,需要调用 startPush() 才能真正开始推流。
  66. *
  67. * @param view 承载视频画面的控件
  68. */
  69. - (int)startPreview:(TXView *)view;
  70. /**
  71. * 2.2 停止摄像头预览
  72. */
  73. - (void)stopPreview;
  74. /**
  75. * 2.3 启动 RTMP 推流
  76. *
  77. * 针对腾讯云的推流地址,会采用 QUIC 协议进行加速,配合改进后的 BBR2 带宽测算方案,可以最大限度的利用主播的上行带宽,降低直播卡顿率。
  78. *
  79. * @param rtmpURL 推流地址,参考文档:[获取推流地址](https://cloud.tencent.com/document/product/267/32720 )。
  80. *
  81. * @note -5 返回码代表 license 校验失败,TXLivePusher 需要 [license](https://cloud.tencent.com/document/product/454/34750) 校验通过才能工作。
  82. *
  83. * @return 0: 启动成功;-1: 启动失败;-5:license 校验失败。
  84. */
  85. - (int)startPush:(NSString *)rtmpURL;
  86. /**
  87. * 2.4 停止 RTMP 推流
  88. */
  89. - (void)stopPush;
  90. /**
  91. * 2.5 暂停摄像头采集并进入垫片推流状态
  92. *
  93. * SDK 会暂时停止摄像头采集,并使用 TXLivePushConfig.pauseImg 中指定的图片作为替代图像进行推流,也就是所谓的“垫片”。
  94. * 这项功能常用于 App 被切到后台运行的场景,尤其是在 iOS 系统中,当 App 切到后台以后,操作系统不会再允许该 App 继续使用摄像头。
  95. * 此时就可以通过调用 pausePush() 进入垫片状态。
  96. *
  97. * 对于绝大多数推流服务器而言,如果超过一定时间不推视频数据,服务器会断开当前的推流链接。
  98. *
  99. * 在 TXLivePushConfig 您可以指定:
  100. * - pauseImg 设置后台推流的默认图片,不设置为默认黑色背景。
  101. * - pauseFps 设置后台推流帧率,最小值为5,最大值为20,默认10。
  102. * - pauseTime 设置后台推流持续时长,单位秒,默认300秒。
  103. *
  104. * @note 请注意调用顺序:startPush => ( pausePush => resumePush ) => stopPush(),错误的调用顺序会导致 SDK 表现异常。
  105. */
  106. - (void)pausePush;
  107. /**
  108. * 2.6 恢复摄像头采集并结束垫片推流状态
  109. */
  110. - (void)resumePush;
  111. /**
  112. * 2.7 查询是否正在推流
  113. *
  114. * @return YES:推流中;NO:没有在推流。
  115. */
  116. - (bool)isPublishing;
  117. /**
  118. * 2.8 获取当前推流的 RTMP 地址
  119. */
  120. @property(nonatomic,readonly) NSString *rtmpURL;
  121. /// @}
  122. /////////////////////////////////////////////////////////////////////////////////
  123. //
  124. // (三)视频相关接口
  125. //
  126. /////////////////////////////////////////////////////////////////////////////////
  127. /// @name 视频相关接口
  128. /// @{
  129. /**
  130. * 3.1 设置视频编码质量
  131. *
  132. * 推荐设置:秀场直播 quality:HIGH_DEFINITION;adjustBitrate:NO;adjustResolution:NO。
  133. * 参考文档:[设定清晰度](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)
  134. *
  135. * @param quality 画质类型(标清,高清,超高清)
  136. * @param adjustBitrate 动态码率开关
  137. * @param adjustResolution 动态切分辨率开关
  138. *
  139. * @note adjustResolution 早期被引入是为了让 TXLivePusher 能够满足视频通话这一封闭场景下的一些需求,现已不推荐使用。
  140. * 如果您有视频通话的需求,可以使用我们专门为视频通话打造的 [TRTC](https://cloud.tencent.com/product/trtc) 服务。
  141. * 由于目前很多 H5 播放器不支持分辨率动态变化,所以开启分辨率自适应以后,会导致 H5 播放端和录制文件的很多兼容问题。
  142. */
  143. - (void)setVideoQuality:(TX_Enum_Type_VideoQuality)quality
  144. adjustBitrate:(BOOL) adjustBitrate
  145. adjustResolution:(BOOL) adjustResolution;
  146. /**
  147. * 3.2 切换前后摄像头(iOS)
  148. */
  149. - (int)switchCamera;
  150. #if TARGET_OS_MAC && !TARGET_OS_IPHONE
  151. /**
  152. * 3.2 选择摄像头(macOS)
  153. */
  154. - (void)selectCamera:(AVCaptureDevice *)camera;
  155. #endif
  156. /**
  157. * 3.3 查询当前是否为前置摄像头
  158. */
  159. @property(nonatomic,readonly) BOOL frontCamera;
  160. /**
  161. * 3.4 设置视频镜像效果
  162. *
  163. * 由于前置摄像头采集的画面是取自手机的观察视角,如果将采集到的画面直接展示给观众,是完全没有问题的。
  164. * 但如果将采集到的画面也直接显示给主播,则会跟主播照镜子时的体验完全相反,会让主播感觉到很奇怪。
  165. * 因此,SDK 会默认开启本地摄像头预览画面的镜像效果,让主播直播时跟照镜子时保持一个体验效果。
  166. *
  167. * setMirror 所影响的则是观众端看到的视频效果,如果想要保持观众端看到的效果跟主播端保持一致,需要开启镜像;
  168. * 如果想要让观众端看到正常的未经处理过的画面(比如主播弹吉他的时候有类似需求),则可以关闭镜像。
  169. *
  170. * @note 仅当前使用前置摄像头时,setMirror 接口才会生效,在使用后置摄像头时此接口无效。
  171. *
  172. * @param isMirror YES:播放端看到的是镜像画面;NO:播放端看到的是非镜像画面。
  173. */
  174. - (void)setMirror:(BOOL)isMirror;
  175. /**
  176. * 3.5 设置本地摄像头预览画面的旋转方向
  177. *
  178. * 该接口仅能够改变主播本地预览画面的方向,而不会改变观众端的画面效果。
  179. * 如果希望改变观众端看到的视频画面的方向,比如原来是540x960,希望变成960x540,则可以通过设置 TXLivePushConfig 中的 homeOrientation 来实现。
  180. *
  181. * <pre>
  182. * // 竖屏推流(HOME 键在下)
  183. * _config.homeOrientation = HOME_ORIENTATION_DOWN;
  184. * [_txLivePublisher setConfig:_config];
  185. * [_txLivePublisher setRenderRotation:0];
  186. * // 横屏推流(HOME 键在右)
  187. * _config.homeOrientation = HOME_ORIENTATION_RIGHT;
  188. * [_txLivePublisher setConfig:_config];
  189. * [_txLivePublisher setRenderRotation:90];
  190. * </pre>
  191. *
  192. * @param rotation 取值为0 ,90,180,270(其他值无效),表示主播端摄像头预览视频的顺时针旋转角度。
  193. */
  194. - (void)setRenderRotation:(int)rotation;
  195. /**
  196. * 3.6 打开后置摄像头旁边的闪关灯
  197. *
  198. * 此操作对于前置摄像头是无效的,因为绝大多数手机都没有给前置摄像头配置闪光灯。
  199. *
  200. * @param bEnable YES:打开;NO:关闭。
  201. * @return YES:打开成功;NO:打开失败。
  202. */
  203. - (BOOL)toggleTorch:(BOOL)bEnable;
  204. /**
  205. * 3.7 调整摄像头的焦距
  206. *
  207. * @param distance 焦距大小,取值范围1 - 5,默认值建议设置为1即可。
  208. * @note 当 distance 为1的时候为最远视角(正常镜头),当为5的时候为最近视角(放大镜头),最大值不要超过5,超过5后画面会模糊不清。
  209. */
  210. - (void)setZoom:(CGFloat)distance;
  211. /**
  212. * 3.8 设置手动对焦区域
  213. *
  214. * SDK 默认使用摄像头自动对焦功能,您也可以通过 TXLivePushConfig 中的 touchFocus 选项关闭自动对焦,改用手动对焦。
  215. * 改用手动对焦之后,需要由主播自己点击摄像头预览画面上的某个区域,来手动指导摄像头对焦。
  216. *
  217. * @note 早期 SDK 版本仅仅提供了手动和自动对焦的选择开关,并不支持设置对焦位置,3.0 版本以后,手动对焦的接口才开放出来。
  218. */
  219. - (void)setFocusPosition:(CGPoint)touchPoint;
  220. /// @}
  221. /////////////////////////////////////////////////////////////////////////////////
  222. //
  223. // (四)美颜相关接口
  224. //
  225. /////////////////////////////////////////////////////////////////////////////////
  226. /// @name 美颜相关接口
  227. /// @{
  228. /**
  229. * 4.1 设置美颜级别和美白级别
  230. *
  231. * @param beautyStyle 使用哪种磨皮算法,支持光滑和自然两种,光滑风格磨皮更加明显,适合秀场直播。见 “TXLiveSDKTypeDef.h” 中的 TX_Enum_Type_BeautyStyle 定义。
  232. * @param beautyLevel 美颜级别,取值范围0 - 9; 0表示关闭,1 - 9值越大,效果越明显。
  233. * @param whitenessLevel 美白级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  234. * @param ruddinessLevel 红润级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  235. */
  236. - (void)setBeautyStyle:(TX_Enum_Type_BeautyStyle)beautyStyle
  237. beautyLevel:(float)beautyLevel
  238. whitenessLevel:(float)whitenessLevel
  239. ruddinessLevel:(float)ruddinessLevel;
  240. /**
  241. * 4.2 设置指定素材滤镜特效
  242. *
  243. * @note 滤镜图片一定要用 png 格式,demo 用到的滤镜查找表图片位于 TXLiteAVDemo/Resource/Beauty/filter/FilterResource.bundle 中
  244. */
  245. - (void)setFilter:(TXImage *)image;
  246. /**
  247. * 4.3 设置滤镜浓度
  248. *
  249. * 在美女秀场等应用场景里,滤镜浓度的要求会比较高,以便更加突显主播的差异。
  250. * 我们默认的滤镜浓度是0.5,如果您觉得滤镜效果不明显,可以使用下面的接口进行调节。
  251. *
  252. * @param specialValue 取值范围0 - 1的浮点型数字,取值越大滤镜效果越明显,默认取值0.5。
  253. */
  254. - (void)setSpecialRatio:(float)specialValue;
  255. /// @}
  256. /////////////////////////////////////////////////////////////////////////////////
  257. //
  258. // (五)商用企业版美颜和动效挂件
  259. //
  260. /////////////////////////////////////////////////////////////////////////////////
  261. /// @name 商用企业版美颜和动效挂件
  262. /// @{
  263. /**
  264. * 5.1 设置大眼级别(商用企业版有效,其它版本设置此参数无效)
  265. *
  266. * @param eyeScaleLevel 大眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  267. */
  268. - (void)setEyeScaleLevel:(float)eyeScaleLevel;
  269. /**
  270. * 5.2 设置瘦脸级别(商用企业版有效,其它版本设置此参数无效)
  271. *
  272. * @param faceScaleLevel 瘦脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  273. */
  274. - (void)setFaceScaleLevel:(float)faceScaleLevel;
  275. /**
  276. * 5.3 设置 V 脸级别(商用企业版有效,其它版本设置此参数无效)
  277. *
  278. * @param faceVLevel V 脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  279. */
  280. - (void)setFaceVLevel:(float)faceVLevel;
  281. /**
  282. * 5.4 设置下巴拉伸或收缩(商用企业版有效,其它版本设置此参数无效)
  283. *
  284. * @param chinLevel 下巴拉伸或收缩级别,取值范围 -9 - 9;0 表示关闭,小于0表示收缩,大于0表示拉伸。
  285. */
  286. - (void)setChinLevel:(float)chinLevel;
  287. /**
  288. * 5.5 设置短脸级别(商用企业版有效,其它版本设置此参数无效)
  289. *
  290. * @param faceShortlevel 短脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  291. */
  292. - (void)setFaceShortLevel:(float)faceShortlevel;
  293. /**
  294. * 5.6 设置瘦鼻级别(商用企业版有效,其它版本设置此参数无效)
  295. *
  296. * @param noseSlimLevel 瘦鼻级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  297. */
  298. - (void)setNoseSlimLevel:(float)noseSlimLevel;
  299. /**
  300. * 5.7 设置绿幕背景视频(商用企业版有效,其它版本设置此参数无效)
  301. *
  302. * 此处的绿幕功能并非智能抠背,它需要被拍摄者的背后有一块绿色的幕布来辅助产生特效
  303. *
  304. * @param file 视频文件路径。支持 MP4; nil 表示关闭特效。
  305. */
  306. - (void)setGreenScreenFile:(NSURL *)file;
  307. /**
  308. * 5.8 选择使用哪一款 AI 动效挂件(商用企业版有效,其它版本设置此参数无效)
  309. *
  310. * @param tmplName 动效名称
  311. * @param tmplDir 动效所在目录
  312. */
  313. - (void)selectMotionTmpl:(NSString *)tmplName inDir:(NSString *)tmplDir;
  314. /**
  315. * 5.9 设置动效静音(商用企业版有效,其它版本设置此参数无效)
  316. *
  317. * 有些挂件本身会有声音特效,通过此 API 可以关闭这些特效播放时所带的声音效果。
  318. *
  319. * @param motionMute YES:静音;NO:不静音。
  320. */
  321. - (void)setMotionMute:(BOOL)motionMute;
  322. /// @}
  323. /////////////////////////////////////////////////////////////////////////////////
  324. //
  325. // (六)音频相关接口
  326. //
  327. /////////////////////////////////////////////////////////////////////////////////
  328. /// @name 音频相关接口
  329. /// @{
  330. /**
  331. * 6.1 开启静音
  332. *
  333. * 开启静音后,SDK 并不会继续采集麦克风的声音,但是会用非常低(5kbps 左右)的码率推送伪静音数据,
  334. * 这样做的目的是为了兼容 H5 上的 video 标签,并让录制出来的 MP4 文件有更好的兼容性。
  335. *
  336. * @param bEnable 是否开启静音。
  337. */
  338. - (void)setMute:(BOOL)bEnable;
  339. /**
  340. * 6.2 播放背景音乐
  341. *
  342. * SDK 会将背景音乐和麦克风采集的声音进行混合并一起推送到云端。
  343. *
  344. * @param path 本地音乐文件路径
  345. * @return YES:成功;NO:失败。
  346. */
  347. - (BOOL)playBGM:(NSString *)path;
  348. /**
  349. * 6.3 播放背景音乐(高级版本)
  350. *
  351. * @param path 本地音乐文件路径
  352. * @param beginNotify 播放开始的回调
  353. * @param progressNotify 播放进度回调
  354. * @param completeNotify 播放完毕回调
  355. * @return YES:成功;NO:失败。
  356. */
  357. - (BOOL) playBGM:(NSString *)path
  358. withBeginNotify:(void (^)(NSInteger errCode))beginNotify
  359. withProgressNotify:(void (^)(NSInteger progressMS,NSInteger durationMS))progressNotify
  360. andCompleteNotify:(void (^)(NSInteger errCode))completeNotify;
  361. /**
  362. * 6.4 停止播放背景音乐
  363. */
  364. - (BOOL)stopBGM;
  365. /**
  366. * 6.5 暂停播放背景音乐
  367. */
  368. - (BOOL)pauseBGM;
  369. /**
  370. * 6.6 继续播放背景音乐
  371. */
  372. - (BOOL)resumeBGM;
  373. /**
  374. * 6.7 获取背景音乐文件的总时长,单位是毫秒
  375. * @param path 音乐文件路径,如果 path 为空,那么返回当前正在播放的背景音乐的时长。
  376. */
  377. - (int)getMusicDuration:(NSString *)path;
  378. /**
  379. * 6.8 设置混音时背景音乐的音量大小,仅在播放背景音乐混音时使用。
  380. *
  381. * @param volume 音量大小,1为正常音量,建议值为0 - 2之间的浮点数,如果需要增益可以设置更大的值。
  382. * @return YES:成功;NO:失败。
  383. */
  384. - (BOOL)setBGMVolume:(float)volume;
  385. /**
  386. * 6.9 设置混音时麦克风音量大小,仅在播放背景音乐混音时使用。
  387. *
  388. * @param volume 音量大小,1为正常音量,建议值为0 - 2之间的浮点数,如果需要增益可以设置更大的值。
  389. * @return YES:成功;NO:失败。
  390. */
  391. - (BOOL)setMicVolume:(float)volume;
  392. /**
  393. * 6.10 调整背景音乐的音调高低
  394. *
  395. * @param pitch 音调,默认值是0.0f,范围是-1 - 1之间的浮点数;
  396. * @return YES:成功;NO:失败。
  397. */
  398. - (BOOL)setBgmPitch:(float)pitch;
  399. /**
  400. * 6.11 设置混响效果
  401. *
  402. * @param reverbType 混响类型,详见 “TXLiveSDKTypeDef.h” 中的 TXReverbType 定义。
  403. * @return YES:成功;NO:失败。
  404. */
  405. - (BOOL)setReverbType:(TXReverbType)reverbType;
  406. /**
  407. * 6.12 设置变声类型
  408. *
  409. * @param voiceChangerType 混响类型,详见 “TXLiveSDKTypeDef.h” 中的 voiceChangerType 定义。
  410. * @return YES:成功;NO:失败。
  411. */
  412. - (BOOL)setVoiceChangerType:(TXVoiceChangerType)voiceChangerType;
  413. /// @}
  414. /////////////////////////////////////////////////////////////////////////////////
  415. //
  416. // (七)本地录制和截图
  417. //
  418. /////////////////////////////////////////////////////////////////////////////////
  419. /// @name 本地录制接口
  420. /// @{
  421. /**
  422. * 7.1 录制回调接口,详见 "TXLiveRecordTypeDef.h" 中的 TXLiveRecordListener 定义。
  423. */
  424. @property (nonatomic,weak) id<TXLiveRecordListener> recordDelegate;
  425. /**
  426. * 7.2 开始录制短视频
  427. *
  428. * @note 1. 只有启动推流后才能开始录制,非推流状态下启动录制无效。
  429. * 2. 出于安装包体积的考虑,仅专业版和商用企业版两个版本的 LiteAVSDK 支持该功能,直播精简版仅定义了接口但并未实现。
  430. * 3. 录制过程中请勿动态切换分辨率和软硬编,会有很大概率导致生成的视频异常。
  431. *
  432. * @param videoPath 视频录制后存储路径
  433. * @return 0:成功;-1:videoPath 为空;-2:上次录制尚未结束,请先调用 stopRecord;-3:推流尚未开始。
  434. */
  435. -(int) startRecord:(NSString *)videoPath;
  436. /**
  437. * 7.3 结束录制短视频,当停止推流后,如果视频还在录制中,SDK 内部会自动结束录制。
  438. * @return 0:成功; -1:不存在录制任务。
  439. */
  440. -(int) stopRecord;
  441. /**
  442. * 7.4 推流过程中本地截图
  443. *
  444. * @param snapshotCompletionBlock 截图完成的回调函数
  445. */
  446. - (void)snapshot:(void (^)(TXImage *))snapshotCompletionBlock;
  447. /// @}
  448. /////////////////////////////////////////////////////////////////////////////////
  449. //
  450. // (八)自定义采集和处理
  451. //
  452. /////////////////////////////////////////////////////////////////////////////////
  453. /// @name 自定义采集和处理
  454. /// @{
  455. /**
  456. * 8.1 自定义视频采集,向 SDK 发送自己采集的视频数据。
  457. *
  458. * 在自定义视频采集模式下,SDK 不再继续从摄像头采集图像,只保留编码和发送能力,您需要定时地发送自己采集的 SampleBuffer。
  459. * 要开启自定义视频采集,需要完成如下两个步骤:
  460. *
  461. * 1. 开启自定义采集:给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_VIDEO_CAPTURE 选项,代表开启自定义视频采集。
  462. * 2. 设定视频分辨率:将 TXLivePushConfig 中的 sampleBufferSize 属性设置为您期望的分辨率。
  463. * 如果期望编码分辨率跟采集分辨率一致,可以不设置 sampleBufferSize 属性,而是将 autoSampleBufferSize 设置为 YES。
  464. *
  465. * @note 1. 开启自定义视频采集后,即无需再调用 startPreview 来开启摄像头采集。
  466. * 2. SDK 内部有简单的帧率控制,如果发送太快时 SDK 会自动丢弃多余的帧率;如果超时不发送,SDK 会不断地重复发送的最后一帧。
  467. *
  468. * @param sampleBuffer 向 SDK 发送的 SampleBuffer
  469. */
  470. - (void)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  471. /**
  472. * 8.2 自定义音频采集,向 SDK 发送自己采集的音频 PCM 数据。
  473. *
  474. * 在自定义音频采集模式下,SDK 不再继续从麦克风采集声音,只保留编码和发送能力,您需要定时地发送自己采集的声音数据(PCM 格式)
  475. * 要开启自定义音频采集,需要完成如下两个步骤:
  476. *
  477. * 1. 开启自定义采集:给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_AUDIO_CAPTURE 选项,代表开启自定义音频采集。
  478. * 2. 设定音频采样率:将 TXLivePushConfig 中的 audioSampleRate 属性设置为您期望的音频采样率,audioChannels 设置为期望的声道数,默认值:1(单声道)。
  479. *
  480. * @note SDK 对每次传入的 PCM buffer 大小有严格要求,每一个采样点要求是16位宽。
  481. * 如果是单声道,请保证传入的 PCM 长度为2048;如果是双声道,请保证传入的 PCM 长度为4096。
  482. *
  483. * @param data 要发送的 PCM buffer
  484. * @param len 数据长度
  485. */
  486. - (void)sendCustomPCMData:(unsigned char *)data len:(unsigned int)len;
  487. /**
  488. * 8.3 自定义音频采集,向 SDK 发送自己采集的音频数据。
  489. *
  490. * 相比于 sendCustomPCMData,sendAudioSampleBuffer 主要用于 ReplayKit 录屏推流的场景。
  491. * 要开启自定义音频采集,需要完成如下两个步骤:
  492. *
  493. * 1. 开启自定义采集:给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_AUDIO_CAPTURE 选项,代表开启自定义音频采集。
  494. * 2. 设定音频采样率:将 TXLivePushConfig 中的 audioSampleRate 属性设置为您期望的音频采样率,audioChannels 设置为期望的声道数,默认值:1(单声道)。
  495. *
  496. * 当使用 ReplayKit 做录屏推流时,iOS 的 ReplayKit 接口会回调两种类型的声音数据:
  497. * - RPSampleBufferTypeAudioApp,也就是要录制的 App 的声音数据。
  498. * - RPSampleBufferTypeAudioMic,也就是要录制的麦克风的声音数据。
  499. *
  500. * 当您通过 sendAudioSampleBuffer 向 SDK 调用各种类型的声音数据时,SDK 内部会进行混流,否则只会发送一路的声音数据。
  501. *
  502. * @param sampleBuffer 采集到的声音 sampleBuffer
  503. * @param sampleBufferType RPSampleBufferTypeAudioApp:ReplayKit 采集到的 App 声音;RPSampleBufferTypeAudioMic:ReplayKit 采集到的麦克风声音。
  504. */
  505. #if TARGET_OS_IPHONE
  506. - (void)sendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType;
  507. #endif
  508. /**
  509. * 8.4 要求 SDK 发送静音数据
  510. *
  511. * 该函数配合 sendAudioSampleBuffer 使用,在 InApp 类型录制切后台场合时需要调用,系统屏幕录制不需要。
  512. *
  513. * @param muted YES;静音;NO;关闭静音。
  514. */
  515. - (void)setSendAudioSampleBufferMuted:(BOOL)muted;
  516. /**
  517. * 8.5 自定义视频处理回调
  518. *
  519. * 自定义视频采集和自定义视频处理不能同时开启,与自定义视频采集不同,自定义视频处理依然是由 SDK 采集摄像头的画面,
  520. * 但 SDK 会通过 TXVideoCustomProcessDelegate(见“TXVideoCustomProcessDelegate.h”)回调将数据回调给您的 App 进行二次加工。
  521. *
  522. * 如果要开启自定义视频处理,需要给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_VIDEO_PREPROCESS 选项。
  523. *
  524. * @note 出于性能和稳定性考虑,一般不建议开启此特性。
  525. */
  526. @property(nonatomic,weak) id <TXVideoCustomProcessDelegate> videoProcessDelegate;
  527. /**
  528. * 8.5 自定义视频处理回调
  529. *
  530. * 自定义音频采集和自定义音频处理不能同时开启,与自定义音频采集不同,自定义音频处理依然是由 SDK 采集麦克风的声音,
  531. * 但 SDK 会通过 TXAudioCustomProcessDelegate(见“TXAudioCustomProcessDelegate.h”)回调将数据回调给您的 App 进行二次加工。
  532. *
  533. * 如果要开启自定义音频处理,需要给 TXLivePushConfig 中的 customModeType 属性增加 CUSTOM_MODE_AUDIO_PREPROCESS 选项。
  534. *
  535. * @note 出于性能和稳定性考虑,一般不建议开启此特性。
  536. */
  537. @property(nonatomic,weak) id <TXAudioCustomProcessDelegate> audioProcessDelegate;
  538. /// @}
  539. /////////////////////////////////////////////////////////////////////////////////
  540. //
  541. // (九)更多实用接口
  542. //
  543. /////////////////////////////////////////////////////////////////////////////////
  544. /// @name 更多实用接口
  545. /// @{
  546. /**
  547. * 9.1 发送 SEI 消息,播放端(TXLivePlayer)通过 onPlayEvent(EVT_PLAY_GET_MESSAGE)来接收该消息。
  548. *
  549. * 本接口是将数据直接塞入视频数据头中,因此不能太大(几个字节比较合适),一般常用于塞入自定义时间戳等信息。
  550. *
  551. * @note - sendMessage 已经不推荐使用,会导致 H5 播放器产生兼容性问题,请使用 sendMessageEx。
  552. * - 若您使用过 sendMessage,不推荐立刻升级到 sendMessageEx。
  553. * - sendMessageEx 发送消息给旧版本的5.0 及以前的 SDK 版本时,消息会无法正确解析,但播放不受影响。
  554. */
  555. - (BOOL)sendMessageEx:(NSData *) data;
  556. - (void)sendMessage:(NSData *) data;
  557. /**
  558. * 9.2 打开包含视频状态信息的调试浮层,该浮层一般用于 SDK 调试期间,外发版本请不要打开。
  559. */
  560. - (void)showVideoDebugLog:(BOOL)isShow;
  561. /**
  562. * 9.3 设置调试浮层在视频 view 上的位置。
  563. */
  564. - (void)setLogViewMargin:(TXEdgeInsets)margin;
  565. /**
  566. * 9.4 设置推流是否覆盖时钟
  567. *
  568. * 开始后可以在 TXLivePlayer 中的仪表盘显示画面延迟时间
  569. * @note 需要双方的时间相同才能获取准确的延迟时间
  570. */
  571. - (void)setEnableClockOverlay:(BOOL)enabled;
  572. /**
  573. * 9.5 获取当前推流画面是否有覆盖时钟
  574. */
  575. - (BOOL)enableClockOverlay;
  576. /// @}
  577. @end