官方给的demo中只有一次性录制,想要重新录制或者是暂停录制是没法实现的。但是,既然有这个需求,肯定就有人想方设法去提供这个需求,替咱们解决了这个问题。在这里我不免感叹,这个第三方本身就是国外的人写的,最后实现这个暂停录制功能的人也是国外的,他并不是写这个第三方库的开发人员。他是在这个库的基础上,改了某个类的一些代码,然后,这个功能就实现了。感谢这位开发人员的贡献,解决了大家都想要解决的问题。 先点这个链接(https://github.com/evfemist/GPUImage/commit/95f03053e0ac15ea39fbd94d66d6b4bec3ef202f) 看看人家的GPUImageMovieWrite这个类跟源码本身的区别,看着那些改动的地方粘贴复制更改你下载的GPUImage中GPUImageMovieWrite。假如你不想改动源码,那就直接下载这个,你就可以直接用了。这个类本身有一个属性:pause。在你要暂停的方法中设置.paused = YES就行。因为公司网速不好,我就没有重新下载,而是在源码中改动。给大家看一下我是如何去暂停录制的。
if(_isPause){
_rotate.hidden = NO;
_close.hidden = NO;
_uploadVideo.hidden = NO;
_deleteButton.hidden = NO;
movieWriter.paused = YES;
LoLog(@"暂停录制");
[_takeVideo setImage:[UIImage imageNamed:@"yuan"] forState:UIControlStateNormal];
[_myTimer setFireDate:[NSDate distantFuture]];
}
else{
_rotate.hidden = YES;
_close.hidden = YES;
_uploadVideo.hidden = YES;
_chooseLocolVideo.hidden = YES;
[_takeVideo setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal];
if(movieWriter.isPaused){
movieWriter.paused = NO;
LoLog(@"继续录制");
}
else{
LoLog(@"开始录制");
minute = 0;
second = 0;
[movieWriter startRecording];
}
[_myTimer setFireDate:[NSDate date]];
}
_isPause = !_isPause;
}```
我这部分代码中不仅实现了暂停跟继续录制,还有一个开始录制。这个开始录制表明你还未录制任何视频,或者是你把之前录制好的视频丢弃,重新开始新的录制。我这里无论是暂停还是开始,镜头都一直显示画面的,并未停止抓捕,只是在你暂停录制的时候设置movieWriter.paused = YES,这样它就不会继续写数据。
一开始我做重新录制的时候,肯定先要处理movieWriter已经录制的视频,但无论你是调用finish或者是cancel方法,当你再次调用startRecording时,程序都报错。返回AVAssetWriterStatus,具体是哪种试过了就知道了,反正这个错误导致你不能再次录制。AVAssetWriter存在于movieWriter中,既然出了错,肯定就是这个movieWriter的问题,既然之前的用不了,那么我们再创建一个新的就好。所以,我们要单独把这个movieWriter的 创建给提出来放到一个方法中,随时能够调用。
录制视频的时候有删除按钮,在删除方法中,我们需要做两件事,第一是movieWriter调用cancel方法,你的filter 需要removeTarget:movieWriter.为什么呢?因为接下来你要创建新的movieWriter,假如你的filter还是之前的writer,那还有什么用,去除旧的,添加新的。
```-(void)giveupVideo{
_uploadVideo.hidden = YES;
_chooseLocolVideo.hidden = NO;
_deleteButton.hidden = YES;
_videoProgress.progress = 0.0;
_displayTime.text = @"0:0";
second = 0;
minute = 0;
[movieWriter cancelRecording];
[filter removeTarget:movieWriter];
[self initMovieWriter];
}
-(void)initMovieWriter{
NSString *pp = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Movie.mov"];
unlink([pp UTF8String]);//如果文件已经存在,AVASSetWriter不会再录制新的帧,所以删除旧的。
NSURL *willSaveUrl = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"Movie.mov"]];
path = willSaveUrl;
movieWriter = [[GPUImageMovieWriter alloc]initWithMovieURL:willSaveUrl size:CGSizeMake(504, 896)];
movieWriter.paused = NO;
movieWriter.encodingLiveVideo = YES;
movieWriter.shouldPassthroughAudio = YES;
movieWriter.hasAudioTrack = YES;
[filter addTarget:movieWriter];
videoCamera.audioEncodingTarget = movieWriter;
}