💻

ScreenCaptureKitによるmacOSでの画面収録

2023/01/22に公開

ScreenCaptureKitを利用したmacOSでの画面収録機能について紹介します。

  • macOS12.3以降に、ScreenCaptureKitが登場して画面収録が簡単にできるようになりました。
  • mavOS13.0以降に、映像のほか音声の収録も可能になりました。
  • 今までは、AVCaptureScreenInputを利用して同様の機能を実現していました。

ScreenCaptureKitで任意の画面をキャプチャーする例

ScreenCaptureKitでの実装例です。

ScreenCaptureKit
guard let window = try await SCShareableContent.current.windows.first(where: { $0.owningApplication?.applicationName == "キャプチャー希望のアプリケーション名" }) else {return }
let filter = SCContentFilter(desktopIndependentWindow: window)
let config = SCStreamConfiguration()
config.width = Int(window.frame.width)
config.height = Int(window.frame.height)
// outputには、protocol SCStreamOutputを実装したオブジェクトを指定します。
// procotol SCStreamOutput{
//  func stream(SCStream, didOutputSampleBuffer: CMSampleBuffer, of: SCStreamOutputType)
// }
let stream = SCStream(filter: filter, configuration: config, delegate: nil)
try stream.addStreamOutput(output, type: .screen, sampleHandlerQueue: DispatchQueue.main)
try stream.addStreamOutput(output, type: .audio, sampleHandlerQueue: DispatchQueue.main)
try await stream?.startCapture()

AVCaptureScreenInputでの例

AVCaptureScreenInput形式で画面全体をキャプチャーする実装例です

AVCaptureScreenInput
let session = AVCaptureSession()
let displayID = CGDirectDisplayID(CGMainDisplayID())
let input = AVCaptureScreenInput(displayID: displayID)
let output = AVCaptureVideoDataOutput()
output.alwaysDiscardsLateVideoFrames = true
// delegateには、protocol AVCaptureVideoDataOutputSampleBufferDelegateを実装したオブジェクトを指定します。
// procotol AVCaptureVideoDataOutputSampleBufferDelegate {
//  func captureOutput(AVCaptureOutput, didOutput: CMSampleBuffer, from: AVCaptureConnection)
// }
output.setSampleBufferDelegate(delegate, queue: DispatchQueue.main)
if session.canAddInput(input) {
   session.addInput(input)
}
if session.canAddOutput(output) {
  session.addOutput(output)
}
session.startRunning()

HaishinKitへの機能追加

自作のライブ配信ライブラリーHaishinKitにも実装してみました。
https://github.com/shogo4405/HaishinKit.swift/pull/1123

フレームワーク部分は次のとおり

https://github.com/shogo4405/HaishinKit.swift/blob/c67564cb46b4e927e5e1cf1b092aa51203d23ff2/Sources/Net/NetStream.swift#L303-L319

アプリケーション部分は次のとおり

https://github.com/shogo4405/HaishinKit.swift/blob/c67564cb46b4e927e5e1cf1b092aa51203d23ff2/Examples/macOS/SCStreamPublishViewController.swift

結構簡単に組み込めました。

Discussion