在IOS视频处理中,视频分解图片和图片合成视频是IOS视频处理中经常遇到的问题,这篇博客就这两个部分对IOS视频图像的相互转换做一下分析。 (1)视频分解图片 这里视频分解图片使用的是AVAssetImageGenerator,利用这个class可以很方便的实现不同时间戳下,视频帧的抓取。注意一般这种视频分解图片帧的方法都是放在子线程中的,而UI更新操作都是放在主线程中的。下面来看看核心代码:
_imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:_asset]; images = [[NSMutableArray alloc]initWithCapacity:10]; _imageGenerator.maximumSize = THUMBNAIL_SIZE; CMTime duration = _asset.duration; CMTimeValue intervalSeconds = duration.value / 3; CMTime time = kCMTimeZero; NSMutableArray *times = [NSMutableArray array]; for (NSUInteger i = 0; i < 3; i++) { [times addObject:[NSValue valueWithCMTime:time]]; time = CMTimeAdd(time, CMTimeMake(intervalSeconds, duration.timescale)); } [_imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef cgImage, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) { if (cgImage) { UIImage *image = [UIImage imageWithCGImage:cgImage]; [images addObject:image]; } if (images.count == 3) { dispatch_async(dispatch_get_main_queue(), ^{ self.imageview1.image = [images objectAtIndex:0]; self.imageview2.image = [images objectAtIndex:1]; self.imageview3.image = [images objectAtIndex:2]; }); } }]; 分解之后的帧效果如下: 图片合成视频效果如下: (2)图片合成视频 图片合成视频的方法相对来说更加复杂一点,我们主要用到的class是这个: AVAssetWriterInputPixelBufferAdaptor。不同之处在于这里我们还要设置图片合成视频的各种参数,比如帧率,编码方式等等。 2.1 设置文件封装类型
AVFileTypeQuickTimeMovie 2.2 设置图片格式
kCVPixelFormatType_32ARGB 2.3 设置编码方式、图片尺寸
NSDictionary *videoSettings = @{AVVideoCodecKey : AVVideoCodecH264, AVVideoWidthKey : [NSNumber numberWithInt AVVideoHeightKey : [NSNumber numberWithInt 2.4 图片合成开始
CMTime lastTime = CMTimeMake(i, self.frameTime.timescale); CMTime presentTime = CMTimeAdd(lastTime, self.frameTime); [self.bufferAdapter appendPixelBuffer:sampleBuffer withPresentationTime:presentTime];
作者:u014011807 发表于2015/7/27 10:04:04 原文链接
阅读:55 评论:0 查看评论
|
|