首页 > 代码库 > IOS 视频分解图片、图片合成视频
IOS 视频分解图片、图片合成视频
在IOS视频处理中,视频分解图片和图片合成视频是IOS视频处理中常常遇到的问题。这篇博客就这两个部分对IOS视频图像的相互转换做一下分析。
(1)视频分解图片
这里视频分解图片使用的是AVAssetImageGenerator。利用这个class能够非常方便的实现不同一时候间戳下,视频帧的抓取。注意一般这样的视频分解图片帧的方法都是放在子线程中的,而UI更新操作都是放在主线程中的。
以下来看看核心代码:
_imageGenerator = [[AVAssetImageGeneratoralloc] initWithAsset:_asset];
images = [[NSMutableArrayalloc]initWithCapacity:10];
_imageGenerator.maximumSize =THUMBNAIL_SIZE;
CMTime duration = _asset.duration;
CMTimeValue intervalSeconds = duration.value /3;
CMTime time = kCMTimeZero;
NSMutableArray *times = [NSMutableArrayarray];
for (NSUInteger i =0; i < 3; i++) {
[timesaddObject:[NSValuevalueWithCMTime:time]];
time =CMTimeAdd(time, CMTimeMake(intervalSeconds, duration.timescale));
}
[_imageGeneratorgenerateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef cgImage,
CMTime actualTime,
AVAssetImageGeneratorResult result,
NSError *error) {
if (cgImage) {
UIImage *image = [UIImageimageWithCGImage:cgImage];
[imagesaddObject:image];
}
if (images.count ==3) {
dispatch_async(dispatch_get_main_queue(), ^{
self.imageview1.image = [imagesobjectAtIndex:0];
self.imageview2.image = [imagesobjectAtIndex:1];
self.imageview3.image = [imagesobjectAtIndex:2];
});
}
}];
分解之后的帧效果例如以下: 图片合成视频效果例如以下:
(2)图片合成视频
图片合成视频的方法相对来说更加复杂一点。我们主要用到的class是这个:
AVAssetWriterInputPixelBufferAdaptor。
不同之处在于这里我们还要设置图片合成视频的各种參数,比方帧率,编码方式等等。
2.1 设置文件封装类型
AVFileTypeQuickTimeMovie
2.2 设置图片格式
kCVPixelFormatType_32ARGB
2.3 设置编码方式、图片尺寸
NSDictionary *videoSettings =@{AVVideoCodecKey :AVVideoCodecH264,
AVVideoWidthKey : [NSNumbernumberWithInt:(int)width],
AVVideoHeightKey : [NSNumbernumberWithInt:(int)height]};
2.4 图片合成開始
CMTime lastTime =CMTimeMake(i, self.frameTime.timescale);
CMTime presentTime =CMTimeAdd(lastTime, self.frameTime);
[self.bufferAdapterappendPixelBuffer:sampleBuffer withPresentationTime:presentTime];
IOS 视频分解图片、图片合成视频