GPUImageMovieWriter实现暂停录制,重新录制

官方给的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;
}

转载于:https://my.oschina.net/NycoWang/blog/904120

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值