自定义 AVVideoCompositing

作者: 9362d9acd9ef | 来源:发表于2017-08-30 09:32 被阅读408次

通过 AVFoundation 实现给本地视频添加滤镜的的方案大致有三种

  1. build-in compositor
  2. custom compositor
  3. AVPlayerItemVideoOutput

Custom compositor & Build-in compositor

如果设置了 AVVideoCompositioncustomVideoCompositorClass 属性
那就是用的 custom compositor,反之用的就是 build-in compositor

方案一: build-in compositor

+ (AVVideoComposition *)videoCompositionWithAsset:(AVAsset *)asset applyingCIFiltersWithHandler:(void (^)(AVAsynchronousCIImageFilteringRequest *request))applier

Demo

[AVVideoComposition videoCompositionWithAsset:srcAsset applyingCIFiltersWithHandler: ^(AVAsynchronousCIImageFilteringRequest *request) {
    NSError *err = nil;
    CIImage *filtered = myRenderer(request, &err);
    if (filtered)
    [request finishWithImage:filtered context:nil];
    else
    [request finishWithError:err];
}];

优点:

  1. 自带的 AVVideoCompositionLayerInstruction 很好用,可以实现很多效果渐变、旋转、裁剪的操作
  2. 代码量少

缺点:

  1. 只能作用于单轨(没法做过场动画了)
  2. iOS 版本 9.0 以上才能使用

方案二: custom compositor

- (void)finishCompositionRequest:(AVAsynchronousVideoCompositionRequest *)request {
    NSError *err = nil;

    CVPixelBufferRef sourcePixels = [request sourceFrameByTrackID:trackID];
    CIImage *sourceImage = [CIImage imageWithCVPixelBuffer:sourcePixels];
    [filter setValue:sourceImage forKey:kCIInputImageKey];
    sourceImage = filter.outputImage;

    CVPixelBufferRef resultPixels = [_renderContext newPixelBuffer];
    [_ciContext render:sourceImage toCVPixelBuffer: resultPixels];
   
    if (resultPixels) {
        [request finishWithComposedVideoFrame:resultPixels];
        CVPixelBufferRelease(resultPixels);
    } else {
        [request finishWithError:err];
    }
}

优点:

  1. AVPlayerItem, AVAssetExportSession, AVAssetImageGenerator, or AVAssetReaderVideoCompositionOutput 都可以支持使用 custom compositor,
    写一个类,到处都可以用。
  2. 可定制化程度高,可以创建丰富的过场动画

缺点:

  1. 没办法使用 AVVideoCompositionLayerInstruction 对视频做 OpacityRamp 、 Transform 、Crop 等操作
  2. 需要实现的代码比较多

Demo

方案三: AVPlayerItemVideoOutput

视频添加滤镜的预览和导出

相关文章

  • 自定义 AVVideoCompositing

    通过 AVFoundation 实现给本地视频添加滤镜的的方案大致有三种 build-in compositor ...

  • Dialog

    安卓dialog的使用+如何自定义dialog自定义Dialog自定义Dialog 自定义

  • django的自定义filter和自定义simple_tag

    django的自定义filter和自定义simple_tag 自定义filter: 自定义filter: 简单示例...

  • 自定义tabbarController

    要自定义tabBarController,就要自定义tabBar.要自定义tabBar就要自定义item.所以,咱...

  • 第三方

    ZYSideSlipFilter 侧边栏条件筛选器,支持自定义事件,自定义筛选栏目,自定义所有。。。样式完全自定义...

  • Android 高德地图 自定义Location小蓝点

    设置自定义定位蓝点 自定义Location小蓝点,自定义功能

  • vue 有自定义指令

    vue 的自定义指令,分为全局自定义指令和局部自定义指令,局部自定义指令等价于局部组件。 自定义指令可以对DOM进...

  • Android相关知识点博客记录

    自定义属性 Android自定义View(二、深入解析自定义属性) Android中XML的命名空间、自定义属性 ...

  • CocoaLumberjack源码分析

    1.使用 自定义custom context,自定义flag 自定义日志的格式 自定义日志级别,取消DDLog实现...

  • Android View(转)

    自定义View的原理自定义View基础 - 最易懂的自定义View原理系列自定义View Measure过程 - ...

网友评论

    本文标题:自定义 AVVideoCompositing

    本文链接:https://www.haomeiwen.com/subject/xaezdxtx.html