KSYClipWriter.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. //
  2. // KSYClipWriter.h
  3. // KSYLiveDemo
  4. //
  5. // Created by iVermisseDich on 2017/4/7.
  6. // Copyright © 2017年 qyvideo. All rights reserved.
  7. //
  8. #import <AVFoundation/AVFoundation.h>
  9. #import <UIKit/UIKit.h>
  10. #import "KSYTypeDef.h"
  11. /**
  12. 金山云转码SDK iOS版提供了iOS移动设备上的转码合成功能
  13. * 音频编码采用AAC编码,码率可配置;
  14. * 视频频编码采用H.264、H.265编码,码率可配置;
  15. * 支持写入本地flv和mp4文件;
  16. __Found__: 2017-4-7
  17. */
  18. @interface KSYClipWriter : NSObject
  19. /**
  20. @abstract 获取SDK版本号
  21. */
  22. - (NSString*) getKSYVersion;
  23. #pragma mark - configures
  24. /**
  25. @abstract 本地录制,输出路径
  26. @discussion 将音视频流写入本地文件
  27. eg: /var/xxxxx/xxx.mp4 /var/xxxxx/xxx.flv
  28. */
  29. @property (nonatomic, readonly) NSURL *hostURL;
  30. /**
  31. @abstract 视频帧率
  32. @discussion 本地录制的视频帧率,开启编码前丢帧时,帧率生效
  33. @discussion 编码前丢帧shouldEnableKSYDropModule为YES时,帧率设置生效
  34. @discussion 编码前丢帧shouldEnableKSYDropModule为NO时,帧率保持与输入帧率一致
  35. */
  36. @property (nonatomic, assign) int videoFPS;
  37. /**
  38. @abstract 视频编码器 默认为 自动选择
  39. @discussion video codec used for encode
  40. @discussion 修改此选项会导致videoEncodePerf值变化
  41. @discussion 如果需要定制编码档次, 请在修改videoCodec之后再测设置
  42. @see KSYVideoCodec,videoEncodePerf
  43. */
  44. @property (nonatomic, assign) KSYVideoCodec videoCodec;
  45. /**
  46. @abstract 音频编码器 (默认为AAC-HE)
  47. @discussion audio codec used for encode
  48. @see KSYAudioCodec
  49. */
  50. @property (nonatomic, assign) KSYAudioCodec audioCodec;
  51. /**
  52. @abstract 视频编码码率(单位:kbps, 默认:500)
  53. */
  54. @property (nonatomic, assign) int videoInitBitrate; // kbit/s of video
  55. /**
  56. @abstract 写入全局附带的metadata (默认为nil)
  57. @discussion key 一定要是 NSString* 类型的
  58. */
  59. @property(atomic, copy) NSDictionary * streamMetaData;
  60. /**
  61. @abstract 视频流附带的metadata (默认为nil)
  62. @discussion key 一定要是 NSString* 类型的; 目前有效
  63. */
  64. @property(atomic, copy) NSDictionary * videoMetaData;
  65. /**
  66. @abstract 最大关键帧间隔(单位:秒, 默认:3)
  67. @discussion 即GOP长度 画面静止时,隔n秒插入一个关键帧
  68. */
  69. @property (nonatomic, assign) float maxKeyInterval; // seconds
  70. /**
  71. @abstract 音频编码码率(单位:kbps)
  72. @discussion 音频目标编码码率 (比如48,96,128等)
  73. */
  74. @property (nonatomic, assign) int audiokBPS; // kbit/s of audio
  75. /**
  76. @abstract 待编码的视频场景 (默认为KSYLiveScene_Default)
  77. @discussion KSY内部会根据场景的特征进行参数调优,开始录制前设置有效
  78. */
  79. @property (nonatomic, assign) KSYLiveScene liveScene;
  80. /**
  81. @abstract 本次录制的目标场景 (默认为KSYRecScene_ConstantBitRate)
  82. @discussion 用于指定录制时, 视频编码器码率控制的优先目标
  83. @discussion 恒定码率: 最后视频文件的码率更平稳,但复杂场景质量可能差一些
  84. @discussion 恒定质量: 最后视频文件的质量更平稳写, 但码率波动要大一些
  85. @discussion 开始录制前设置有效,
  86. */
  87. @property (nonatomic, assign) KSYRecScene recScene;
  88. /**
  89. @abstract 质量等级(默认:20)
  90. @discussion 视频恒定质量等级,范围0~51,值越小,质量越好
  91. @discussion 当 recScene 为 KSYRecScene_ConstantQuality, 且选择软编码器时有效
  92. */
  93. @property (nonatomic, assign) int videoCrf;
  94. /**
  95. @abstract 视频编码性能档次
  96. @discussion 视频质量和设备资源之间的权衡,开始推流前, videoCodec设置之后,修改有效
  97. @discussion 选择软编码的默认为KSYVideoEncodePer_LowPower
  98. @discussion 选择Auto或硬编码的默认为KSYVideoEncodePer_HighPerformance
  99. */
  100. @property (nonatomic, assign) KSYVideoEncodePerformance videoEncodePerf;
  101. /**
  102. @abstract 是否处理视频的图像数据 (默认YES)
  103. @warning 启动合成前设置为NO, 则在转码过程中无法再开启图像
  104. @discussion 启动合成前设置为NO, 写入过程中修改本属性无效
  105. */
  106. @property (nonatomic, assign) BOOL bWithVideo;
  107. /**
  108. @abstract 是否处理音频数据 (默认YES)
  109. */
  110. @property (nonatomic, assign) BOOL bWithAudio;
  111. /**
  112. @abstract mp4文件允许快速启动 (默认YES)
  113. @discussion mp4格式的文件中将moov等index信息放到文件开头
  114. @warning 启用此开关会在结束是对文件进行处理, 如果要长时间录制,请关闭本选项
  115. */
  116. @property (nonatomic, assign) BOOL mp4FastStart;
  117. #pragma mark - Status Notification
  118. /**
  119. @abstract 当前写入状态
  120. @discussion 可以通过该属性获取写入的工作状态
  121. @discussion 通知:
  122. * KSYStreamStateDidChangeNotification 当写入工作状态发生变化时提供通知
  123. * 收到通知后,通过本属性查询新的状态,并作出相应的动作
  124. */
  125. @property (nonatomic, readonly) KSYStreamState writeState;
  126. /**
  127. @abstract 获取写入状态对应的字符串
  128. @param stat 状态码
  129. @return 状态名称
  130. */
  131. - (NSString *)getWriteStateName:(KSYStreamState)stat;
  132. /**
  133. @abstract 获取当前写入状态对应的字符串
  134. @return 当前状态名称
  135. */
  136. - (NSString *)getCurWriteStateName;
  137. /**
  138. @abstract 当前转码/写入的错误码
  139. @discussion 可以通过该属性获取写入失败的原因
  140. @discussion 当streamState 为KSYStreamStateError时可查询
  141. @discussion KSYStreamErrorCode_KSYAUTHFAILED 除外
  142. @discussion 在streamState 为KSYStreamStateConnected 时查询到
  143. @discussion 状态变化后清0
  144. @see streamState
  145. */
  146. @property (nonatomic, readonly) KSYStreamErrorCode streamErrorCode;
  147. /**
  148. @abstract 数据流写入状态变化时的回调函数
  149. @discussion 参数为新状态
  150. */
  151. @property (nonatomic, copy) void(^writeStateChange)(KSYStreamState newState);
  152. /**
  153. @abstract 获取错误码对应的字符串
  154. @param code 错误码
  155. */
  156. - (NSString *)getKSYWriteErrorCodeName:(KSYStreamErrorCode)code;
  157. /**
  158. @abstract 获取当前错误码对应的字符串
  159. */
  160. - (NSString *)getCurKSYWriteErrorCodeName;
  161. /**
  162. @abstract 帧率应发生变化时的回调函数
  163. @discussion 参数为建议设定的fps
  164. */
  165. @property (nonatomic, copy)void (^videoFPSChange)(int32_t newVideoFPS);
  166. // Posted when stream state changes
  167. FOUNDATION_EXPORT NSString *const KSYWriteStateDidChangeNotification NS_AVAILABLE_IOS(7_0);
  168. #pragma mark - methods
  169. /**
  170. @abstract 初始化方法 (step1)
  171. @discussion 初始化,将下列属性设置为默认值
  172. * _videoFPS = 15;
  173. * _videoCodec = KSYVideoCodec_AUTO;
  174. * _audiokBPS = 32;
  175. * _videoInitBitrate = 500;
  176. @warning KSYClipWriter只支持单实例写入,构造多个实例会出现异常
  177. */
  178. - (instancetype)initWithDefaultCfg;
  179. /**
  180. @abstract 启动写入文件 (step2)
  181. @discussion 本地写入支持mp4和flv两种输出格式,通过url的文件后缀指定
  182. @discussion "/var/xxx/xx.mp4", "/var/xxx/xx.flv"
  183. @discussion 写入参数主要是视频编码器,音视频码率的设置
  184. @see hostURL, videoCodec,videokBPS,audiokBPS
  185. */
  186. - (void)startWritingWith:(NSURL *)url;
  187. /**
  188. @abstract 停止写入 (step3)
  189. @discussion 停止文件写入
  190. */
  191. - (void)stopWriting;
  192. /**
  193. @abstract 停止写入 (step3)
  194. @discussion 停止文件写入
  195. @param complete 完成回调
  196. */
  197. - (void)stopWriting:(void(^)())complete;
  198. /**
  199. @abstract 静音 (仍然有音频,只是音量为0)
  200. @param bMute YES / ON
  201. */
  202. - (void)muteStream:(BOOL)bMute;
  203. /**
  204. @abstract 处理一个视频帧(只支持编码前的原始图像数据)
  205. @param sampleBuffer Buffer to process
  206. @param completion 当前视频帧处理完成的回调
  207. @discussion 应当在开始写入前定期调用此接口,比如按照采集帧率调用
  208. @discussion 支持的图像格式包括: BGR0,NV12,YUVA444P,YUV420P
  209. */
  210. - (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer
  211. onComplete:(void (^)(BOOL))completion;
  212. /**
  213. @abstract 处理一个视频帧(只支持编码前的原始图像数据)
  214. @param pixelBuffer 待编码的像素数据
  215. @param timeStamp 待编码的时间戳
  216. @param completion 当前视频帧处理完成的回调
  217. @discussion 应当在开始写入前定期调用此接口,比如按照采集帧率调用
  218. @discussion 支持的图像格式包括: BGR0,NV12,YUVA444P,YUV420P
  219. */
  220. - (void)processVideoPixelBuffer:(CVPixelBufferRef)pixelBuffer
  221. timeInfo:(CMTime)timeStamp
  222. onComplete:(void (^)(BOOL))completion;
  223. /**
  224. @abstract 处理一段音频数据
  225. @param sampleBuffer Buffer to process
  226. @discussion 应当在开始写入前定期调用此接口,与processVideoSampleBuffer 交错进行
  227. @warning 目前只支持 单通道 S16 格式的PCM数据
  228. */
  229. - (void)processAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  230. #pragma mark - Status property
  231. /**
  232. @abstract 查询当前是否处于写入状态 (connecting, 或connected)
  233. */
  234. - (BOOL)isWriting;
  235. /**
  236. @abstract 查询当前编码的视频码率大小(每秒更新)
  237. @discussion 该码率为编码器产生的视频码率大小,单位为kbps
  238. @see videoMaxBitrate
  239. */
  240. @property (nonatomic, readonly) double encodeVKbps;
  241. /**
  242. @abstract 查询当前编码的音频码率大小(每秒更新)
  243. @discussion 该码率为编码器产生的音频码率大小,单位为kbps
  244. @see audiokBPS
  245. */
  246. @property (nonatomic, readonly) double encodeAKbps;
  247. /**
  248. @abstract 查询当前编码的平均视频帧率
  249. @discussion 采集设备的输出帧率为videoFPS,约等于编码的目标帧率
  250. @discussion 编码的视频帧率不会高于采集帧率,但是当CPU资源不足时,编码帧率会低于采集帧率
  251. @see videoFPS
  252. */
  253. @property (nonatomic, readonly) double encodingFPS;
  254. /**
  255. @abstract 查询本次视频写入已经编码的总帧数
  256. @discussion 从开始写入到现在,编码过的视频总帧数
  257. */
  258. @property (nonatomic, readonly) int encodedFrames;
  259. #pragma mark - logblock
  260. /**
  261. @abstract clip writer
  262. @discussion 相关字段说明请联系金山云技术支持
  263. */
  264. @property (nonatomic, copy)void (^logBlock)(NSString *logJson);
  265. /**
  266. @abstract 是否允许编码前丢帧,默认开启(videoFPS生效)
  267. @warnning 离线转码需要输出所有帧的情况下开启,videoFPS将不生效,根据输入源的fps保持一致
  268. */
  269. @property (nonatomic, assign) BOOL shouldEnableKSYDropModule;
  270. @end