Kakapos全平台视频导出并添加滤镜工具

简介: Kakapos是一个视频添加过滤器工具,支持网络和本地网址以及相册视频。同时可以简单的支持多种滤镜库,例如Harbeth、GPUImage、MetalPetal、CoreImage等等。反正核心其实就是对`CVPixelBuffer`进行注入滤镜处理,然后再导出视频即可。支持全平台系统,macOS、iOS、tvOS、watchOS

Kakapos 是一个视频添加过滤器工具,支持网络和本地网址以及相册视频。

同时可以简单的支持多种滤镜库,例如Harbeth、GPUImage、MetalPetal、CoreImage等等。

反正核心其实就是对CVPixelBuffer进行注入滤镜处理,然后再导出视频即可。

支持全平台系统,macOS、iOS、tvOS、watchOS


演示Demo

这边已经提供关于macOS和iOS两个端的演示Demo,需要的朋友请移步GitHub下载即可。

框架介绍

该架构主要涵盖4个文件:

  • Exporter:主要的转换文件,注入滤镜后导出视频。
/// 设置导出文件质量
public var presetName: String = AVAssetExportPresetHighestQuality {
    didSet {
        if !AVAssetExportSession.allExportPresets().contains(presetName) {
            presetName = AVAssetExportPresetMediumQuality
        }
    }
}
/// 根据视频链接初始化
public init(videoURL: URL, delegate: ExporterDelegate) {
    self.init(asset: AVAsset(url: videoURL), delegate: delegate)
}
/// 根据AVAsset初始化
public init(asset: AVAsset, delegate: ExporterDelegate) {
    self.asset = asset
    self.delegate = delegate
}
/// 添加滤镜然后导出视频,主要在`filtering`当中对`buffer`添加滤镜,最后协议反馈结果。
public func export(outputURL: URL, optimizeForNetworkUse: Bool = true, filtering: @escaping PixelBufferCallback) {
    ...
}
  • ExporterDelegate:导出协议,包括成功和失败两个协议方法。
public protocol ExporterDelegate: NSObjectProtocol {
    
    /// 导出成功的视频网址,相当于outputURL。
    func export(_ exporter: Exporter, success videoURL: URL)
    
    /// 视频导出失败。
    func export(_ exporter: Exporter, failed error: Exporter.Error)
}
  • Compositor:对视频帧进行处理,对缓冲进入注入滤镜处理,最后再还原回去finish(withComposedVideoFrame:)即可。
func startRequest(_ request: AVAsynchronousVideoCompositionRequest) {
    self.renderQueue.sync {
        guard let instruction = request.videoCompositionInstruction as? CompositionInstruction,
              let pixels = request.sourceFrame(byTrackID: instruction.trackID) else {
            return
        }
        let buffer = instruction.bufferCallback(pixels) ?? pixels
        request.finish(withComposedVideoFrame: buffer)
    }
}
  • CompositionInstruction:表示一个指令,决定每个timeRange内每个轨道的状态,配置视频组合的渲染尺寸、缩放、帧时长等,定义时间范围信息,以及每一帧的层级。
/// 接收回调信息,方便后续转换处理。
init(trackID: CMPersistentTrackID, bufferCallback: @escaping Exporter.PixelBufferCallback) {
    self.trackID = trackID
    self.bufferCallback = bufferCallback
    super.init()
    self.enablePostProcessing = true
}

关于AVMutableVideoCompositionInstruction更多介绍

参考:https://www.codersrc.com/archives/11663.html

该类还能拿来 完成对媒体裁剪 / 缩放 / 转场 / 过渡等操作

如何使用?

  • 设置转换视频存储沙盒链接。
/// 创建临时路径以保存转换的视频
let outputURL: URL = {
    let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let outputURL = documents.appendingPathComponent("condy_exporter_video.mp4")
    
    // Check if the file already exists then remove the previous file
    if FileManager.default.fileExists(atPath: outputURL.path) {
        do {
            try FileManager.default.removeItem(at: outputURL)
        } catch {
            //completionHandler(nil, error)
        }
    }
    return outputURL
}()
  • 创建视频导出器exporter实例。
let exporter = Exporter.init(videoURL: ``URL Link``, delegate: self)

或者

let exporter = Exporter.init(asset: ``AVAsset``, delegate: self)
  • 实现视频导出结果协议ExporterDelegate
