IOS 視頻分解圖片、圖片合成視頻
在IOS視頻處理中,視頻分解圖片和圖片合成視頻是IOS視頻處理中常常遇到的問題。這篇博客就這兩個部分對IOS視頻圖像的相互轉換做一下分析。
(1)視頻分解圖片
這裏視頻分解圖片使用的是AVAssetImageGenerator。利用這個class能夠非常方便的實現不同一時候間戳下,視頻幀的抓取。註意一般這樣的視頻分解圖片幀的方法都是放在子線程中的,而UI更新操作都是放在主線程中的。
以下來看看核心代碼:
_imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:_asset];
_imageGenerator.maximumSize = THUMBNAIL_SIZE;
CMTime duration = _asset.duration;
CMTimeValue intervalSeconds = duration.value / 3;
CMTime time = kCMTimeZero;
NSMutableArray *times = [NSMutableArray array];
for
[times addObject:[NSValue valueWithCMTime:time]];
time = CMTimeAdd(time, CMTimeMake(intervalSeconds, duration.timescale));
}
[_imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime,
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:(int)width],
AVVideoHeightKey : [NSNumber numberWithInt:(int)height]};
2.4 圖片合成開始
CMTime lastTime = CMTimeMake(i, self.frameTime.timescale);
CMTime presentTime = CMTimeAdd(lastTime, self.frameTime);
[self.bufferAdapter appendPixelBuffer:sampleBuffer withPresentationTime:presentTime];
IOS 視頻分解圖片、圖片合成視頻