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