Применение фильтров в видеофайле

Я хочу применить фильтры (эффекты) к видеофайлу во время воспроизведения видео.

В настоящее время я использую @BradLarson (отлично) GPUImage framework, поэтому проблема заключается в том, что фреймворк не поддерживает воспроизведение аудио во время воспроизведения видео.

Итак, у меня есть два варианта:

1) Погрузитесь в код GPUImage и измените GPUImageMovie, чтобы он также обрабатывал звуковые буферы. Для этого требуется знание синхронизации аудио и видео кадров, и, к сожалению, у меня ее нет. Я видел некоторые хаки, которые пытаются воспроизвести звук с помощью AVAudioPlayer, но с большим количеством проблем с синхронизацией.

2) Используйте CoreImage рамки вместо GPUImage.

Итак, я хочу взглянуть на второй вариант использования родной iOS CoreImage и CIFilter для выполнения задания.

Проблема в том, что я не смог найти какой-либо пример того, как это сделать с помощью CIFilter, как применить фильтры к видео из файла?

Должен ли я использовать AVAssetReader для чтения видео и обработки каждого кадра? если это так, я вернусь к своей первой проблеме синхронизации аудио и видео.
Или есть способ применить цепочку фильтров непосредственно на видео или на уровне предварительного просмотра?

Оцените любую помощь:)

Ответы

Ответ 1

Используйте инфраструктуру GPUImage только для использования... это лучшая структура до сих пор для видеофильтров. GO через документацию фреймворка https://github.com/BradLarson/GPUImage прокрутите страницу вниз, вы найдете информацию о доступных фильтрах...

эти фильтры применяются на видео и для записи видео вы должны использовать класс GPUImageMovieWriter... Он автоматически обрабатывает аудио.

вам не нужно его поддерживать... Используйте свойство shouldPassThroughAudio для GPUImageMovieWriter, и он сам будет управлять звуком.

Используйте этот учебник для справки http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework

Вот код, в котором я использую инфраструктуру GPUImage для обрезки видео и звука, которые не удаляются после редактирования.

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

Ответ 2

Вы можете использовать среду OpenCV для воспроизведения с редактированием видео.

Вот ссылка на скачивание OpenCv

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

и вот учебник для игры с OpenCV

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

Я думаю, это поможет вам..

Ответ 3

Хотя решение 2 звучит как "ОК", если это мое приложение, я бы предпочел использовать фильтры видео GPUImage.

Решение

  • Получите исходное видео и вырвите из него звуковую дорожку. (желательно в фоновом потоке) с чем-то вроде https://github.com/unixpickle/MP4Audio
  • Позвольте пользователю выбрать его видеофильмы с помощью GPUImage, обработать видео и сохранить его.
  • Как только видео будет готово, объедините новое отредактированное отфильтрованное видео со звуковой дорожкой, которую вы сохранили до вмешательства GPUImage. (Многие способы слияния, вот один из них: Слияние аудио с видео Objective-C )

Шана Това