KSYGPUStreamerKit.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. //
  2. // KSYGPUStreamerKit.h
  3. // KSYStreamer
  4. //
  5. // Created by pengbin on 09/01/16.
  6. // Copyright © 2016 ksyun. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import <AVFoundation/AVFoundation.h>
  10. #import "libksygpulive.h"
  11. #import "libksystreamerengine.h"
  12. #import "libksygpufilter.h"
  13. /** KSY 直播推流工具类
  14. * kit类将直播推流SDK中提供的各种组件进行组合串联, 功能覆盖了绝大部分秀场直播场景的需求
  15. * 可以直接使用Kit类来开发基础功能的推流APP
  16. * 亦可以参考kit类的代码, 了解每个组件API的使用方法, 自行开发进阶需求的功能
  17. * 本 kit 类中, 演示了3个图层内容和2个音频通道的叠加直播
  18. * 图像通道: ([]中的数字为图层编号)
  19. vCapDev --> cropFilter --> filters[0] -->| vPreMixer |-> preview
  20. logo picture[1] -->|
  21. logo text label[2] -->| vStrMixer |-> picOutput --> streamer
  22. * 音频通道: ([]中的数字为音轨编号)
  23. aCapDev [0] -->|
  24. bgmplayer [1] -->| aMixer --> streamer
  25. */
  26. @interface KSYGPUStreamerKit : NSObject
  27. /**
  28. @abstract 初始化方法
  29. @discussion 创建带有默认参数的 kit,不会打断其他后台的音乐播放
  30. @warning kit只支持单实例推流,构造多个实例会出现异常
  31. */
  32. - (instancetype) initWithDefaultCfg;
  33. /**
  34. @abstract 初始化方法
  35. @discussion 创建带有默认参数的 kit,会打断其他后台的音乐播放
  36. @warning kit只支持单实例推流,构造多个实例会出现异常
  37. */
  38. - (instancetype) initWithInterruptCfg;
  39. /**
  40. @abstract 获取SDK版本号
  41. */
  42. - (NSString*) getKSYVersion;
  43. #pragma mark - sub modules - video
  44. /**
  45. @abstract 视频采集设备
  46. @discussion 通过该指针可以对摄像头进行操作 (操作接口参见GPUImage)
  47. */
  48. @property (nonatomic, readonly) KSYAVFCapture *vCapDev;
  49. /**
  50. @abstract 获取当前使用的滤镜
  51. @discussion 通过此指针可以对滤镜参数进行设置
  52. @waning 请确保外部保留了filter的真实类型的指针, 否则会出现奔溃
  53. */
  54. @property (nonatomic, readonly) GPUImageOutput<GPUImageInput>* filter;
  55. /**
  56. @abstract 图像混合器 for 预览
  57. @discussion 将多图层的内容叠加
  58. */
  59. @property (nonatomic, readonly) KSYGPUPicMixer *vPreviewMixer;
  60. /**
  61. @abstract 图像混合器 for 推流
  62. @discussion 将多图层的内容叠加
  63. */
  64. @property (nonatomic, readonly) KSYGPUPicMixer *vStreamMixer;
  65. /**
  66. @abstract 预览视图
  67. @discussion 通过此指针可以对预览视图进行操作
  68. */
  69. @property (nonatomic, readonly) KSYGPUView *preview;
  70. /**
  71. @abstract 采集到的图像上传GPU
  72. @discussion 用于衔接GPU和capture
  73. */
  74. @property (nonatomic, readonly)KSYGPUPicInput *capToGpu;
  75. /**
  76. @abstract 获取渲染的图像
  77. @discussion 用于衔接GPU和streamer
  78. */
  79. @property (nonatomic, readonly)KSYGPUPicOutput *gpuToStr;
  80. #pragma mark - sub modules - audio
  81. /**
  82. @abstract 音频采集设备 Audio Unit 音频采集
  83. */
  84. @property (nonatomic, readonly) KSYAUAudioCapture *aCapDev;
  85. /**
  86. @abstract 背景音乐播放器
  87. */
  88. @property (nonatomic, readonly) KSYBgmPlayer *bgmPlayer;
  89. /**
  90. @abstract 音频混合器
  91. @discussion 用于将多路音频进行混合,将混合后的音频送入streamerBase
  92. */
  93. @property (nonatomic, readonly) KSYAudioMixer *aMixer;
  94. /**
  95. 音频采集模式
  96. - KSYAudioCap_AudioUnit: 后台音频采集和推流
  97. - KSYAudioCap_AVCaptureDevice: 后台任务静音推流,不支持后台采集
  98. */
  99. typedef NS_ENUM(NSInteger, KSYAudioCapType){
  100. KSYAudioCap_AudioUnit,
  101. KSYAudioCap_AVCaptureDevice
  102. };
  103. /**
  104. @abstract 音频采集模式
  105. @discussion 推荐使用AudioUnit模式
  106. */
  107. @property (nonatomic, assign) KSYAudioCapType audioCaptureType;
  108. /**
  109. @abstract 消息通道
  110. @discussion 用于采集消息,并将数据送入streamerBase
  111. */
  112. @property (nonatomic, readonly) KSYMessage *msgStreamer;
  113. /**
  114. @abstract 获取初始化时创建的底层推流工具
  115. @discussion 1. 通过它来设置推流参数
  116. @discussion 2. 通过它来启动,停止推流
  117. */
  118. @property (nonatomic, readonly) KSYStreamerBase *streamerBase;
  119. #pragma mark - reconnect
  120. /**
  121. @abstract 自动重连次数 关闭(0), 开启(>0), 默认为0
  122. @discussion 当内部发现推流错误后, 会在一段时间后尝试重连
  123. 自动重连不会重新获取推流地址, 仍然使用上次推流的地址
  124. @warning 如果在推流地址有过期时间, 请勿开启
  125. */
  126. @property (nonatomic, assign) int maxAutoRetry;
  127. /**
  128. @abstract 自动重连延时, 发现连接错误后, 重试的延时
  129. @discussion 单位为秒, 默认为2s, 最小值为0.1s
  130. */
  131. @property (nonatomic, assign) double autoRetryDelay;
  132. #pragma mark - layer & track ids
  133. /** 摄像头图层 */
  134. @property (nonatomic, readonly) NSInteger cameraLayer;
  135. /** logo 图片的图层 */
  136. @property (nonatomic, readonly) NSInteger logoPicLayer;
  137. /** logo 文字的图层 */
  138. @property (nonatomic, readonly) NSInteger logoTxtLayer;
  139. /** 贴纸的图层 */
  140. @property (nonatomic, readonly) NSInteger aeLayer;
  141. /** 麦克风通道 */
  142. @property (nonatomic, readonly) int micTrack;
  143. /** 背景音乐通道 */
  144. @property (nonatomic, readonly) int bgmTrack;
  145. #pragma mark - capture state
  146. /**
  147. @abstract 当前采集设备状况
  148. @discussion 可以通过该属性获取采集设备的工作状况
  149. @discussion 通知:
  150. * KSYCaptureStateDidChangeNotification 当采集设备工作状态发生变化时提供通知
  151. * 收到通知后,通过本属性查询新的状态,并作出相应的动作
  152. */
  153. @property (nonatomic, readonly) KSYCaptureState captureState;
  154. /**
  155. @abstract 获取采集状态对应的字符串
  156. */
  157. - (NSString*) getCaptureStateName : (KSYCaptureState) stat;
  158. /**
  159. @abstract 获取当前采集状态对应的字符串
  160. */
  161. - (NSString*) getCurCaptureStateName;
  162. // Posted when capture state changes
  163. FOUNDATION_EXPORT NSString *const KSYCaptureStateDidChangeNotification NS_AVAILABLE_IOS(7_0);
  164. #pragma mark - capture actions
  165. /**
  166. @abstract 启动预览
  167. @param view 预览画面作为subview,插入到 view 的最底层
  168. @discussion 设置完成采集参数之后,按照设置值启动预览,启动后对采集参数修改不会生效
  169. @discussion 需要访问摄像头和麦克风的权限,若授权失败,其他API都会拒绝服务
  170. @warning: 开始推流前必须先启动预览
  171. @see videoDimension, cameraPosition, videoOrientation, videoFPS
  172. */
  173. - (void) startPreview: (UIView*) view;
  174. /**
  175. @abstract 开启视频配置和采集
  176. @discussion 设置完成视频采集参数之后,按照设置值启动视频预览,启动后对视频采集参数修改不会生效
  177. @discussion 需要访问摄像头的权限,若授权失败,其他API都会拒绝服务
  178. @discussion 视频采集成功返回YES,不成功返回NO
  179. */
  180. - (BOOL) startVideoCap;
  181. /**
  182. @abstract 开始音频配置和采集
  183. @discussion 设置完成音频采集参数之后,按照设置值启动音频预览,启动后对音频采集参数修改不会生效
  184. @discussion 需要访问麦克风的权限,若授权失败,其他API都会拒绝服务
  185. @discussion 音频采集成功返回YES,不成功返回NO
  186. */
  187. - (BOOL) startAudioCap;
  188. /**
  189. @abstract 停止预览,停止采集设备,并清理会话
  190. @discussion 若推流未结束,则先停止推流
  191. @see stopStream
  192. */
  193. - (void) stopPreview;
  194. /**
  195. @abstract 进入后台: 暂停图像采集
  196. @discussion 暂停图像采集和预览, 中断旁路录制
  197. @discussion 如果需要释放mic资源请直接调用停止采集
  198. @discussion kit内部在收到UIApplicationDidEnterBackgroundNotification 或采集被打断等事件时,会主动调用本接口
  199. */
  200. - (void) appEnterBackground;
  201. /**
  202. @abstract 回到前台: 恢复采集
  203. @discussion 恢复图像采集和预览
  204. @discussion 恢复音频采集
  205. @discussion kit内部在收到UIApplicationDidBecomeActiveNotification等事件时,会主动调用本接口
  206. */
  207. - (void) appBecomeActive;
  208. #pragma mark - capture & preview & stream settings
  209. /**
  210. @abstract 采集分辨率 (仅在开始采集前设置有效)
  211. @discussion 参见iOS的 AVCaptureSessionPresetXXX的定义
  212. @discussion https://developer.apple.com/reference/avfoundation/avcapturesession/1669314-video_input_presets?language=objc
  213. @discussion 透传到 KSYGPUCamera. 默认值为AVCaptureSessionPreset640x480
  214. @discussion 不同设备支持的预设分辨率可能不同, 请尽量与预览分辨率一致
  215. */
  216. @property (nonatomic, assign) NSString * capPreset;
  217. /**
  218. @abstract 查询实际的采集分辨率
  219. @discussion 参见iOS的 AVCaptureSessionPresetXXX的定义
  220. */
  221. - (CGSize) captureDimension;
  222. /**
  223. @abstract 预览分辨率 (仅在开始采集前设置有效)
  224. @discussion 内部始终将较大的值作为宽度 (若需要竖屏,请设置 videoOrientation)
  225. @discussion 宽高都会向上取整为4的整数倍
  226. @discussion 有效范围: 宽度[160, 1920] 高度[ 90, 1080], 超出范围会取边界有效值
  227. @discussion 当预览分辨率与采集分辨率不一致时:
  228. 若宽高比不同, 先进行裁剪, 再进行缩放
  229. 若宽高比相同, 直接进行缩放
  230. @discussion 默认值为(640, 360)
  231. */
  232. @property (nonatomic, assign) CGSize previewDimension;
  233. /**
  234. @abstract 用户定义的视频 **推流** 分辨率
  235. @discussion 有效范围: 宽度[160, 1280] 高度[ 90, 720], 超出范围会取边界有效值
  236. @discussion 其他与previewDimension限定一致,
  237. @discussion 当与previewDimension不一致时, 同样先裁剪到相同宽高比, 再进行缩放
  238. @discussion 默认值为(640, 360)
  239. @see previewDimension
  240. */
  241. @property (nonatomic, assign) CGSize streamDimension;
  242. /**
  243. @abstract 采集模块输出的像素格式 (默认:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)
  244. @discussion 目前只支持 kCVPixelFormatType_32BGRA 和 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
  245. @discussion 仅在开始推流前设置有效
  246. */
  247. @property(nonatomic, assign) OSType capturePixelFormat;
  248. /**
  249. @abstract gpu output pixel format (默认:kCVPixelFormatType_32BGRA)
  250. @discussion 目前支持 BGRA , NV12 和 I420
  251. @discussion 仅在开始推流前设置有效
  252. */
  253. @property(nonatomic, assign) OSType gpuOutputPixelFormat;
  254. /**
  255. @abstract 采集及编码视频帧率 (开始采集前设置有效)
  256. @discussion video frame per seconds 有效范围[1~30], 超出范围会取边界有效值
  257. @discussion 默认值为15
  258. */
  259. @property (nonatomic, assign) int videoFPS;
  260. /**
  261. @abstract 摄像头位置 (仅在开始采集前设置有效)
  262. @discussion 前后摄像头, 默认值为前置
  263. */
  264. @property (nonatomic, assign) AVCaptureDevicePosition cameraPosition;
  265. /**
  266. @abstract 摄像头朝向, 只在启动采集前设置有效
  267. @discussion 参见UIInterfaceOrientation
  268. @discussion 竖屏时: width < height
  269. @discussion 横屏时: width > height
  270. @discussion 需要与UI方向一致
  271. */
  272. @property (nonatomic, readwrite) UIInterfaceOrientation videoOrientation;
  273. /**
  274. @abstract 是否用双声道推流 (默认为NO)
  275. @discussion 使用KSYAUAudioCapture采集的声音目前只支持单声道(主播说话的声音为单声道)
  276. @discussion 背景音乐如果是双声道的音频,通过修改bStereoStream, 可以让观众听到双声道的音乐
  277. @discussion 只能在开始推流前修改本属性, 开始推流后, 修改无效
  278. */
  279. @property (nonatomic, assign) BOOL bStereoAudioStream;
  280. #pragma mark - camera operation
  281. /**
  282. @abstract 切换摄像头
  283. @return TRUE: 成功切换摄像头, FALSE:当前参数,下一个摄像头不支持,切换失败
  284. @discussion 在前后摄像头间切换,从当前的摄像头切换到另一个,切换成功则修改cameraPosition的值
  285. @discussion 开始预览后开始有效,推流过程中也响应切换请求
  286. @see cameraPosition
  287. */
  288. - (BOOL) switchCamera;
  289. /**
  290. @abstract 当前采集设备是否支持闪光灯
  291. @return YES / NO
  292. @discussion 通常只有后置摄像头支持闪光灯
  293. @see setTorchMode
  294. */
  295. - (BOOL) isTorchSupported;
  296. /**
  297. @abstract 开关闪光灯
  298. @discussion 切换闪光灯的开关状态 开 <--> 关
  299. @see setTorchMode
  300. */
  301. - (void) toggleTorch;
  302. /**
  303. @abstract 设置闪光灯
  304. @param mode AVCaptureTorchModeOn/Off
  305. @discussion 设置闪光灯的开关状态
  306. @discussion 开始预览后开始有效
  307. @see AVCaptureTorchMode
  308. */
  309. - (void) setTorchMode: (AVCaptureTorchMode)mode;
  310. /**
  311. @abstract 获取当前采集设备的指针
  312. @discussion 开放本指针的目的是开放类似下列添加到AVCaptureDevice的 categories:
  313. - AVCaptureDeviceFlash
  314. - AVCaptureDeviceTorch
  315. - AVCaptureDeviceFocus
  316. - AVCaptureDeviceExposure
  317. - AVCaptureDeviceWhiteBalance
  318. - etc.
  319. @return AVCaptureDevice* 预览开始前调用返回为nil,开始预览后,返回当前正在使用的摄像头
  320. @warning 请勿修改摄像头的像素格式,帧率,分辨率等参数,修改后会导致推流工作异常或崩溃
  321. @see AVCaptureDevice AVCaptureDeviceTorch AVCaptureDeviceFocus
  322. */
  323. - (AVCaptureDevice*) getCurrentCameraDevices;
  324. #pragma mark - raw data
  325. /**
  326. @abstract 视频处理回调接口
  327. @param sampleBuffer 原始采集到的视频数据
  328. @discussion 对sampleBuffer内的图像数据的修改将传递到观众端
  329. @discussion 请注意本函数的执行时间,如果太长可能导致不可预知的问题
  330. @discussion 请参考 CMSampleBufferRef
  331. */
  332. @property(nonatomic, copy) void(^videoProcessingCallback)(CMSampleBufferRef sampleBuffer);
  333. /**
  334. @abstract 音频处理回调接口
  335. @discussion sampleBuffer 原始采集到的音频数据
  336. @discussion 对sampleBuffer内的pcm数据的修改将传递到观众端
  337. @discussion 请注意本函数的执行时间,如果太长可能导致不可预知的问题
  338. @discussion 当audioDataType 为KSYAudioData_CMSampleBuffer时才会被触发回调
  339. @discussion 请参考 CMSampleBufferRef
  340. @see audioDataType
  341. */
  342. @property(nonatomic, copy) void(^audioProcessingCallback)(CMSampleBufferRef sampleBuffer);
  343. /**
  344. @abstract 音频处理回调接口
  345. @discussion pData len为原始采集到的音频数据
  346. @discussion 当audioDataType 为KSYAudioData_RawPCM时才会被触发回调
  347. @discussion 请注意本函数的执行时间,如果太长可能导致不可预知的问题
  348. @see audioDataType
  349. */
  350. @property(nonatomic, copy) void(^pcmProcessingCallback)(uint8_t** pData, int len, const AudioStreamBasicDescription* fmt, CMTime timeInfo);
  351. /** 音频通路数据类型 */
  352. typedef NS_ENUM(NSInteger, KSYAudioDataType){
  353. /// 音频数据采用CMSampleBuffer传递
  354. KSYAudioData_CMSampleBuffer,
  355. /// 音频数据直接使用原始的PCM数据指针传递
  356. KSYAudioData_RawPCM,
  357. };
  358. /**
  359. @abstract 音频处理通路数据类型 (默认为 KSYAudioData_CMSampleBuffer)
  360. @discussion 音频数据转为 CMSampleBuffer时有格式开销, 使用RawPCM资源消耗会少一些
  361. @discussion 内部组件对KSYAudioData_RawPCM可能不完善, 目前仅保证基本通路能工作
  362. */
  363. @property (nonatomic, assign) KSYAudioDataType audioDataType;
  364. /**
  365. @abstract 摄像头采集被打断的消息通知
  366. @discussion bInterrupt 为YES, 表明被打断, 摄像头采集暂停
  367. @discussion bInterrupt 为NO, 表明恢复采集
  368. */
  369. @property(nonatomic, copy) void(^interruptCallback)(BOOL bInterrupt);
  370. #pragma mark - filters
  371. /**
  372. @abstract 设置当前使用的滤镜
  373. @discussion 若filter 为nil, 则关闭滤镜
  374. @discussion 若filter 为GPUImageFilter的实例,则使用该滤镜做处理
  375. @discussion filter 也可以是GPUImageFilterGroup的实例,可以将多个滤镜组合
  376. @see GPUImageFilter
  377. */
  378. - (void) setupFilter:(GPUImageOutput<GPUImageInput>*) filter;
  379. #pragma mark - mirror & rotate
  380. /** 预览设置成镜像模式,默认为NO */
  381. @property (nonatomic, assign) BOOL previewMirrored;
  382. /** 推流设置成镜像模式,默认为NO */
  383. @property (nonatomic, assign) BOOL streamerMirrored;
  384. /**
  385. @abstract 推流的画面是否冻结 (默认为NO)
  386. @discussion 通过本属性可以主动将推流的画面固定为当前帧
  387. */
  388. @property (nonatomic, assign) BOOL streamerFreezed;
  389. /** 预览图像朝向, 如果UI能够旋转,需要保持和UI的朝向一致 */
  390. @property (nonatomic, assign) UIInterfaceOrientation previewOrientation;
  391. /** 推流图像朝向, 如果UI能够旋转, 可以跟随旋转,也可以不修改 */
  392. @property (nonatomic, assign) UIInterfaceOrientation streamOrientation;
  393. /**
  394. @abstract 根据UI的朝向旋转预览视图, 保证预览视图全屏铺满窗口
  395. @param orie 旋转到目标朝向, 需要从demo中获取UI的朝向传入
  396. @discussion 采集到的图像的朝向还是和启动时的朝向一致
  397. @discussion 此函数与 previewOrientation的set函数功能一样
  398. */
  399. - (void) rotatePreviewTo: (UIInterfaceOrientation) orie;
  400. /**
  401. @abstract 根据UI的朝向旋转推流画面, 这个是可以选的,可以不跟随旋转
  402. @param orie 旋转到目标朝向, 需要从demo中获取UI的朝向传入
  403. @discussion 此函数与 streamOrientation 的set函数功能一样
  404. */
  405. - (void) rotateStreamTo: (UIInterfaceOrientation) orie;
  406. #pragma mark - pictures & logo
  407. /**
  408. @abstract 水印logo的图片
  409. @discussion 设置为nil为清除水印图片
  410. @discussion 请注意背景图片的尺寸, 太大的图片会导致内存占用过高
  411. */
  412. @property (nonatomic, readwrite) KSYGPUPicture *logoPic;
  413. /**
  414. 设置水印图片的朝向
  415. @param orien 图片的朝向
  416. */
  417. - (void) setLogoOrientaion:(UIImageOrientation) orien;
  418. /**
  419. 设置指定图层的朝向
  420. @param orien 目标朝向
  421. @param idx 图层的index
  422. */
  423. - (void) setOrientaion:(UIImageOrientation) orien ofLayer:(NSInteger)idx;
  424. /**
  425. 设置指定图层的大小和位置
  426. @param rect 位置+大小
  427. @param idx 指定图层的index
  428. */
  429. - (void) setRect:(CGRect) rect ofLayer:(NSInteger)idx;
  430. /**
  431. @abstract 文字内容的图片
  432. @discussion 设置为nil为清除内容图片
  433. */
  434. @property (nonatomic, readwrite) KSYGPUPicture *textPic;
  435. /**
  436. @abstract 贴纸的图片
  437. @discussion 设置为nil为清除贴纸图片
  438. */
  439. @property (nonatomic, readwrite) GPUImageUIElement *aePic;
  440. /**
  441. @abstract 水印logo的图片的位置和大小
  442. @discussion 位置和大小的单位为预览视图的百分比, 左上角为(0,0), 右下角为(1.0, 1.0)
  443. @discussion 如果宽为0, 则根据图像的宽高比, 和设置的高度比例, 计算得到宽度的比例
  444. @discussion 如果高为0, 方法同上
  445. */
  446. @property (nonatomic, readwrite) CGRect logoRect;
  447. /**
  448. @abstract 水印logo的图片的位置
  449. @discussion alpha为透明度(0-1),0完全透明,1完全不透明
  450. */
  451. @property (nonatomic, readwrite) CGFloat logoAlpha;
  452. /**
  453. @abstract 水印文字的label
  454. @discussion 借用UILabel来指定文字的颜色,字体, 透明度, 对齐方式等属性
  455. @discussion 请注意保证背景图片的尺寸, 太大的图片会导致内存占用过高
  456. @warning 如果使用非等宽字体, 可能导致闪烁(默认为Courier)
  457. @warning picMixer和UILabel都有alpha属性, 建议只选用其中一个, 固定另一个为1.0,
  458. 为了减少接口, 建议直接使用UILabel的属性,
  459. 如果两者同时使用, 最终图层的alpha为两者乘积
  460. @see updateTextLabel
  461. */
  462. @property (nonatomic, readwrite) UILabel *textLabel;
  463. /**
  464. @abstract 水印文字的图片的位置和大小
  465. @discussion 位置和大小的单位为预览视图的百分比, 左上角为(0,0), 右下角为(1.0, 1.0)
  466. @discussion 如果宽为0, 则根据文字图像的宽高比, 和设置的高度比例, 计算得到宽度的比例
  467. @discussion 如果高为0, 方法同上
  468. */
  469. @property (nonatomic, readwrite) CGRect textRect;
  470. /**
  471. @abstract 刷新水印文字的内容
  472. @discussion 先修改文字的内容或格式,调用该方法后生效
  473. @see textLable
  474. */
  475. - (void) updateTextLabel;
  476. #pragma mark - camera
  477. /**
  478. @abstract 当前采集设备是否支持自动变焦
  479. @param point相机对焦的位置
  480. @return YES / NO
  481. @discussion 通常只有后置摄像头支持自动变焦
  482. */
  483. - (BOOL)focusAtPoint:(CGPoint )point;
  484. /**
  485. @abstract 当前采集设备是否支持自动曝光
  486. @param point相机曝光的位置
  487. @return YES / NO
  488. @discussion 通常前后置摄像头都支持自动曝光
  489. */
  490. - (BOOL)exposureAtPoint:(CGPoint )point;
  491. /**
  492. @abstract 触摸缩放因子
  493. */
  494. @property (nonatomic, assign) CGFloat pinchZoomFactor;
  495. /**
  496. @abstract 摄像头防抖模式,切换摄像头后需要进行重新设置
  497. @discussion (iPhone前置摄像头不支持防抖功能)
  498. */
  499. @property (nonatomic, assign) AVCaptureVideoStabilizationMode stabilizationMode;
  500. #pragma mark - profiles
  501. /**
  502. @abstract 推流前profile类型
  503. */
  504. typedef NS_ENUM(NSInteger, KSYStreamerProfile) {
  505. // capres strres fps kbps(max)
  506. KSYStreamerProfile_360p_auto = 0, // 640x480 640x360 15 512(便于后续扩展)
  507. KSYStreamerProfile_360p_1 = 1, // 960x540 640x360 15 512
  508. KSYStreamerProfile_360p_2 = 2, // 1280x720 640x360 20 768
  509. KSYStreamerProfile_360p_3 = 3, // 640x480 640x360 15 512
  510. KSYStreamerProfile_540p_auto = 100, // 960x540 960x540 15 768 (便于后续扩展)
  511. KSYStreamerProfile_540p_1 = 101, // 960x540 960x540 15 768
  512. KSYStreamerProfile_540p_2 = 102, // 1280x720 960x540 15 768
  513. KSYStreamerProfile_540p_3 = 103, // 1280x720 960x540 20 1024
  514. KSYStreamerProfile_720p_auto = 200, // 1280x720 1280x720 15 1024 (便于后续扩展)
  515. KSYStreamerProfile_720p_1 = 201, // 1280x720 1280x720 15 1024
  516. KSYStreamerProfile_720p_2 = 202, // 1280x720 1280x720 20 1280
  517. KSYStreamerProfile_720p_3 = 203, // 1280x720 1280x720 24 1536
  518. };
  519. /**
  520. @abstract 采集和推流配置参数
  521. @discussion 选择profile类型后, 采集和编码参数会自动配置进去, 默认的profile类型是KSYStreamerProfile_540p_3
  522. */
  523. @property (nonatomic, assign) KSYStreamerProfile streamerProfile;
  524. #pragma mark - message
  525. /**
  526. @abstract 用户待发送的消息
  527. @param messageData待发送的消息
  528. @return YES / NO
  529. */
  530. - (BOOL) processMessageData:(NSDictionary *)messageData;
  531. @end