SCNRecorder
SCNRecorder 允许您记录视频并从 ARSCNView、SCNView 和 ARView(RealityKit)捕获图像,而不会牺牲性能。它为您提供了分享增强现实应用程序或 SceneKit 基础游戏媒体内容的绝佳机会。
从版本 2.2.0 开始,SCNRecorder 只支持 Metal。
要求
- iOS 12.0+
- Xcode 12.0+
- Swift 5.0+
安装
CocoaPods
pod 'SCNRecorder', '~> 2.7'
Carthage
github "gorastudio/SCNRecorder"
使用说明
导入 SCNRecorder 模块。
import SCNRecorder
在 viewDidLoad
中调用 sceneView.prepareForRecording()
。
@IBOutlet var sceneView: SCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.prepareForRecording()
}
现在您可以使用新功能捕获视频。
try sceneView.startVideoRecording()
sceneView.finishVideoRecording { (videoRecording) in
/* Process the captured video. Main thread. */
let controller = AVPlayerViewController()
controller.player = AVPlayer(url: recording.url)
self.navigationController?.pushViewController(controller, animated: true)
}
要捕获图像,您只需调用
sceneView.takePhoto { (photo: UIImage) in
/* Your photo is now here. Main thread. */
}
或
sceneView.takePhotoResult { (result: Result<UIImage, Swift.Error>) in
/* Result is here. Main thread. */
}
查看示例项目以获取更多详细信息。
音频捕获
ARSCNView
要从 ARSCNView
捕获视频和音频,请启用 ARConfiguration
中的音频。
let configuration = ARWorldTrackingConfiguration()
configuration.providesAudioData = true
sceneView.session.run(configuration)
SCNView
要从 SCNView
捕获音频,您需要自己实现。
var captureSession: AVCaptureSession?
override func viewDidLoad() {
super.viewDidLoad()
sceneView.prepareForRecording()
guard let recorder = sceneView.recorder else { return }
let captureSession = AVCaptureSession()
guard let captureDevice = AVCaptureDevice.default(for: .audio) else { return }
do {
let captureInput = try AVCaptureDeviceInput(device: captureDevice)
guard captureSession.canAddInput(captureInput) else { return }
captureSession.addInput(captureInput)
}
catch { print("Can't create AVCaptureDeviceInput: \(error)")}
guard captureSession.canAddRecorder(recorder) else { return }
captureSession.addRecorder(recorder)
captureSession.startRunning()
self.captureSession = captureSession
}
或者,简单一点
var captureSession: AVCaptureSession?
override func viewDidLoad() {
super.viewDidLoad()
sceneView.prepareForRecording()
captureSession = try? .makeAudioForRecorder(sceneView.recorder!)
}
音乐叠加
您可以使用音乐并同时在视频中添加它,而不是用麦克风捕获音频。
let auidoEngine = AudioEngine()
override func viewDidLoad() {
super.viewDidLoad()
sceneView.prepareForRecording()
do {
audioEngine.recorder = sceneView.recorder
// If true, use sound data from audioEngine if any
// If false, use sound data ARSession/AVCaptureSession if any
sceneView.recorder?.useAudioEngine = true
let player = try AudioEngine.Player(url: url)
audioEngine.player = player
player.play()
}
catch {
print(\(error))
}
}
RealityKit
为了支持记录 RealityKit,请将 ARView+MetalRecordable.swift 和 ARView+SelfSceneRecordable.swift 文件复制到您的项目中。然后查看 RealityKitViewController.swift 了解用法。
就这样!
查看示例项目以获取更多详细信息。
作者
感谢 Fedor Prokhorov 和 Dmitry Yurlov 对测试、审查和灵感的贡献。
GORA Studio
用魔法制作
许可
此项目受 MIT 许可证授权 - 有关详细信息,请参阅 LICENSE 文件