SCNRecorder 2.8.1

SCNRecorder 2.8.1

SCNRecorder 维护。



  • 作者:
  • Владислав Григорьев

SCNRecorder

GitHub license Platforms Swift Cocoapods compatible Carthage compatible Swift Package Manager

SCNRecorder 允许您记录视频并从 ARSCNView、SCNView 和 ARView(RealityKit)捕获图像,而不会牺牲性能。它为您提供了分享增强现实应用程序或 SceneKit 基础游戏媒体内容的绝佳机会。

从版本 2.2.0 开始,SCNRecorder 只支持 Metal。

Sample

要求

  • 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.swiftARView+SelfSceneRecordable.swift 文件复制到您的项目中。然后查看 RealityKitViewController.swift 了解用法。

就这样!

查看示例项目以获取更多详细信息。

作者

感谢 Fedor ProkhorovDmitry Yurlov 对测试、审查和灵感的贡献。

GORA Studio

用魔法制作🪄GORA Studio

许可

此项目受 MIT 许可证授权 - 有关详细信息,请参阅 LICENSE 文件