iOS开发-相册视频编辑裁剪

本文介绍了在iOS开发中自定义视频编辑的两种方式,详细讲解了使用AVFoundation框架实现视频编辑的步骤,包括循环播放、获取视频帧、添加编辑视图、监听编辑操作以及视频截取等关键点。同时分享了Swift版实现中遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

iOS相册视频编辑有两种方式,一种是使用系统自带的控制器UIVideoEditorController但是该类只提供了基础的视频编辑功能,接口十分有限,界面样式没法修改,效果如下图。

UIVideoEditorController打开效果.jpeg
UIVideoEditorControllerUIImagePickerController的视频显示界面十分相似,区别就是前者可以编辑,后者不能。

UIImagePickerController开的视频效果.jpeg
第二种方式就是利用强大的AVFoudation框架自己动手实现。

微信朋友圈视频编辑.jpeg
实现逻辑主要分5步:
* 1.AVPlayer循环播放视频
如果是整段视频循环播放,有两种实现方式,一种是KVO监听AVPlayertimeControlStatus属性,

typedef NS_ENUM(NSInteger, AVPlayerTimeControlStatus) {
    AVPlayerTimeControlStatusPaused,
    AVPlayerTimeControlStatusWaitingToPlayAtSpecifiedRate,
    AVPlayerTimeControlStatusPlaying
} NS_ENUM_AVAILABLE(10_12, 10_0);

当状态为AVPlayerTimeControlStatusPaused的时候让player回到起点并继续播放。

  [self.player seekToTime:CMTimeMake(0, 1)];
  [self.player play];

第二种循环播放方式是,利用计时器设置要播放时长,并循环执行计时器方法。

- (void)repeatPlay{
    [self.player play];
    CMTime start = CMTimeMakeWithSeconds(self.startTime, self.player.currentTime.timescale);
    [self.player seekToTime:start toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
}

编辑视频时的视频段循环播放,显然只能通过第二种方式实现。

  • 2.以1秒为单位,获取视频帧图像
    编辑区域需要显示视频帧图像,通过AVAssetImageGenerator这个类来获取,在该类的获取视频帧图像接口调用时需要传入要获取视频帧图像的时间节点。
- (void)generateCGImagesAsynchronouslyForTimes:(NSArray<NSValue *> *)requestedTimes completionHandler:(AVAssetImageGeneratorCompletionHandler)handler;

在视频编辑功能中,一般的时间节点都是以1秒为单位获取视频帧图像。在该接口回调中由于是异步执行,所以需要在回调中直接显示图片,详细代码实现如下。

#pragma mark 读取解析视频帧
- (void)analysisVideoFrames{
    //初始化asset对象
    AVURLAsset *videoAsset = [[AVURLAsset alloc]initWithURL:self.videoUrl options:nil];

    //获取总视频的长度 = 总帧数 / 每秒的帧数
    long videoSumTime = videoAsset.duration.value / videoAsset.duration.timescale;

    //创建AVAssetImageGenerator对象
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc]initWithAsset:videoAsset];
    generator.maximumSize = bottomView.frame.size;
    generator.appliesPreferredTrackTransform = YES;
    generator.requestedTimeToleranceBefore = kCMTimeZero;
    generator.requestedTimeToleranceAfter = kCMTimeZero;

    // 添加需要帧数的时间集合
    self.framesArray = [NSMutableArray array];
    for (int i = 0; i < videoSumTime; i++) {
        CMTime time = CMTimeMake(i *videoAsset.duration.timescale , videoAsset.duration.timescale);
        NSValue *value = [NSValue valueWithCMTime:time];
        [self.framesArray addObject:value];
    }

    NSMutableArray *imgArray = [NSMutableArray array];

    __block long count = 0;
    [generator ge
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值