uso tutoriales tutorial tablas filtros filtro filtrar ejemplos cursos como avanzados avanzado agrupar ios objective-c core-image gpuimage
http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/2.4.6/opencv2.framework.zip/download

ios - tutoriales - Aplicando filtros en un archivo de video.



tutoriales de filtros avanzados (3)

Aunque la solución 2 suena como una solución "OK" si fuera mi aplicación, preferiría usar los filtros de video GPUImage.

Solución :

  1. Obtén el video original y arranca la pista de audio. (preferiblemente en un hilo de fondo) con algo como https://github.com/unixpickle/MP4Audio
  2. Deje que el usuario elija sus filtros de video con GPUImage, procese el video y guárdelo.
  3. Una vez que el video esté listo, combine el nuevo video filtrado editado con la pista de audio que guardó antes de la intervención de GPUImage. (Muchas formas de hacer la fusión, aquí hay una de ellas: fusionar audio con video Objective-C )

Shana Tova

Quiero aplicar filtros (efectos) en un archivo de video mientras se reproduce el video.

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

Así que tengo dos opciones:

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

2) Utilice el marco CoreImage lugar de GPUImage .

Así que quiero echar un vistazo a la segunda opción de usar el CoreImage nativo de iOS y CIFilter para hacer el trabajo.

El problema es que no pude encontrar ningún ejemplo de cómo hacer esto con CIFilter , ¿cómo aplico los filtros en un video desde un archivo ?

¿Debo usar un AVAssetReader para leer el video y procesar cada fotograma? Si es así, vuelvo a mi primer problema de sincronización de audio y video.
¿O hay una manera de aplicar la cadena de filtros directamente en el video o en la capa de vista previa?

Aprecio cualquier ayuda :)



Use el marco GPUImage solo que está usando ... ese es el mejor marco hasta ahora para los filtros de video. Vaya a la documentación del marco https://github.com/BradLarson/GPUImage desplácese hacia abajo en la página donde encontrará los detalles de los filtros disponibles ...

estos filtros se aplican en el video y para escribir el video, debe usar la clase GPUImageMovieWriter ... Se encarga automáticamente del audio.

no tiene que mantenerlo ... Use la propiedad shouldPassThroughAudio de GPUImageMovieWriter y administrará el audio por sí solo.

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

Aquí está el código donde estoy usando el marco GPUImage para recortar el video y el audio se almacena, 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.preferredTransform; 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; } }];