GPUImage: применить фильтр к существующему видеофайлу.

Я пытался использовать видеофильтры GPUImage framework. Я следовал руководству по Фильтрация и перекодирование фильма. Это дает мне ошибку Unknown type name GPUImageRotationFilter. Поэтому я попытался применить простой фильтр к своему видеофайлу.

Вот мой код
viewController.h

@interface ViewController : UIViewController<GPUImageMovieWriterDelegate,GPUImageInput>
{
GPUImageMovie *_movieFile;
GPUImageOutput<GPUImageInput> *_sketchFilter;
GPUImageMovieWriter *_movieWriter;

}
 @property (nonatomic,retain)    GPUImageMovie *movieFile; 
 @property (nonatomic,retain)    GPUImageOutput<GPUImageInput> *sketchFilter; 
 @property (nonatomic,retain)    GPUImageMovieWriter *movieWriter;
@end

viewController.m

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample_iPod" withExtension:@"m4v"];

self.movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
self.sketchFilter = [[GPUImageSketchFilter alloc] init];
[self.movieFile addTarget:self.sketchFilter];


NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

self.movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
[self.sketchFilter addTarget:self.movieWriter];

[self.movieWriter startRecording];
[self.movieFile startProcessing];

[self.movieWriter setCompletionBlock:^{

    [self.sketchFilter removeTarget:self.movieWriter];
    [self.movieWriter finishRecording];

}];

Это также дает мне BAD_ACCESS.

Трассировка стека

введите здесь описание изображения

  1. Что я делаю неправильно?
  2. Кто-нибудь может объяснить мне, как применить фильтр GPUImage к существующему видеофайлу?

person Anil Varghese    schedule 02.05.2013    source источник
comment
Ваш код выглядит нормально. Где вы получаете EXC_BAD_ACCESS? Как вы определили movieFile, sketchFilter и movieWriter? GPUImageRotationFilter — это старый фильтр, который больше недоступен, вместо него следует использовать GPUImageTransformFilter.   -  person Tomas Camin    schedule 02.05.2013
comment
@TomasCamin Я не могу понять, откуда у меня плохой доступ. Смотрите мой обновленный вопрос   -  person Anil Varghese    schedule 02.05.2013
comment
Ваш проект использует ARC? На какую версию iOS вы ориентируетесь?   -  person Tomas Camin    schedule 02.05.2013
comment
Я не использую ARC. Цель развертывания ios6.0   -  person Anil Varghese    schedule 02.05.2013
comment
Во-первых, тот мой пост, на который вы ссылаетесь выше, был просто оригинальным файлом Readme.md для проекта GPUImage, который на данный момент сильно устарел. Следуйте инструкциям Readme на GitHub, чтобы узнать последний способ настройки. Во-вторых, возьмите за основу пример SimpleVideoFileFilter. Ваш приведенный выше код должен работать нормально, и он работает в этом примере приложения на моем тестовом устройстве с последней версией фреймворка.   -  person Brad Larson    schedule 03.05.2013


Ответы (1)


Прежде всего, обновите свой GPUImageFramework до последней версии. Вы можете получить новый из здесь.

Дважды проверьте размер файла moviewWriter. Должно быть CGSizeMake(640.0, 480.0) вместо CGSizeMake(480.0, 640.0).

Или вы можете создать видеоресурс, а затем указать его размер в параметре размера.

AVURLAsset *asset = [AVURLAsset URLAssetWithURLNSURL fileURLWithPath:pathToMovie] options:nil];
AVAssetTrack *videoAssetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(videoAssetTrack.naturalSize.width, videoAssetTrack.naturalSize.height)];

Это работает для меня.

person Mayur Shrivas    schedule 12.06.2014