GPUImage視頻編輯

在上一篇文章:GPUImage的使用(圖片渲染篇) 中已經(jīng)介紹了如何接入GPUImage,并且實現(xiàn)了簡單的圖片渲染,在這片文章中我來介紹一下如何給已保存的視頻進行編輯。

給視頻渲染,最基本的需要聲明三個變量:GPUImageMovie(視頻載體),GPUImageOutput(濾鏡),GPUImageMovieWriter(寫入視頻文件類)。

@interface VideoEditViewController : UIViewController
{
    //預覽用
    GPUImageMovie *movieFile;
    //保存用
    GPUImageMovie *saveMovie;
    //預覽用的濾鏡
    GPUImageOutput<GPUImageInput> *filter;
    //保存用的濾鏡
    GPUImageOutput<GPUImageInput> *savefilter;
    GPUImageMovieWriter *saveWrite;
    
}

因為GPUImageMovieWriter保存編輯視頻的時候是從預覽到的那一幀開始寫入的,所以我把預覽跟保存用的GPUImageMovie和GPUImageOutput分成兩個對象來操作,也就是說,預覽的時候用一個GPUImageMovie對象,保存的時候用另外一個新的GPUImageMovie對象

先看預覽的代碼:

//初始化GPUImageMovie
    movieFile = [[GPUImageMovie alloc] initWithURL:self.pathURL];
    //設置預覽重復播放
    movieFile.shouldRepeat = YES;
    movieFile.runBenchmark = YES;
    //設置渲染速度與視屏播放速度一致
    movieFile.playAtActualSpeed = YES;
    
    //初始化磨皮濾鏡
    filter = [[GPUImageBeautifyFilter alloc] init];
    //原圖
    filter = [[GPUImageBrightnessFilter alloc] init];
    [(GPUImageBrightnessFilter *)filter setBrightness:0];
    savefilter = [[GPUImageBrightnessFilter alloc] init];
    [(GPUImageBrightnessFilter *)savefilter setBrightness:0];
    //把濾鏡添加到GPUImageMovie中
    [movieFile addTarget:filter];
    
    // Only rotate the video for display, leave orientation the same for recording
    //創(chuàng)建預覽的GPUImageView并顯示
    filterView = [[GPUImageView alloc] init];
    filterView.frame = CGRectMake(0, 64, ScreenWidth, ScreenWidth);
//    filterView.transform = CGAffineTransformMakeRotation(90 * M_PI/180.0);
    
    [self.view addSubview:filterView];
    [self.view sendSubviewToBack:filterView];
    //把濾鏡內(nèi)容顯示到預覽中
    [filter addTarget:filterView];
    //開始預覽
    [movieFile startProcessing];
 //重新創(chuàng)建GPUImageMovie用于保存
    saveMovie = [[GPUImageMovie alloc] initWithURL:self.pathURL];
    saveMovie.shouldRepeat = YES;
    saveMovie.runBenchmark = YES;
    saveMovie.playAtActualSpeed = YES;
    
    [saveMovie addTarget:savefilter];
    
    //保存路徑
    NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"temp.mp4"];
    unlink([path UTF8String]);
    saveURL = [NSURL fileURLWithPath:path];
    //清空路徑里的文件
    [[NSFileManager defaultManager] removeItemAtURL:saveURL error:nil];
    
    saveWrite = [[GPUImageMovieWriter alloc] initWithMovieURL:saveURL size:CGSizeMake(ScreenWidth, ScreenWidth) fileType:AVFileTypeMPEG4 outputSettings:nil];
    [savefilter addTarget:saveWrite];
    
    saveWrite.shouldPassthroughAudio = NO;
    saveWrite.encodingLiveVideo = YES;
    
//    saveMovie.audioEncodingTarget = saveWrite;
    [saveMovie enableSynchronizedEncodingUsingMovieWriter:saveWrite];
    [saveWrite startRecording];
    [saveMovie startProcessing];
    [MBProgressHUD showHUDAddedTo:self.view animated:YES].label.text = @"正在導出。。。";
    __weak VideoEditViewController *weakSelf = self;
    __weak GPUImageOutput<GPUImageInput> *weakSaveFilter = savefilter;
    __weak GPUImageMovieWriter *weakmovieWriter = saveWrite;
    __weak GPUImageMovie *weakSaveMovie = saveMovie;
    __weak NSURL *weakSaveURL = saveURL;
    [saveWrite setCompletionBlock:^{
        
        dispatch_async(dispatch_get_main_queue(), ^{
                [weakSaveFilter removeTarget:weakmovieWriter];
                [weakmovieWriter finishRecording];
                [weakSaveMovie endProcessing];
                [weakSaveMovie cancelProcessing];
                [weakSaveMovie removeTarget:weakSaveFilter];
                [MBProgressHUD hideHUDForView:weakSelf.view animated:YES];
                NSLog(@"保存成功");
        });
     
    }];

注意:

1:路徑問題

NSURL *saveURL = [NSURL fileURLWithPath:savePath];

創(chuàng)建URL要用fileURLWithPath不能用URLWithString,否則會報錯!

2:保存時報couldn't write a frame

[saveWrite startRecording];

方法一定要在

[saveMovie startProcessing];

方法后面,不然編輯有時候會編輯失敗

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容