IOS 视频分解图片、图片合成视频

在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];

            });

        }

    }];

分解之后的帧效果例如以下:                               图片合成视频效果例如以下:

    <img src="http://img.blog.csdn.net/20150727095747931?

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center” width=”311″ height=”574″ alt=””>

    (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];

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注