2016-07-07 3 views
9

Ich habe eine Reihe von Bildern, aus denen ich ein Video erstellen möchte, indem Sie diese Bilder nacheinander in einer Sequenz. Ich möchte eine andere Art von Animation hinzufügen wenn das Bild sich ändert. Schlagen Sie mir eine Methode oder eine Lösung vor, um diese Funktionalität in Objective-C mit dem Cocoa-Framework zu erreichen.Hinzufügen von Animation bei Bildwechsel während der Erstellung von Video mit Bildern

Hier arbeiten Code für Video von Bildern zu machen, aber bitte lassen vermuten, dass, wie wir Bilder animieren, während Video machen:

-(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

hast du das gelöst? die gleichen Probleme, die ich konfrontiert .. –

+0

@ Hitesh-Nein, immer noch bekomme ich keine Lösung dafür. Lassen Sie es mich wissen, wenn Sie eine Lösung bekommen. –

+0

Ich denke, es ist möglich mit FFMPEG .. aber ich habe keine Ahnung mehr darüber. http://stackoverflow.com/questions/17380033/how-to-include-ffmpeg-library-in-iphone-project –

Antwort

0

Durch Ihren Code es nicht möglich Bild zu animieren, während der Videoverarbeitung

aber es gibt eine Idee Video von animierten Bildern

Sie machen können den Bildschirm aufzeichnen, während Animation spielen Verwendung dieser Code aufzeichnen Bildschirm
https://github.com/alskipp/ASScreenRecorder

Verwandte Themen