2016-07-07 43 views
9

Ho una matrice di immagini da cui voglio creare un video riproducendo queste immagini una dopo l'altra in sequenza. Voglio aggiungere diversi tipi di animazione quando l'immagine cambia. Suggeriscimi qualche metodo o soluzione per ottenere questa funzionalità in Objective-C con il framework Cocoa.Come aggiungere animazione al cambio di immagine mentre creo il video usando le immagini

Qui è codice di lavoro per rendere il video di immagini, ma si prega di suggerire che il modo animiamo immagini rendendo il video:

-(void)createVideoFromImages:(NSString *) path withSize:(CGSize) size 
{ 
    NSError *error = nil; 

    AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL: 
            [NSURL fileURLWithPath:path] fileType:AVFileTypeMPEG4 
                   error:&error]; 
    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]; 

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

    NSParameterAssert(videoWriterInput); 

    NSParameterAssert([videoWriter canAddInput:videoWriterInput]); 
    videoWriterInput.expectsMediaDataInRealTime = YES; 
    [videoWriter addInput:videoWriterInput]; 
    //Start a session: 
    [videoWriter startWriting]; 
    [videoWriter startSessionAtSourceTime:kCMTimeZero]; 

    //Video encoding 
    CVPixelBufferRef buffer = NULL; 

    //convert uiimage to CGImage. 
    int frameCount = 0; 

    for(int i = 0; i<[arrPicture count]; i++) 
    { 
     buffer = [self bufferImageFromCGImage:[[arrPicture objectAtIndex:i] CGImage] size:size]; 

     __block 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)1); 
       append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime]; 

       // CVPixelBufferPoolRef bufferPool = adaptor.pixelBufferPool; 
       // NSParameterAssert(bufferPool != NULL); 
       [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++; 
     CVBufferRelease(buffer); 
    } 

    [videoWriterInput markAsFinished]; 
    [videoWriter finishWritingWithCompletionHandler:^{ 
     NSLog(@"Finished writing...checking completion status..."); 
     if (videoWriter.status != AVAssetWriterStatusFailed && videoWriter.status == AVAssetWriterStatusCompleted) 
     { 
      NSLog(@"Video writing succeeded."); 

      // Move video to camera roll 
      // NOTE: You cannot write directly to the camera roll. 
      // You must first write to an iOS directory then move it! 
      NSURL *videoTempURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@", path]]; 
     } else 
     { 
      NSLog(@"Video writing failed: %@", videoWriter.error); 
     } 
    }]; 
} 


-(CVPixelBufferRef) bufferImageFromCGImage:(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); 
    status=status;//Added to make the stupid compiler not show a stupid warning. 
    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); 

    //CGContextTranslateCTM(context, 0, CGImageGetHeight(image)); 
    //CGContextScaleCTM(context, 1.0, -1.0);//Flip vertically to account for different origin 
    long width,height; 
    if (CGImageGetWidth(image) > self.view.frame.size.width) { 
     width = self.view.frame.size.width; 
    }else{ 
     width = self.view.frame.size.width; // CGImageGetWidth(image); 
    } 

    if (CGImageGetHeight(image) > self.view.frame.size.height) { 
     height = self.view.frame.size.height; 
    }else{ 
     height = self.view.frame.size.height -64 ;// CGImageGetHeight(image); 
    } 
    CGContextDrawImage(context, CGRectMake(0, 0, width, 
              height), image); 
    CGColorSpaceRelease(rgbColorSpace); 
    CGContextRelease(context); 

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

    return pxbuffer; 
} 
+0

hai risolto questo? stessi problemi che ho affrontato .. –

+0

@ Hitesh- No, ancora non ho alcuna soluzione per questo. Fammi sapere se otterrai una soluzione. –

+0

Penso che sia possibile usare FFMPEG .. ma non ne ho più idea. http://stackoverflow.com/questions/17380033/how-to-include-ffmpeg-library-in-iphone-project –

risposta

0

Utilizzando il codice non è possibile animare immagine durante l'elaborazione di video

ma c'è un idea di fare video di immagini animate

è possibile registrare lo schermo durante la riproduzione di animazione uso di questo codice per registrare a schermo
https://github.com/alskipp/ASScreenRecorder