-
Notifications
You must be signed in to change notification settings - Fork 271
customOutputSize
- 预览分辨率和编码推流分辨率可以不一致,这时候,较高的预览分辨率可以让主播预览时画质更清晰。
- 预览frame可以任意尺寸,无需全屏预览。
视频分辨率,也就是图像的宽高或者说尺寸,在kit类中存在如下三中类型的分辨率:
- 采集分辨率: 是指摄像头采集到的画面的分辨率, 作为数据的源头决定了, 后续画面质量的上限
- 预览分辨率: 是指将采集的画面渲染到主播预览视图的分辨率
- 推流分辨率: 是指送入到视频压缩并发送到服务器上去的视频的分辨率, 也就是其他观众能看到的画面的分辨率
详见开源代码:https://github.com/ksvc/KSYLive_iOS/blob/master/source/KSYGPUStreamerKit.h
kit类中, 以上三种属性作用的位置如下图所示: ![basic flow](http://g.gravizo.com/svg?digraph G { rankdir = LR; node [shape="box"]; vCapDev[label="vCapDev\n采集"]; streamer; node [shape="Mrecord"]; capToGpu;cropfilter;filter;vPreviewMixer;vStreamMixer;preview;gpuToStr; node [shape="plaintext"]; capPreset[label="capPreset \n 采集分辨率"]; previewDimension[label="previewDimension \n 预览分辨率"]; streamDimension[label="streamDimension \n 推流分辨率"]; cropRatio[label="根据采集和\n预览分辨率\n计算裁剪区"]; vCapDev -> capToGpu; {rank=same;capPreset->vCapDev;} capToGpu -> cropfilter; {rank=same:cropRatio->cropfilter;} cropfilter -> filter; filter -> {vPreviewMixer vStreamMixer}; {rank=same;previewDimension->vPreviewMixer;} {rank=same;streamDimension->vStreamMixer;} vPreviewMixer->preview; vStreamMixer -> gpuToStr; {rank=same;gpuToStr->streamer;} } )
设置较高的采集分辨率,该分辨率图像将用于预览。 kit类的capPreset属性可配置取值,请参考:Video Input Presets 一览表。
/**
@abstract 预览分辨率 (仅在开始采集前设置有效)
@discussion 内部始终将较大的值作为宽度 (若需要竖屏,请设置 videoOrientation)
@discussion 宽高都会向上取整为4的整数倍
@discussion 有效范围: 宽度[160, 1920] 高度[ 90, 1080], 超出范围会取边界有效值
@discussion 当预览分辨率与采集分辨率不一致时:
若宽高比不同, 先进行裁剪, 再进行缩放
若宽高比相同, 直接进行缩放
@discussion 默认值为(640, 360)
*/
@property (nonatomic, assign) CGSize previewDimension;
/**
@abstract 用户定义的视频 **推流** 分辨率
@discussion 有效范围: 宽度[160, 1280] 高度[ 90, 720], 超出范围会取边界有效值
@discussion 其他与previewDimension限定一致,
@discussion 当与previewDimension不一致时, 仅仅进行缩放
@discussion 默认值为(640, 360)
@see previewDimension
*/
@property (nonatomic, assign) CGSize streamDimension;
- 设置采集分辨率
设置预览分辨率
_kit.previewDimension = [self.presetCfgView capResolutionSize];
//采集分辨率
- (CGSize) capResolutionSize {
NSInteger idx = _resolutionUI.selectedSegmentIndex;//_resolutionUI指的是上图中的采集分辨率分段控制器
return [self dimensionToSize:idx];
}
//分辨率
- (CGSize) dimensionToSize:(NSInteger)idx {
switch (idx) {
case 0:
return CGSizeMake(640, 360);
case 1:
return CGSizeMake(960, 540);
case 2:
return CGSizeMake(1280, 720);
case 3:
return CGSizeMake(640, 480);
default:
return CGSizeMake(640, 360);
}
}
- 设置推流分辨率
//设置推流分辨率
_kit.streamDimension = [self.presetCfgView strResolutionSize];
//推流分辨率
- (CGSize) strResolutionSize {
NSInteger idx = _streamResoUI.selectedSegmentIndex;
return [self dimensionToSize:idx];
}
- (CGSize) dimensionToSize:(NSInteger)idx {
switch (idx) {
case 0:
return CGSizeMake(640, 360);
case 1:
return CGSizeMake(960, 540);
case 2:
return CGSizeMake(1280, 720);
case 3:
return CGSizeMake(640, 480);
default:
return CGSizeMake(640, 360);
}
}