Home
Softono
aperture

aperture

Open source Swift
1.3K
Stars
114
Forks
6
Issues
28
Watchers
1 year
Last Commit

About aperture

Record the screen on macOS

Platforms

Web Self-hosted macOS iOS

Languages

Swift MATLAB

Links

Aperture

Record the screen on macOS

Requirements

  • macOS 13+
  • Xcode 15+
  • Swift 5.7+

Install

Add the following to Package.swift:

.package(url: "https://github.com/wulkano/Aperture", from: "3.0.0")

Or add the package in Xcode.

Docs

API Documentation.

Base Usage

import Foundation
import Aperture

let recorder = Aperture.Recorder()

let screens = try await Aperture.Devices.screen()

guard let screen = screens.first else {
    // No screens
    exit(1)
}

try await recorder.start(
    target: .screen,
    options: Aperture.RecordingOptions(
        destination: URL(filePath: "./screen-recording.mp4"),
        targetID: screen.id,
    )
)

try await Task.sleep(for: .seconds(5))

try await recorder.stop()

Base Options

destination

Type: URL

The filepath where the resulting recording should be written to.

targetID

Type: String

The ID of the target to record

Base Audio Options

losslessAudio

Type: Bool\ Default: false

Will use the lossless ALAC codec if enabled, AAC otherwise.

recordSystemAudio

Type: Bool\ Default: false

Record the system audio.

microphoneDeviceID

Type: String?

A microphone device ID to record.

Base Video Options

framesPerSecond

Type: Int\ Default: 60

Number of frames per seconds.

showCursor

Type: Bool\ Default: true

Show the cursor in the screen recording.

highlightClicks

Type: Bool\ Default: false

Highlight cursor clicks in the screen recording.

Note: This will only apply on macOS 15+

videoCodec

Type: Aperture.VideoCodec\ Default: .h264\ Values: .h264, .hevc, .proRes422, .proRes4444

The video codec to be used.

Recording a screen

Use Aeprture.Devices.screen to discover the available screens

And then start recording with target: .screen

try await recorder.start(
    target: .screen,
    options: Aperture.RecordingOptions(
        destination: fileURL,
        targetID: screen.id,
        framesPerSecond: 60,
        cropRect: CGRect(x: 10, y: 10, width: 100, height: 100),
        showCursor: true,
        highlightClicks: true,
        videoCodec: .h264,
        losslessAudio: true,
        recordSystemAudio: true,
        microphoneDeviceID: microphone.id,
    )
)

Accepts all the base video and audio options along with:

cropRect

Type: CGRect?

Record only an area of the screen.

Recording a window

Use Aeprture.Devices.window to discover the available windows

And then start recording with target: .window

try await recorder.start(
    target: .window,
    options: Aperture.RecordingOptions(
        destination: fileURL,
        targetID: window.id,
        framesPerSecond: 60,
        showCursor: true,
        highlightClicks: true,
        videoCodec: .h264,
        losslessAudio: true,
        recordSystemAudio: true,
        microphoneDeviceID: microphone.id,
    )
)

Accepts all the base video and audio options

Recording only audio

Use Aeprture.Devices.audio to discover the available audio devices

And then start recording with target: .audioOnly

try await recorder.start(
    target: .audioOnly,
    options: Aperture.RecordingOptions(
        destination: fileURL,
        losslessAudio: true,
        recordSystemAudio: true,
        microphoneDeviceID: microphone.id,
    )
)

Accepts all the base audio options.

Recording an external device

Use Aeprture.Devices.iOS to discover the available external devices

And then start recording with target: .externalDevice

try await recorder.start(
    target: .externalDevice,
    options: Aperture.RecordingOptions(
        destination: fileURL,
        targetID: device.id,
        framesPerSecond: 60,
        videoCodec: .h264,
        losslessAudio: true,
        recordSystemAudio: true,
        microphoneDeviceID: microphone.id,
    )
)

Accepts the base video options except for cursor related ones, and all the audio options.

Discovering Devices

Screens

let screens = try await Aperture.Devices.screen()

Windows

let windows = try await Aperture.Devices.window(excludeDesktopWindows: true, onScreenWindowsOnly: true)
excludeDesktopWindows

Type: Bool\ Default: true

onScreenWindowsOnly

Type: Bool\ Default: true

Audio Devices

let devices = Aperture.Devices.audio()

External Devices

let devices = Aperture.Devices.iOS()

Dev

Run ./example.sh or ./example-ios.sh.

Related