短视频
抖音轮播
- 采用封装JPVideoPlayer,实现视频列表流畅滑动,上下滑动可切换视频列表
- 监听scrollView代理方法,通过监听
scrollView.contentOffset.y
和 scrollViewWillBeginDragging的self.lastcontentOffset.y
判断上下滑动,
视频裁剪
- 根据时长:startTime和stopTime
- 先判断时长有没有超过设定值-超过设置值,Toast提示
- 未超过
- 先判断是否被裁剪
- 没有被裁剪则直接调用代理方法导出
- 被裁剪
- 1.获取开始时间和结束时间
- 2.创建AVMutableComposition实例(判断是否有声音,有的话加入声音采集 AVMutableCompositionTrack:音频通道)
- 3.视频通道 工程文件中的轨道,有音频轨、视频轨等,里面可以插入各种对应的素材
- 3.1 AVMutableVideoCompositionInstruction 视频轨道中的一个视频,可以缩放、旋转等
- 3.2 AVMutableVideoCompositionLayerInstruction 一个视频轨道,包含了这个轨道上的所有视频素材
- 4.调整视频方向根据videoAssetTrack.preferredTransform UIImageOrientation
- 5.AVMutableVideoComposition:管理所有视频轨道,可以决定最终视频的尺寸,裁剪需要在这里进行
- 6.视频文件输出通过AVAssetExportSession
AVMutableVideoComposition * mainCompositionInst = [AVMutableVideoComposition videoComposition];
CGSize naturalSize;
naturalSize = originVideoSize;
int64_t renderWidth = 0, renderHeight = 0;
if (videoSize.height == 0.0 || videoSize.width == 0.0) {
renderWidth = naturalSize.width;
renderHeight = naturalSize.height;
} else {
renderWidth = floor(videoSize.width / 16) * 16;
renderHeight = floor(videoSize.height / 16) * 16;
}
mainCompositionInst.renderSize = CGSizeMake(renderWidth, renderHeight);
mainCompositionInst.instructions = [NSArray arrayWithObject: mainInstruction];
mainCompositionInst.frameDuration = CMTimeMake(1, 30);
图片裁剪
- 1.图片截取方式?
- 拖动选取框采取pan手势动态改变选取框的centerY值
- 生成图片通过DrawRect
// 进行生成图片
- (void)deployTrimImage{
CGRect trimRect = [self convertRect:self.boundView.frame toView:self.showImageView];
self.frontPageImage = [self imageFromView:self.showImageView atFrame: trimRect];
}
//获得某个范围内的屏幕图像
- (UIImage *)imageFromView: (UIView *)theView atFrame:(CGRect)r
{
CGSize sizeR = theView.bounds.size;
// For good UI - 防止右侧白边
sizeR.width += 10;
//获取上下文范围
UIGraphicsBeginImageContext(sizeR);
//呈现
[theView.layer renderInContext:UIGraphicsGetCurrentContext()];
//根据当前上下文生成图片
UIImage *allImage = UIGraphicsGetImageFromCurrentImageContext();
//根据CGRect裁剪图片
UIImage *partImage = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(allImage.CGImage, r)];
//释放
UIGraphicsEndImageContext();
return partImage;
}