Search code examples
iosvideoios7gpuimagevideo-editing

video filter via GPUImageMovie not played clean video


I add gpuimage framework for video editing in my project, but it can't play video clean (as per screen shot) i checked example in gpuimage framework i.e. "SimpleVideoFileFilter", but it also have same issue , audio is clean , and save easily(movie writer code not show here) i checked different video format i.e. "mp4", "mov", "m4v" but have same issue

my code is below,

.h file

  #import <UIKit/UIKit.h>
  #import <GPUImage.h>
  #import <AVFoundation/AVFoundation.h>

 @interface ViewController : UIViewController<GPUImageMovieDelegate>

 @end

and .m file is following

#import "ViewController.h"

@interface ViewController ()
{
GPUImageMovie *movieFile;
GPUImageOutput<GPUImageInput> *filter;
GPUImageMovieWriter *movieWriter;
}
@property (nonatomic,strong) GPUImageView *gpuImageViewObj;
@property (nonatomic,strong) AVPlayer *player;
@property (nonatomic,strong) AVPlayerItem *playerItem;
@end

@implementation ViewController
@synthesize gpuImageViewObj,player,playerItem;

- (void)viewDidLoad
{
    [super viewDidLoad];

    gpuImageViewObj = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 0, 568, 320)];
    [self.view addSubview:gpuImageViewObj];


    [self try128];

 }

 -(void)try128{


   //AVplayer
   NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"Sample"  withExtension:@"m4v"];
playerItem = [[AVPlayerItem alloc]initWithURL:sampleURL];
player  = [[AVPlayer alloc ]initWithPlayerItem:playerItem];
[player play];


//GPUImage movie
movieFile = [[GPUImageMovie alloc] initWithPlayerItem:playerItem];
//    movieFile.runBenchmark = YES;
movieFile.playAtActualSpeed = YES;
movieFile.delegate = self;

//filter
filter = [[GPUImageFilter alloc] init];
[filter forceProcessingAtSize:gpuImageViewObj.sizeInPixels];

[movieFile addTarget:filter];
[filter  addTarget:gpuImageViewObj];


[movieFile startProcessing];


player.actionAtItemEnd = AVPlayerActionAtItemEndNone;

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didCompletePlayingMovie)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                           object:nil];

  }


 #pragma mark - GPUImageMovieDelegate

 -(void)didCompletePlayingMovie
 {
     [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

    [filter removeTarget:movieWriter];
       //    [movieFile endProcessing];  //not needed
     NSLog(@"finish............");

    }


     #pragma mark -GPUImageMovieWriterDelegate


   - (void)movieRecordingCompleted{
      NSLog(@"movieRecordingCompleted called...");

     //    [movieWriter finishRecording];

    }
  - (void)movieRecordingFailedWithError:(NSError*)error{
        NSLog(@"movieRecordingFailedWithError called...");

   }

my o/p images

image shown filtered video


Solution

  • I'm guessing that you're trying to run this in the Simulator, not on an actual device. Movie playback has never worked correctly on the Simulator, and this is one artifact of that.

    Instead, do your development on actual iOS hardware.