思路是以我之前写的博客扩展的
https://www.jianshu.com/writer#/notebooks/3738533/notes/58814308
能够实现视频的分屏比例 横竖屏都可:1:1、16:9、9:16
根据比例计算出每一个视频图层的位置、分辨率
效果图






注意:因为在获取竖屏的CVPixelBufferRef,需要旋转90度,否则合成出的图片有旋转角度,
建议先把竖屏旋转之后,再合成,因为虽然单个对CGImageRef进行旋转耗时在30-40ms之间,但是连续读取帧,处理帧会造成耗时严重。
处理frame的核心代码:
- (CGRect)getComposeTypeFromTrackID:(NSInteger)trackID renderSize:(CGSize)renderSize{
CGRect rect = CGRectZero;
switch (self.type) {
case composeVideos_1And1_portrait:
rect = CGRectMake(0, (renderSize.height/2)*(trackID - 1), renderSize.width, renderSize.height/2);
break;
case composeVideos_1And1_landscape:
rect = CGRectMake((renderSize.width/2)*(trackID - 1), 0, renderSize.width/2, renderSize.height);
break;
case composeVideos_16And9_portrait:
{
CGFloat height = renderSize.width* 9.0/16.0;
CGFloat y = (renderSize.height - height * 2)/2 + (trackID - 1)*height;
rect = CGRectMake( 0, y, renderSize.width, height);
}
break;
case composeVideos_16And9_landscape:
{
CGFloat height = renderSize.width* 9.0/16.0;
CGFloat x = (renderSize.width/2)*(trackID - 1);
CGFloat y = (renderSize.height - height)/2;
rect = CGRectMake(x, y, renderSize.width/2, height);
}
break;
case composeVideos_9And16_portrait:
{
CGFloat height = renderSize.height/2;
CGFloat width = renderSize.width* 9.0/16.0;
CGFloat y = height * (trackID - 1);
CGFloat x = (renderSize.width - width)/2;
rect = CGRectMake(x, y, width, height);
}
break;
case composeVideos_9And16_landscape:
{
CGFloat height = renderSize.height;
CGFloat width = renderSize.width* 9.0/16.0/2;
CGFloat y = 0;
CGFloat x = (renderSize.width - width*2)/2 + (trackID - 1)*width;
rect = CGRectMake(x, y, width, height);
}
break;
default:
break;
}
return rect;
}
网友评论