2012-05-18 7 views
12

Ich hatte R & D gemacht und hatte Erfolg, wie man Rahmen in Form von Bildern von Videodatei in MPMoviePlayerController wiedergegeben bekommen.Wie man Video von seinen Rahmen herstellt iPhone

Erhalten Sie alle Bilder aus diesem Code, und speichern Sie alle Bilder in einem Array.

for(int i= 1; i <= moviePlayerController.duration; i++) 
{ 
    UIImage *img = [moviePlayerController thumbnailImageAtTime:i timeOption:MPMovieTimeOptionNearestKeyFrame]; 
    [arrImages addObject:img]; 
} 

Die Frage ist nun, dass nach Änderung einig Bilddatei, wie Emotionen zu den Bildern hinzufügen und auch Hinzufügen von Filtern, wie zum Beispiel; Film real, schwarz und weiß, Wie können wir wieder ein Video erstellen und dasselbe Video mit der gleichen Bildrate im Dokumentenverzeichnis speichern, ohne die Qualität des Videos zu verlieren?

Nachdem ich einige Bilder geändert habe, habe ich folgenden Code gemacht, um das Video erneut zu speichern.

- (void) writeImagesAsMovie:(NSString*)path 
{ 
    NSError *error = nil; 
    UIImage *first = [arrImages objectAtIndex:0]; 
    CGSize frameSize = first.size; 
    AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL: 
            [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie 
                   error:&error]; 
    NSParameterAssert(videoWriter); 

    NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
            AVVideoCodecH264, AVVideoCodecKey, 
            [NSNumber numberWithInt:640], AVVideoWidthKey, 
            [NSNumber numberWithInt:480], AVVideoHeightKey, 
            nil]; 
    AVAssetWriterInput* writerInput = [[AVAssetWriterInput 
             assetWriterInputWithMediaType:AVMediaTypeVideo 
             outputSettings:videoSettings] retain]; 

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

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

    [videoWriter startWriting]; 
    [videoWriter startSessionAtSourceTime:kCMTimeZero]; 

    int frameCount = 0; 
    CVPixelBufferRef buffer = NULL; 
    for(UIImage *img in arrImages) 
    { 
     buffer = [self newPixelBufferFromCGImage:[img CGImage] andFrameSize:frameSize]; 

      if (adaptor.assetWriterInput.readyForMoreMediaData) 
      { 
       CMTime frameTime = CMTimeMake(frameCount,(int32_t) kRecordingFPS); 
       [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime]; 

       if(buffer) 
        CVBufferRelease(buffer); 
      } 
     frameCount++; 
    } 

    [writerInput markAsFinished]; 
    [videoWriter finishWriting]; 
} 


- (CVPixelBufferRef) newPixelBufferFromCGImage: (CGImageRef) image andFrameSize:(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, (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, frameSize.width, 
               frameSize.height, 8, 4*frameSize.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; 
} 

Ich bin neu in diesem Thema, also bitte helfen Sie mir, diese Frage zu lösen.

+0

Sie http://stackoverflow.com/ verwenden können Fragen/7873423/iphone-sdk-create-a-video-from-uiimage – Jasmit

+0

Haben Sie eine Lösung dafür? Können Sie bitte eine Lösung posten, wenn möglich? –

+0

Warum möchten Sie wieder als Video konvertieren? benutze nur Bilder ... –

Antwort

7
+0

Hallo, gibt es irgendwas für Swift? All diese Links scheinen alt zu sein. Wir versuchen, Bilder und Videos zu einem Hauptvideo zusammenzuführen, in dem Bilder als separate "Videos" im Hauptvideo erscheinen müssen. Angenommen, 1 Bild und 1 Video. Im Master-Video wird das Bild für 3 Sekunden angezeigt und dann wird das Video abgespielt. Irgendwelche Ratschläge dazu? Vielen Dank! – Crashalot

1

Sie müssen Bilder für jedes Bild, das der Bildschirm rendert, erhalten. Ich benutzte UIGetScreenImage() private API, um das gleiche zu tun. und schreibe diese Bilder als Film mit AVAssetWriter.

Ich schrieb einen Wrapper das Nötige mit nur wenigen Zeilen Code zu tun, versuchen Sie diese Open-Source-Komponente als Referenz:

https://www.cocoacontrols.com/controls/iqprojectvideo

+0

Private API? Nein einfach nein. – Raptor

+0

Sie werden Ihr Projekt mit dieser Bibliothek sicher nicht in den AppStore hochladen. Es ist nur für die Aufnahme von Videos von Bildschirmschonern. Einfach benutzen und werfen. Warum sollte private API nicht verwendet werden? –