2011-12-26 2 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

Если у вас есть массив изображений и просто для воспроизведения этих изображений в качестве видео, вы можете использовать UIImageView и обновлять изображения в массиве до изображения с помощью цикла for.

Если у вас есть изображения в массиве. Нравится,

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

Хорошо. Но это не мой ответ. Моя ошибка находится в «[videoWriter finishWriting];». В этой строке finishWriting не увенчался успехом. Вот почему я не получил выход. Проверьте мой код и исправьте его. –

+0

Я предложил вам использовать этот подход вместо вышеупомянутого. Его довольно прямолинейно и просто реализовать. – Basheer

+0

Ok Спасибо. Я попробую это. –