/// Video export successed.
/// - Parameters:
///   - exporter: VideoExporter
///   - videoURL: Export the successful video url, Be equivalent to outputURL.
func export(_ exporter: Kakapos.Exporter, success videoURL: URL) {
    self.view.hideAllToasts()
    let player = AVPlayer(url: videoURL)
    let vc = AVPlayerViewController()
    vc.player = player
    self.present(vc, animated: true) {
        vc.player?.play()
    }
}

/// Video export failure.
/// - Parameters:
///   - exporter: VideoExporter
///   - error: Failure error message.
func export(_ exporter: Kakapos.Exporter, failed error: Kakapos.Exporter.Error) {
    // do someing..
}
  • 转换视频缓冲区CVPixelBuffer并添加过滤器。
let filters: [C7FilterProtocol] = [
    C7Flip(horizontal: true, vertical: false),
    C7ColorConvert(with: .gray),
    C7SoulOut(soul: 0.3),
    MPSGaussianBlur(radius: 5),
]
let exporter = Exporter.init(videoURL: ``URL Link``, delegate: self)
exporter.export(outputURL: outputURL) {
    let dest = BoxxIO(element: $0, filters: filters)
    return try? dest.output()
}

或者

let martix = C7ColorMatrix4x4(matrix: Matrix4x4.Color.gray)
let screen = C7SplitScreen(type: .two)

let exporter = Exporter.init(videoURL: ``URL Link``, delegate: self)
exporter.export(outputURL: outputURL) { $0 ->> martix ->> screen }

最后

✌️.

相关文章
|
7月前
|
XML 前端开发 JavaScript
分享在线开发工具格式转换
工具支持大多数常用转换场景,提升开发工作效率,希望能帮助大家,JSON转换,SVG转换,HTML转换,CSS转换,JavaScript转换,GraphQL转换,JSON-LD转换,TypeScript转换,Flow转换,MarkDown转换,XML转换。
40 1
分享在线开发工具格式转换
|
Web App开发 人工智能 开发者
这可能是最方便的抠图工具了!
源码地址:docs.qq.com/doc/DVHRQUVhKVkN2dUha
244 0
(在线编辑DWG)网页CAD二次开发实现多重引线功能
本章介绍如何使用 mxcad 插件在 CAD 图纸中实现箭头引注功能。用户可通过点击画布确定箭头起点和引线顶点,自定义箭头形状、上标和下标文字内容及位置,提高图纸的完整性和可读性。功能实现包括自定义箭头引注类、注册自定义类信息和调用自定义类。示例代码展示了详细的实现步骤,用户可根据需求进行二次开发。在线示例 demo 可供参考。
|
6月前
|
数据库
在线CAD二次开发块表(网页预览编辑cad插件)
网页CAD二次开发块表,在DWG数据库中,所有图块都存放在块表McDbBlockTable()中,块表中每一条记录称为图块记录对象McDbBlockTableRecord(),图块记录中存放着所有实体数据,用户可以通过改变图块的属性设置来修改其对应着的实体数据。
在线CAD二次开发块表(网页预览编辑cad插件)
|
存储 定位技术 图形学
Blender插件:GLTF 2.0 导入/导出工具
Blender插件:GLTF 2.0 导入/导出工具
328 0
|
数据安全/隐私保护
【实用工具指南 二】视频剪辑工具
【实用工具指南 二】视频剪辑工具
118 0
|
计算机视觉
ps2023软件全新版免费调色滤镜插件exposure图片后期处理工具
许多朋友都习惯于用手机拍照,但拍出来的效果却没有别人拍出来的好看,不知道如何解决。这种情况下你只需一个适合自己的照片处理工具,就可以提升原照片的美观度。那么,有哪些好用的照片处理工具,如何用照片处理工具处理照片,下面就有我来为各位进行讲解,希望能够给大家一些帮助。
461 1
ps2023软件全新版免费调色滤镜插件exposure图片后期处理工具
|
编解码 BI 定位技术
【数据工具】ArcGIS批量出图工具箱
【数据工具】ArcGIS批量出图工具箱
【数据工具】ArcGIS批量出图工具箱
|
数据可视化 前端开发 HTML5
Tiff – 值得你体验一下的可视化的字体对比工具
  Tiff 是一款字体对比工具,可视化对比两种字体之间的差异。这是一个工具来帮助比较两种字体,同时学习排版。在这一点上,谷歌 Web 字体作为 Tiff 外部字体文件的唯一来源。由于应用程序使用的一些功能需要 HTML5 和 CSS3 支持,因此请使用现浏览器来使用。
1585 1