示例:使用 GPUImageMovie 爲視頻添加濾鏡,並保存文件(簡單使用)
//
// ViewController.m
// GPUImageTest2
//
// Created by 黃健 on 16/7/2.
// Copyright © 2016年 黃健. All rights reserved.
//
#import "ViewController.h"
#import "GPUImage.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet GPUImageView *gpuImageView;
@property (nonatomic,strong) GPUImageMovie *movie;
@property (nonatomic,strong) GPUImageMovieWriter *writer;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 視頻路徑(同上一篇 GPUImageMovieWriter 文章)
NSURL *sampleURL = [[NSBundle mainBundle]URLForResource:@"demo" withExtension:@"mp4" subdirectory:nil];
// 初始化 movie
_movie = [[GPUImageMovie alloc] initWithURL:sampleURL];
_movie.shouldRepeat = NO;
_movie.playAtActualSpeed = YES;
// 設置加濾鏡視頻保存路徑
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mp4"];
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
// 初始化
_writer = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480, 640)];
_writer.encodingLiveVideo = NO;
_writer.shouldPassthroughAudio = NO;
/**
如果你設置了 _movie.audioEncodingTarget = _writer;
會報如下錯誤:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetWriterInput appendSampleBuffer:] Cannot append sample buffer: Input buffer must be in an uncompressed format when outputSettings is not nil'
暫時沒去深究,以後再解決!
*/
// 添加濾鏡
GPUImageToonFilter *filter = [[GPUImageToonFilter alloc] init];
[_movie addTarget:filter];
[filter addTarget:_writer];
[_movie enableSynchronizedEncodingUsingMovieWriter:_writer];
[_writer startRecording];
[_movie startProcessing];
__weak typeof(self) weakSelf = self;
[_writer setCompletionBlock:^{
NSLog(@"OK");
[filter removeTarget:weakSelf.writer];
[weakSelf.writer finishRecording];
}];
}
@end
》》測試
運行結果就是:加濾鏡處理後的新視頻大小3M(原視頻674KB)。
》》問題
處理中CPU->140%,處理完CPU->0%
處理中內存->122MB,處理完內存->73MB
參考文章
使用GPUImage實現視頻濾鏡