-
Notifications
You must be signed in to change notification settings - Fork 271
captureParams
由于提供了两种层次的接口,使用kit类的配置和使用组件化的配置API稍微有一点不同。
与采集相关的参数,目前开放的接口主要是:
- 前后摄像头:一般iOS设备有前后两个摄像头,kit类可以设定启动采集时的默认摄像头,默认值为前置摄像头;
- 采集分辨率/推流分辨率:kit类的采集分辨率和推流分辨率可以分别进行设置,默认值都为avcapturesessionpreset640x480;
- 采集帧率 :采集n帧每秒,默认值为15帧;
- 画面朝向 :横屏还是竖屏,请保证与界面的朝向一致,默认为竖直方向;
- 音频采集是否被打断,默认为YES;
- 原始采集数据回调;
demo中请参见setCaptureCfg方法
kit的cameraPosition属性,在开始采集前有效。
通过设置该属性来指定,启动采集时使用哪个摄像头。
启动采集之后,通过kit的switchCamera方法 来切换不同的摄像头。
kit.cameraPosition = AVCaptureDevicePositionBack;(前置/后置)
[kit switchCamera];
分辨率 详解
视频分辨率,也就是图像的宽高或者说尺寸,在kit类中存在如下三中类型的分辨率:
- 采集分辨率: 是指摄像头采集到的画面的分辨率, 作为数据的源头决定了, 后续画面质量的上限
- 预览分辨率: 是指将采集的画面渲染到主播预览视图的分辨率
- 推流分辨率: 是指送入到视频压缩并发送到服务器上去的视频的分辨率, 也就是其他观众能看到的画面的分辨率
在启动采集前, 需要设定采集分辨率, 采集分辨率与设备相关, SDK中是直接使用Apple的API定义的分辨率接口来设定的. 可以直接参考Apple的官方文档 kit类的capPreset属性和 KSYGPUCamera类的captureSessionPreset属性, 都是使用Apple的定义的类型.
kit类的capPreset属性可配置取值,请参考:Video Input Presets 一览表
开始预览前, 需要设定预览分辨率, 一般预览分辨率和采集分辨率都可以尽量配置成一致的, 除非宽高比不同. kit类中, 添加了cropFilter 用来修正宽高比, 比如采集的分辨率为 480x640(3:4), 但是手机的比例为(9:16), 需要先裁剪掉两边的黑边, 预览才比较正常. 在kit类中, 提供了previewDimension属性, 指定尺寸后, 会自动计算好需要裁剪的区域. 详细计算过程请参考kit类的代码.
开始推流前, 需要设定推流分辨率, kit类提供了streamDimension属性进行设置. 如果预览和推流的分辨率一致, 那么主播和观众看到的画面质量一致(streamDimension == previewDimension). 当两个属性不相同时, streamDimension会直接对预览的视图进行缩放, 得到推流的画面.
- 注意: 需要用户自行保证streamDimension和previewDimension的宽高比, 如果两者宽高比不同, 观众看到的画面可能是变形了的
- 注意: 如果streamDimension大于previewDimension, 观众看到的画面质量并不一定更好,因为数据源的尺寸决定了质量的上限
- 建议: capPreset == previewDimension >= streamDimension
采集帧率就是每秒采集和编码的视频帧数,建议软编时,设置为15fps左右,硬编码可以设置为24fps。设置过高容易导致设备发热严重。
kit.videoFPS = 15;
画面朝向描述的是横屏还是竖屏,需要与UI朝向一致,否则会出现画面缺失的情况。
UIInterfaceOrientation orien = [[UIApplication sharedApplication] statusBarOrientation];
[kit setVideoOrientationBy:orien];
kit类的原始音视频数据回调,是直接将KSYGPUCamera类的回调数据转发出来的。
_kit.videoProcessingCallback = ^(CMSampleBufferRef sampleBuffer){
processVideo(sampleBuffer);
};
_kit.audioProcessingCallback =^(CMSampleBufferRef sampleBuffer){
processAudio(sampleBuffer);
};
回调的samplebuffer 是未经过任何处理的原始数据。 注意: 请尽量限制回调函数的处理时间,太长会导致卡顿。
采集的底层类是指 KSYGPUCamera类, 大部分采集的属性都跟kit类设置的一样,下面主要列举不同的地方
- 前后摄像头,KSYGPUCamera需要在创建类的初始化时传入摄像头参数
- 采集分辨率,KSYGPUCamera类只支持iOS提供的原生支持的分辨率, 需要在启动的时候传入参数 具体原生支持的分辨率请参阅相关文档
KSYGPUCamera * capDev;
capDev = [[KSYGPUCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480
cameraPosition:AVCaptureDevicePositionBack];
- 推流分辨率, 可以通过修改 KSYGPUPicOutput的属性来指定
KSYGPUPicOutput * picOutput;
// 与采集分辨率一致:
picOutput.bCustomOutputSize = NO;
// 与采集分辨率不同:
CGSize sz = CGSizeMake(640, 360);
picOutput.bCustomOutputSize = YES;
picOutput.outputSize = rect.size;