我们使用MTKView
来渲染自定义视频和动画。MTKView不提供直接的视频录制支持。本项目旨在提供一个简单高效的直接录制视频+音频的方法(可以是麦克风的音频源或音频文件)。
- API可以将CIImage直接渲染(或绘制)在MTKView上,帧率为30fps。
- 使用麦克风音频源录制在MetalView上渲染的视频。
- 使用自定义音频轨道录制在MetalView上渲染的视频。
要运行示例项目,首先从仓库中克隆并从Example目录中运行pod install
。在本例中,每个相机帧都会被过滤并叠加到静态图像上,然后重新渲染到RecordableMetalView
。点击按钮将开始视频录制,点击停止按钮将停止视频录制并保存在照片库中。
需求
- Xcode 11.
- Swift 5.
- iOS 11 或更高版本。
安装
RecordableMetalView 可以通过 CocoaPods 获得。要安装它,只需将以下行添加到您的 Podfile 中:
pod 'RecordableMetalView'
用法
创建 RecordableMetalView(Storyboard 实现)。
从对象库创建一个 MTKView
并将 MTKView
的 custom class
设置为 RecordableMetalView
。
下一步是将此视图的出口创建到您的 ViewController
类中,通过将鼠标从 MTKView 拖动到 ViewController
+ 按 control
键来完成。
@IBOutlet weak var metalView: RecordableMetalView!
在 RecordableMetalView 上渲染或绘制 CIImage
要在 RecordableMetalView 上渲染 CIImage,您可以直接调用 RecordableMetalView 类的 public func draw(ciimage: CIImage)
方法。
示例。
//make sure your project image assets has image with name 'bgimg'
let image = UIImage(named: "bgimg")
let ciimage = CIImage(cgImage: (image?.cgImage)!)
...
metalView.draw(ciimage: ciimage)
设置 RecordableMetalView 回调委托。
为了接收录制事件(如开始和停止)的回调,您需要实现 RecordableMetalDelegate
。为了简化,只需在您的 ViewController 中实现 RecordableMetalDelegate
并设置 metalView.recordingDelegate = self
。
import UIKit
import RecordableMetalView
class ViewController: UIViewController, RecordableMetalDelegate{
@IBOutlet weak var metalView: RecordableMetalView!
override func viewDidLoad() {
super.viewDidLoad()
metalView.recordingDelegate = self
}
//MARK: RecordableMetalDelegate callback methods
func didCompleteRecording(url: URL) {
print("Completed at \(url)")
}
func didFailRecording(error: Error) {
print("Error: \(error)")
}
}
...
使用麦克风音频源进行录制。
要使用麦克风音频源将渲染在 RecordableMetalView
上的自定义视频录制到 MP4
文件中,请使用以下调用。
metalView.startVideoRecoding()
要停止录制,请调用
metalView.stopVideoRecording()
停止录制后,RecordableMetalDelegate
的其中一个方法将被调用。如果录制成功完成,将调用 didCompleteRecording(url: URL)
。其中 url
将是您应用程序文档目录中的输出文件。
使用自定义音频文件进行录制
要使用显式的文件作为音频源将渲染在 RecordableMetalView
上的自定义视频录制,请使用以下调用。
metalView.startVideoRecoding(backGroundAudioUrl: AUDIO_FILE_URL)
要停止录制,请调用
metalView.stopVideoRecording()
停止录制后,RecordableMetalDelegate
的其中一个方法将被调用。如果录制成功完成,将调用 didCompleteRecording(url: URL)
。其中 url
将是您应用程序文档目录中的输出文件。
感谢
感谢使用 RecordableMetalView,您的支持非常宝贵!如果您想使这个库更好,我们欢迎您贡献。如果您想贡献,请随时创建一个 PR。
作者
Afsar Ahamad: [email protected]
许可协议
RecordableMetalView 在 MIT 许可协议下可用。更多信息,请参阅 LICENSE 文件。