💻
ScreenCaptureKitによるmacOSでの画面収録
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にも実装してみました。
フレームワーク部分は次のとおり
アプリケーション部分は次のとおり
結構簡単に組み込めました。
Discussion