2012-05-18 16 views
12

Avevo fatto R & D e ho avuto successo in come ottenere fotogrammi in termini di immagini da file video riprodotti in MPMoviePlayerController.Come creare video dalle sue cornici iPhone

Ottenuto tutti i frame da questo codice e salvato tutte le immagini in una matrice.

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

Ora la domanda è che, dopo il cambiamento alcuni file immagine, come l'aggiunta di emozioni alle immagini e anche l'aggiunta di filtri, come ad esempio; film reali, in bianco e nero, Come possiamo creare nuovamente video e archiviare lo stesso video nella directory Documenti con lo stesso frame rate e senza perdere la qualità del video.

Dopo aver modificato alcune immagini, avevo fatto il seguente codice per salvare di nuovo quel video.

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

Sono nuovo in questo argomento quindi, per favore aiutami a risolvere questa domanda.

+0

È possibile utilizzare http://stackoverflow.com/ domande/7873423/iphone-sdk-create-a-video-from-uiimage – Jasmit

+0

Hai trovato una soluzione per questo? Puoi per favore postare soluzione se possibile? –

+0

perché vuoi riconvertire come video? usa solo le immagini ... –

risposta

7
+0

Ciao c'è qualcosa di aggiornato per Swift? Tutti questi collegamenti sembrano vecchi. Stiamo cercando di unire immagini e video in un unico video principale in cui le immagini devono apparire come "video" separati nel video principale. Ad esempio, supponiamo 1 immagine e 1 un video. Nel video principale, l'immagine appare per 3 secondi e quindi il video viene riprodotto. Qualche consiglio su come farlo? Grazie! – Crashalot

1

È necessario ottenere immagini per ogni fotogramma che renderizza lo schermo. Ho usato l'API privata UIGetScreenImage() per fare lo stesso. e scrivi quelle immagini come film usando AVAssetWriter.

ho scritto un wrapper per fare il necessario con solo poche righe di codice, provare questa componente open source di riferimento:

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

+0

API privata? No semplicemente no. – Raptor

+0

Non caricherete sicuramente il vostro progetto in AppStore con questa libreria. È solo per registrare video da schermate. Basta usare e lanciare. Quindi perché l'API privata non dovrebbe essere utilizzata? –