iphone ios 視頻特效 將映像插入到視頻中

來源:互聯網
上載者:User

如果對av foundation 不熟悉得話,建議先看看wwdc 2010 關於av foundation得講座。http://blog.csdn.net/linzhiji/article/details/6752722

- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image andSize:(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, (CFDictionaryRef) options,                                           &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,                                                  kCGImageAlphaNoneSkipFirst);    NSParameterAssert(context);    CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),                                            CGImageGetHeight(image)), image);    CGColorSpaceRelease(rgbColorSpace);    CGContextRelease(context);        CVPixelBufferUnlockBaseAddress(pxbuffer, 0);        return pxbuffer;}

- (void) writeImages:(NSArray *)imagesArray ToMovieAtPath:(NSString *) path withSize:(CGSize) size           inDuration:(float)duration byFPS:(int32_t)fps{    //Wire the writer:    NSError *error = nil;    AVAssetWriter *videoWriter = [[[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:path]                                                            fileType:AVFileTypeQuickTimeMovie                                                              error:&error] autorelease];    NSParameterAssert(videoWriter);        NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:                                   AVVideoCodecH264, AVVideoCodecKey,                                   [NSNumber numberWithInt:size.width], AVVideoWidthKey,                                   [NSNumber numberWithInt:size.height], AVVideoHeightKey,                                   nil];        AVAssetWriterInput* videoWriterInput = [[AVAssetWriterInput                                             assetWriterInputWithMediaType:AVMediaTypeVideo                                             outputSettings:videoSettings] retain];            AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor                                                     assetWriterInputPixelBufferAdaptorWithAssetWriterInput:videoWriterInput                                                     sourcePixelBufferAttributes:nil];    NSParameterAssert(videoWriterInput);    NSParameterAssert([videoWriter canAddInput:videoWriterInput]);    [videoWriter addInput:videoWriterInput];        //Start a session:    [videoWriter startWriting];    [videoWriter startSessionAtSourceTime:kCMTimeZero];        //Write some samples:    CVPixelBufferRef buffer = NULL;        int frameCount = 0;        int imagesCount = [imagesArray count];        float averageTime = duration/imagesCount;    int averageFrame = (int)(averageTime * fps);        for(UIImage * img in imagesArray)    {        buffer = [self pixelBufferFromCGImage:[img CGImage] andSize:size];                BOOL append_ok = NO;        int j = 0;        while (!append_ok && j < 30)         {            if (adaptor.assetWriterInput.readyForMoreMediaData)             {                printf("appending %d attemp %d\n", frameCount, j);                                CMTime frameTime = CMTimeMake(frameCount,(int32_t) fps);                float frameSeconds = CMTimeGetSeconds(frameTime);                NSLog(@"frameCount:%d,kRecordingFPS:%d,frameSeconds:%f",frameCount,fps,frameSeconds);                append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];                                if(buffer)                    [NSThread sleepForTimeInterval:0.05];            }             else             {                printf("adaptor not ready %d, %d\n", frameCount, j);                [NSThread sleepForTimeInterval:0.1];            }            j++;        }        if (!append_ok) {            printf("error appending image %d times %d\n", frameCount, j);        }                frameCount = frameCount + averageFrame;    }        //Finish the session:    [videoWriterInput markAsFinished];    [videoWriter finishWriting];    NSLog(@"finishWriting");}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.