zoukankan      html  css  js  c++  java
  • ios 图片转视频

    转自:http://blog.iosxcode4.com/archives/160

    用到的FrameWork有:

    MediaPlayer.framework,QuartzCore.framework,CoreVideoframework,CoreMedia.framework,AVFoundation.framework

    代码如下:

    - (void) testCompressionSession

    {

        NSArray *imageArr = [NSArray arrayWithObjects:[[UIImage imageNamed:@"114.png"] CGImage],[[UIImage imageNamed:@"114.png"] CGImage],[[UIImage imageNamed:@"placeholderImage.png"] CGImage],[[UIImage imageNamed:@"dfd.png"] CGImage],[[UIImage imageNamed:@"viewbg.png"] CGImage], nil];

        

        CGSize size = CGSizeMake(480, 320);

        

        

        NSString *betaCompressionDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];

        

        NSError *error = nil;

        

        unlink([betaCompressionDirectory UTF8String]);

        

        //----initialize compression engine

        AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:betaCompressionDirectory]

                                                               fileType:AVFileTypeQuickTimeMovie

                                                                  error:&error];

        NSParameterAssert(videoWriter);

        if(error)

            NSLog(@"error = %@", [error localizedDescription]);

        

        NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecH264, AVVideoCodecKey,

                                       [NSNumber numberWithInt:size.width], AVVideoWidthKey,

                                       [NSNumber numberWithInt:size.height], AVVideoHeightKey, nil];

        AVAssetWriterInput *writerInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];

        

        NSDictionary *sourcePixelBufferAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:

                                                               [NSNumber numberWithInt:kCVPixelFormatType_32ARGB], kCVPixelBufferPixelFormatTypeKey, nil];

        

        AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput

                                                                                                                         sourcePixelBufferAttributes:sourcePixelBufferAttributesDictionary];

        NSParameterAssert(writerInput);

        NSParameterAssert([videoWriter canAddInput:writerInput]);

        

        if ([videoWriter canAddInput:writerInput])

            NSLog(@"I can add this input");

        else

            NSLog(@"i can't add this input");

        

        [videoWriter addInput:writerInput];

        

        [videoWriter startWriting];

        [videoWriter startSessionAtSourceTime:kCMTimeZero];

        

        //---

        // insert demo debugging code to write the same image repeated as a movie

        

        CGImageRef theImage = [[UIImage imageNamed:@"114.png"] CGImage];

        

        dispatch_queue_t    dispatchQueue = dispatch_queue_create("mediaInputQueue", NULL);

        int __block         frame = 0;

        

        [writerInput requestMediaDataWhenReadyOnQueue:dispatchQueue usingBlock:^{

            while ([writerInput isReadyForMoreMediaData])

            {

                if(++frame >= imageArr.count * 40)

                {

                    [writerInput markAsFinished];

                    [videoWriter finishWriting];

                    

                    break;

                }

                int idx = frame/40;

                

                CVPixelBufferRef buffer = (CVPixelBufferRef)[self pixelBufferFromCGImage:(__bridge CGImageRef)([imageArr objectAtIndex:idx]) size:size];

                if (buffer)

                {

                    if(![adaptor appendPixelBuffer:buffer withPresentationTime:CMTimeMake(frame, 20)])

                        NSLog(@"FAIL");

                    else

                        NSLog(@"Success:%d", frame);

                    CFRelease(buffer);

                }

            }

        }];

        

        NSLog(@"outside for loop");

        

    }

     

     

    - (CVPixelBufferRef )pixelBufferFromCGImage:(CGImageRef)image size:(CGSize)size

    {

        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

                                 [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,

                                 [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil];

        CVPixelBufferRef pxbuffer = NULL;

        CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width, size.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, &pxbuffer);

        // CVReturn status = CVPixelBufferPoolCreatePixelBuffer(NULL, adaptor.pixelBufferPool, &pxbuffer);

        

        NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);

        

        CVPixelBufferLockBaseAddress(pxbuffer, 0);

        void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);

        NSParameterAssert(pxdata != NULL);

        

        CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();

        CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8, 4*size.width, rgbColorSpace, kCGImageAlphaPremultipliedFirst);

        NSParameterAssert(context);

        

        CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image);

        

        CGColorSpaceRelease(rgbColorSpace);

        CGContextRelease(context);

        

        CVPixelBufferUnlockBaseAddress(pxbuffer, 0);

        

        return pxbuffer;

    }

     

  • 相关阅读:
    数据库索引类型及实现方式
    MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射
    解决克隆 centos虚拟机后修改克隆后的机器的ip、mac、uuid失败的问题
    多层表达式
    条件过滤
    复杂表达式
    生成列表
    迭代dict的key和value
    迭代dict的value
    索引迭代
  • 原文地址:https://www.cnblogs.com/sgdkg/p/3715643.html
Copyright © 2011-2022 走看看