I am working with Video filtering.I used GPUImage from
BradLarson. It perfect work on Images, but now I am trying to filter video file from Library it give me error [AVAssetWriter startWriting] Cannot call method when status is 3.
I used IOS7
heare is my code
- (void)viewDidLoad
{
[super viewDidLoad];
videoEditingPlayView = [[GPUImageView alloc] initWithFrame:CGRectMake(60,108,200,200)];
[self.view addSubview:videoEditingPlayView];
}
-(IBAction)btnEffectsClick:(id)sender{
NSURL *videoURl = [NSURL fileURLWithPath:self.strVideoURl];
if (movieFile != nil) {
videoFilter = nil;
movieFile = nil;
}
movieFile = [[GPUImageMovie alloc] initWithURL:videoURl];
movieFile.runBenchmark = YES;
videoFilter = [[GPUImageBrightnessFilter alloc] init];
[(GPUImageBrightnessFilter *)videoFilter setBrightness:0.0];
[movieFile addTarget:videoFilter];
videoEditingPlayView.hidden = NO;
GPUImageView *filterView = (GPUImageView *)videoEditingPlayView;
[videoFilter addTarget:filterView];
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480, 360)];
[videoFilter addTarget:movieWriter];
// movieWriter.
movieWriter.shouldPassthroughAudio = YES;
movieFile.audioEncodingTarget = movieWriter;
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
[filterView setFillMode:kGPUImageFillModePreserveAspectRatio];
filterView.transform = CGAffineTransformRotate(filterView.transform, 3.14159/2);
double delayToStartRecording = 0.5;
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, delayToStartRecording * NSEC_PER_SEC);
dispatch_after(startTime, dispatch_get_main_queue(), ^(void){
NSLog(@"Start recording");
[movieWriter startRecording];
**[movieFile startProcessing];** ***if I remove this line then it is working but not dispying video on videoEditingPlayView***
double delayInSeconds = 30.0;
dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){
[filter removeTarget:movieWriter];
[movieWriter finishRecording];
[videoFilter removeTarget:movieWriter];
movieWriter = nil;
NSLog(@"Movie completed");
});
});
}
in coding if I remove this line
[movieFile startProcessing];
then app run smoothly, but not displaying video. if I put [movieFile startProcessing] then it crash and give me a error.
I tried this one but can't solved crash.
GPUImage terminates due to [AVAssetWriter startWriting] Cannot call method when status is 3'
https://github.com/BradLarson/GPUImage/issues/1228
Blends with GPUImageView are not giving expected result
GPUImageMovieWriter - crashing with "Cannot call method when status is 2"
And also other.
Thanks.
Check your destination file is exist.
If exist, remove the exist file.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With