使用GPUImage一些坑

Jan 10, 2017

  1. 首先理解了安装,作者推荐动态库安装,好处就是特么的,你看到的source都是输入源,filters都是滤镜过程,output就是出口啦
  2. GPUImageMovie能接受
    1)asset、2)AVPlayItem、3)URL路径,,,如果你有特殊要求,可以使用GPUImageMovieComposition这个类,允许你输入AVFoundation的多音频输入、画质动作、剪切之后的AVMutableComposition,我就用的这个
  3. GPUImageMovie没有音频播放,美拍不知道怎么整的,估计我觉得就是使用另外一些人提供的思路,对源码侵入加入播放器
    可以参考这个:1):http://blog.csdn.net/personsky/article/details/52992919
    2):https://gist.github.com/anonymous/5112961
    毕竟音频播放就是个形式,,要不然你有没有美拍的源码,对了美拍还真就是用GPUImage,用的真是6啊,,偶像
    3):如果你没有用AVMutableComposition修改视频orientation,其滤镜里面也有能修改方向的方法setInputRotation
    用法如:[sepiaFilter setInputRotation:kGPUImageRotateRight atIndex:0];
  4. 检查滤镜过程使用:filter setFrameProcessingCompletionBlock:^(GPUImageOutput *output,CMTime frameTime)
    比如你可以在GPUImageElement里面修改这个
  5. 注意检查输入滤镜的pipeline过程有没有问题
    http://blog.csdn.net/u1031/article/details/48712163
    这个大哥的几张图挺好的,看了之后对addTarget有更多的理解
  6. 多视频输入我这还好,没有什么问题,多语音的话,你就考虑使用GPUImageMovieComposition的audiomix,但是没法控制播放了似乎,
  7. NSString*pathToMovie = [self movieSavedPath];
    unlink([pathToMovieUTF8String]);// If a file already exists, AVAssetWriter won’t let you record new frames, so delete the old movie
    可以使用快捷unlink视频,我特么不知道,仍然在使用filemanager,low逼格
  8. 附一个滤镜表在我国—>China🇨🇳境内的名字翻译地址
    http://blog.csdn.net/qq_27074387/article/details/52221938
  9. 在多视频输入里面,将self.movieFile.playAtActualSpeed=YES;
    playAtActualSpeed都写上,如果视频不同步,有一个先完成了,则会有可能10s视频变成了4s,有时前一段视频播放正常,后一段就视频画面不动了。
  10. forceProcessingAtSize:CGSize
    给其定义大小
  11. GPUImage pipeline
    1)、创建图片处理类GPUImagePicture把图片传进去stillImage
    GPUImagePicture staticPicture = [[GPUImagePicture alloc] initWithImage:stillImage smoothlyScaleOutput:YES];
    2)、把多个滤镜对象放到数组中
    NSMutableArray
    arrayTemp=[NSMutableArray array];
    [arrayTempaddObject:RGBFilter];
    3)、创建GPUImageFilterPipeline对象 初始化使用
    initWithOrderedFilters:(NSArray) filters input:(GPUImageOutput)input output:(id )output;
    这个方法;这个方法需要三个参数:
    filters:多个滤镜的数组
    input:被渲染的图片(步骤1 的staticPicture 对象)
    output:渲染后的图片的容器(类型是view)
    GPUImageFilterPipeline filterPipeline = [[GPUImageFilterPipeline alloc] initWithOrderedFilters:arrayTempinput:staticPictureoutput:output];
    4)、渲染图片 使用processImage(此方法是GPUImagePicture类下的)和useNextFrameForImageCapture(此方法是GPUImageOutput下也就是单个滤镜);
    [staticPicture processImage];
    [filteruseNextFrameForImageCapture];//这个filter 可以是RGBFiltertoonFilter等
    5)、获取图片 使用currentFilteredFrame(此方法是GPUImageFilterPipeline类下的);
    UIImage
    img = [pipeline currentFilteredFrame];
    6)、对于使用GPUImageUIElement没有给contentView设置rect则会出现:
    : CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    *** Assertion failure in -[GPUImageFramebuffer generateFramebuffer], address/Submodules/framework/Source/GPUImageFramebuffer.m:156
    同时breakpoint跳到
    breakpoint