Aplicar filters en un file de video

Quiero aplicar filters (efectos) en un file de video mientras se reproduce el video.

Actualmente estoy usando el genial framework GPUImage para hacerlo, el problema aquí es que el framework no es compatible con la reproducción de audio mientras se reproduce el video.

Entonces tengo dos opciones:

1) Sumérjase en el código GPUImage y cambie la GPUImageMovie para que también procese los buffers de audio. Esto requiere el conocimiento de la synchronization de los frameworks de audio y video, y desafortunadamente no lo tengo. Vi algunos hacks que intentan reproducir el audio con AVAudioPlayer pero con muchos problemas de synchronization.

2) Utilice el marco CoreImage lugar de GPUImage .

Entonces, quiero echar un vistazo a la segunda opción de usar iOS CoreImage y CIFilter para hacer el trabajo.

El problema es que no pude encontrar ningún ejemplo de cómo hacerlo con CIFilter , ¿cómo aplico filters en un video de un file ?

¿Debo usar AVAssetReader para leer el video y procesar cada cuadro? Si es así, volveré a mi primer problema de synchronization de audio y video.
¿O hay alguna manera de aplicar la cadena de filters directamente en el video o en la capa de vista previa?

Aprecie cualquier ayuda 🙂

Utilice el marco de trabajo GPUImage solo que esté utilizando … ese es el mejor marco hasta ahora para los filters de video. VISITE la documentation del marco https://github.com/BradLarson/GPUImage, desplácese hacia abajo en la página, encontrará los detalles de los filters disponibles …

estos filters se aplican en el video y para escribir el video tienes que usar la class GPUImageMovieWriter … Maneja automáticamente el audio …

no tiene que mantenerlo … Utilice la propiedad shouldPassThroughAudio de GPUImageMovieWriter y administrará el audio por sí mismo.

Utilice este tutorial para get ayuda http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework

Aquí está el código en el que estoy usando el marco GPUImage para recortar el video y el audio no se elimina después de la edición.

NSURL * videoUrl = [selectedAsset defaultRepresentation] .url;

 GPUImageMovie *movieUrl = [[GPUImageMovie alloc] initWithURL:videoUrl]; self.cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:videoArea]; movieUrl.runBenchmark = YES; movieUrl.playAtActualSpeed = YES; [movieUrl addTarget:self.cropFilter]; //Setting path for temporary storing the video in document directory NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat:@"CroppedVideo-%d.mov",arc4random() % 1000]]; NSURL *movieURL = [NSURL fileURLWithPath:myPathDocs]; AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoUrl options:nil]; AVAssetTrack *videoAssetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; CGAffineTransform videoTransform = videoAssetTrack.prefernetworkingTransform; movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(videoAssetTrack.naturalSize.width, videoAssetTrack.naturalSize.height)]; [_cropFilter addTarget:movieWriter]; movieWriter.shouldPassthroughAudio = YES; movieUrl.audioEncodingTarget = movieWriter; [movieUrl enableSynchronizedEncodingUsingMovieWriter:movieWriter]; [self.movieWriter startRecordingInOrientation:videoTransform]; [self.movieWriter startRecording]; [movieUrl startProcessing]; __block BOOL completeRec = NO; __unsafe_unretained typeof(self) weakSelf = self; [self.movieWriter setCompletionBlock:^{ [weakSelf.cropFilter removeTarget:weakSelf.movieWriter]; [weakSelf.movieWriter finishRecording]; [movieUrl removeTarget:weakSelf.cropFilter]; if (!completeRec) { [weakSelf videoCropDoneUrl:movieURL]; completeRec = YES; } }]; 

Puede usar el marco de OpenCV para jugar con la Edición de video.

Aquí está el enlace para download OpenCv

http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/2.4.6/opencv2.framework.zip/download

y aquí hay un tutorial para jugar con OpenCV

http://docs.opencv.org/doc/tutorials/ios/video_processing/video_processing.html#opencviosvideoprocessing

Creo que esto te ayudaría …

Aunque la solución 2 suena como una solución "OK" si era mi aplicación, preferiría utilizar los filters de video GPUImage.

Solucion :

  1. Obtenga el video original y rompa la pista de audio. (preferiblemente en un hilo de background) con algo así como https://github.com/unixpickle/MP4Audio
  2. Deje que el usuario elija sus filters de video con GPUImage, procese el video y guárdelo.
  3. Una vez que el video esté listo, fusione el nuevo video filtrado editado con la pista de audio que guardó antes de la intervención de GPUImage. (Muchas forms de combinar, aquí hay una de ellas: Fusionar audio con video objective-C )

Shana Tova