1. 程式人生 > >IOS 視頻分解圖片、圖片合成視頻

IOS 視頻分解圖片、圖片合成視頻

ide codec 相對 city for trac ati 註意 dap

在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:(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 視頻分解圖片、圖片合成視頻