2012-05-18 11 views
12

He hecho R & D y he tenido éxito en cómo obtener marcos en términos de imágenes del archivo de video reproducido en MPMoviePlayerController.Cómo crear un video desde sus marcos iPhone

Obtuve todos los marcos de este código y guardo todas las imágenes en una matriz.

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

Ahora la cuestión es que, después de cambiar algunas archivo de imagen, como la adición de emociones a las imágenes y también la adición de filtros, tales como; película real, blanco y negro, ¿Cómo podemos crear video nuevamente y almacenar el mismo video en el directorio del documento con la misma velocidad de cuadro y sin perder calidad de video?

Después de cambiar algunas imágenes, hice el siguiente código para guardar ese video nuevamente.

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

Soy nuevo en este tema, por favor ayúdenme a resolver esta pregunta.

+0

Usted puede utilizar http://stackoverflow.com/ preguntas/7873423/iphone-sdk-create-a-video-from-uiimage – Jasmit

+0

¿Obtuviste una solución para esto? ¿Puedes publicar una solución si es posible? –

+0

¿por qué quieres convertir de nuevo el video? use images only ... –

Respuesta

7
+0

Hola, ¿hay algo actualizado para Swift? Todos estos enlaces parecen viejos. Estamos intentando fusionar imágenes y videos en un solo video principal donde las imágenes deben aparecer como "videos" separados en el video maestro. Por ejemplo, suponga 1 imagen y 1 video. En el video maestro, la imagen aparece durante 3 segundos y luego se reproduce el video. Algún consejo sobre hacer esto? ¡Gracias! – Crashalot

1

Necesita obtener imágenes para cada cuadro que muestra la pantalla. Usé UIGetScreenImage() API privada para hacer lo mismo. y escribe esas imágenes como Película usando AVAssetWriter.

me escribió un envoltorio para hacer lo necesario con sólo unas pocas líneas de código, pruebe con este componente de código abierto para la referencia:

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

+0

API privada? No simplemente no. – Raptor

+0

Seguramente no cargará su proyecto en AppStore con esta biblioteca. Solo es para grabar videos de screenschots. Solo usa y tira. Entonces, ¿por qué la API privada no debe ser utilizada? –

Cuestiones relacionadas