2011-12-26 67 views
1
#import "ViewController.h" 
    #import "AVFoundation/AVAssetWriter.h" 
    #import "AVFoundation/AVAssetWriterInput.h" 
    #import "AVFoundation/AVMediaFormat.h" 
    #import "AVFoundation/AVVideoSettings.h" 


    @implementation ViewController 

    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentDirectory = [documentDirectories objectAtIndex: 0]; 

     // NSLog(@"Where it is %@ \n",documentDirectory); 
     image1.image = [UIImage imageNamed:@"images1.jpg"]; 
     CGSize sizeOfImage = image1.image.size; 
     // printf("Size of Image width = %f height = %f\n", sizeOfImage.width,sizeOfImage.height); 
     [self writeImageAsMovie:(UIImage*)image1.image toPath:(NSString*)documentDirectory size:(CGSize)sizeOfImage duration:6]; 

    } 


    - (void)writeImageAsMovie:(UIImage*)image toPath:(NSString*)path size:(CGSize)size duration:(int)duration 
    { 
     NSError *error = nil; 

     AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL: 
             [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie 
                    error:&error]; 
     NSParameterAssert(videoWriter); 


     NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
             AVVideoCodecH264, AVVideoCodecKey, 
             [NSNumber numberWithInt:size.width], AVVideoWidthKey, 
             [NSNumber numberWithInt:size.height], AVVideoHeightKey, 
             nil]; 


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




     AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor 
                 assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput 
                 sourcePixelBufferAttributes:nil]; 


     NSParameterAssert(writerInput); 
     NSParameterAssert([videoWriter canAddInput:writerInput]); 
     [videoWriter addInput:writerInput]; 

     //Start a session: 
     [videoWriter startWriting]; 

     [videoWriter startSessionAtSourceTime:kCMTimeZero]; 

     //Write samples: 
     //CVPixelBufferRef Utils; 
     CVPixelBufferRef buffer = [self newPixelBufferFromCGImage:image.CGImage size:size]; 
     [adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero]; 



     [adaptor appendPixelBuffer:buffer withPresentationTime:CMTimeMake(duration-1, 2)]; 


     //Finish the session: 
     [writerInput markAsFinished]; 
     [videoWriter endSessionAtSourceTime:CMTimeMake(duration, 2)]; 



     [videoWriter finishWriting]; 


    } 

-(CVPixelBufferRef) newPixelBufferFromCGImage:(CGImageRef)image size:(CGSize)frameSize 
{ 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, 
          [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, 
          nil]; 


    CVPixelBufferRef pxbuffer = NULL; 


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

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

    status = CVPixelBufferLockBaseAddress(pxbuffer, 0); 
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); 
    NSParameterAssert(pxdata != NULL); 

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width, 
               frameSize.height, 8, 4*frameSize.width, rgbColorSpace, 
               kCGImageAlphaNoneSkipFirst); 
    NSParameterAssert(context); 
    CGAffineTransform frameTransform; 
    CGContextConcatCTM(context, frameTransform); 
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
              CGImageGetHeight(image)), image); 
    CGColorSpaceRelease(rgbColorSpace); 
    CGContextRelease(context); 

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 


    return pxbuffer; 
} 


@end 

我是iOS新手,我看到一個代碼,它顯示來自堆棧溢出中圖像的視頻。我運行的代碼,並沒有表現出任何錯誤,但我沒有得到所需的輸出。我認爲錯誤是這個函數如何顯示來自圖像的視頻

-(void)writeImageAsMovie:(UIImage*)image toPath:(NSString*)path size:(CGSize)size duration:(int)duration) that is [videoWriter finishWriting]

請幫我的最後一道防線。

回答

0

如果你有圖片的數組,只是作爲一個視頻播放這些圖像時,可以在陣列的圖像視圖中使用for循環使用的UIImageView和更新的圖像。

如果陣列中的圖像。 贊,

for (int i = 0; i < [array count]; i++) 
{  
    imageview.image = (UIImage *)[array objectAtIndex:i]; 
} 
+0

好吧。但這不是我的答案。我的錯誤是在「[videoWriter finishWriting]」。在這一行中,finishWriting不成功。這就是爲什麼我沒有得到輸出。請檢查我的代碼並更正它。 – 2011-12-26 11:37:37

+0

我建議你改用一個以上的這種做法。它非常簡單易用。 – Basheer 2011-12-26 12:51:53

+0

好的,謝謝您。我會嘗試一個。 – 2011-12-26 13:16:33