CaptureKit

Sur les plateformes Apple, capturer de l'audio et de la vidéo semble simple en surface. En réalité, dès qu'on sort du cas trivial — microphone + fichier M4A — la fragmentation des APIs rend tout complexe. AVCaptureSession pour la caméra, AudioEngine pour le micro, ScreenCaptureKit pour l'écran sur macOS, ReplayKit sur iOS, VideoToolbox pour encoder en H.264, AudioToolbox pour AAC… Chaque composant a sa propre surface d'API, ses propres contraintes de threading, ses propres formats de buffer.

En construisant l'écosystème streaming d'Atelier Socle — HLSKit, RTMPKit, SRTKit, IcecastKit — il manquait la brique la plus fondamentale : capter le signal. Chaque transport avait besoin de buffers audio encodés, de frames vidéo compressées, d'une gestion cohérente des permissions, du monitoring de niveaux. Et chaque app devait réimplémenter la même logique de capture, avec les mêmes pièges.

CaptureKit unifie tout ça. Un seul CaptureSession orchestre sources, encodeurs et sorties. Un seul StreamingPipeline connecte la capture à n'importe quel transport via un protocole StreamingTransport. Le tout en Swift 6.2 strict — actors, AsyncStream, Sendable partout — sans Combine, sans dépendance externe, avec un support natif de macOS 14, iOS 17 et visionOS 1.

Ce que fait CaptureKit

CaptureKit couvre l'ensemble du chemin de capture : de la source matérielle jusqu'à la sortie encodée. Sources audio et vidéo, encodeurs matériels, sorties fichier ou streaming, metering temps réel, découverte de périphériques, gestion des permissions — le tout dans une API unifiée.

  • 9 sources audioMicrophoneSource, SystemAudioSource, LineInSource, BluetoothAudioSource, AggregateAudioSource, FileAudioSource, VoIPAudioSource, ToneSource (générateur programmable), SilenceSource

  • 10 sources vidéoCameraSource, ExternalCameraSource, ScreenCaptureSource (ScreenCaptureKit + ReplayKit + Broadcast Extension), CinematicCameraSource, SpatialCameraSource (MV-HEVC visionOS), MultiCameraSource, FileVideoSource, TestPatternSource, BlackSource, ColorSource

  • 6 codecs audio — AAC (LC/HE v1/HE v2/ELD/xHE), ALAC, Opus, FLAC, MP3, PCM — avec accélération matérielle AudioToolbox

  • 6 codecs vidéo — H.264, HEVC, ProRes, AV1, MV-HEVC, JPEG — avec accélération matérielle VideoToolbox

  • 8 sortiesFileOutput (MP4, MOV, M4A, CAF, WAV, AIFF, FLAC avec rotation), CallbackOutput, PixelBufferOutput, SampleBufferOutput, PreviewOutput, AudioPreviewOutput, TeeOutput (duplication), NullOutput

  • Streaming transport-agnosticStreamingPipeline avec modes audioOnly, videoOnly et muxed, protocole StreamingTransport pour brancher RTMP, HLS, SRT, Icecast ou tout autre transport

  • Metering temps réelAudioMeter avec peak/RMS, loudness EBU R128 (momentary, short-term, integrated), true peak, waveform data pour visualisation

  • 25+ presets — Twitch, YouTube, Facebook, Instagram, TikTok, podcast, radio, broadcast, screen recording, spatial video, archive, ProRes, Dolby Atmos

  • Découverte de périphériquesDeviceDiscovery avec monitoring AsyncStream des connexions/déconnexions audio et vidéo

  • Gestion des permissionsPermissionManager unifié pour microphone, caméra, screen recording avec vues SwiftUI intégrées

  • Contrôle dynamique — Hot-swap de sources, ajustement de bitrate, forçage de keyframe, pause/resume pendant la capture

  • Swift 6.2 strict concurrency — Actors pour tous les types stateful, Sendable partout, async/await de bout en bout, zéro Combine, zéro dépendance

Quick start

Enregistrer le microphone en AAC vers un fichier M4A :

Installation

Via Swift Package Manager, en ajoutant la dépendance dans votre Package.swift :

Puis dans le target concerné :

Plateformes supportées

PlateformeVersion minimumParticularités

macOS

14+

ScreenCaptureKit, aggregate devices, system audio, caméras externes USB/Thunderbolt

iOS / iPadOS

17+

ReplayKit, Broadcast Extension, caméras USB-C

visionOS

1+

Vidéo spatiale MV-HEVC, SpatialCameraSource

L'architecture Source → Encoder → Output

CaptureKit s'organise autour de trois protocoles fondamentaux qui se composent librement. Chaque source produit un AsyncStream de buffers bruts, chaque encodeur transforme ces buffers en données compressées, et chaque sortie consomme les données encodées. Le CaptureSession orchestre le tout.

TypeRôle

CaptureSession

Orchestrateur principal (actor) — sources, encodeurs, sorties, état, événements, statistiques

AudioSource / VideoSource

Protocoles de capture — 9 implémentations audio, 10 vidéo

AudioEncoderProtocol / VideoEncoderProtocol

Protocoles d'encodage — 7 codecs audio, 6 codecs vidéo

CaptureOutput

Protocole de sortie — 8 implémentations (file, callback, preview, tee, null…)

StreamingPipeline

Pipeline unifié capture → encode → envoi (actor)

StreamingTransport

Protocole transport-agnostic pour le streaming live

AudioMeter

Metering temps réel peak/RMS/loudness (actor)

DeviceDiscovery

Monitoring des périphériques audio/vidéo (actor)

PermissionManager

Gestion unifiée des permissions (actor)

Capture audio

Neuf sources audio couvrent tous les cas d'usage — du microphone intégré au générateur de tonalité. Chaque source se configure avec un AudioSourceConfiguration et produit un AsyncStream<AudioBuffer>. Le MicrophoneSource expose notamment le contrôle de gain automatique, l'annulation d'écho, la suppression de bruit et l'isolation vocale.

L'AudioSourceConfiguration fournit des presets prêts à l'emploi :

PresetSample RateCanauxBit DepthUsage

.default

48 kHz

2

Float32

Usage général

.broadcast

48 kHz

2

Float32

Broadcast (buffer 10ms)

.highResolution

96 kHz

2

Float32

Hi-Res audio

.voiceChat

16 kHz

1

Float32

VoIP / chat vocal

.spatialAudio

48 kHz

2

Float32

Audio spatial

Capture vidéo

Le CameraSource gère les caméras intégrées et externes avec contrôle complet — zoom, torche, mode de mise au point, exposition, balance des blancs, stabilisation, données de profondeur, et capture photo pendant l'enregistrement.

Les presets de configuration vidéo :

PresetRésolutionFPSParticularités

.default

1080p

30

SDR, BT.709

.broadcast720p

720p

30

Stabilisation standard

.broadcast1080p60

1080p

60

Broadcast full HD

.pro4K

UHD 4K

30

HDR10, BT.2020

.cinematic

1080p

24

Display P3, stabilisation cinématique

.spatialVideo

spatial

30

MV-HEVC visionOS

Capture d'écran

ScreenCaptureSource unifie trois backends sous une même API. Sur macOS, ScreenCaptureKit offre la capture d'écran, de fenêtre, d'application ou de région. Sur iOS, ReplayKit capture l'app en cours, tandis que Broadcast Extension permet la capture système complète via un App Group.

Encodage matériel

CaptureKit expose 12 codecs — 6 audio et 6 vidéo — chacun implémenté comme un actor avec des presets de configuration. Les encodeurs vidéo utilisent VideoToolbox pour l'accélération matérielle, les encodeurs audio passent par AudioToolbox.

CodecTypePresets

AAC (LC/HE v1/HE v2/ELD/xHE)

Audio

.voice (64k mono), .podcast (128k stereo), .musicHQ (256k VBR), .streamingLowBandwidth (HE 64k), .lowLatency (ELD 32k)

ALAC

Audio

Lossless Apple

Opus

Audio

Codec interactif

FLAC

Audio

Lossless libre

MP3

Audio

.standard (192k), .highQuality (320k), .webRadio (128k Icecast)

PCM / WAV

Audio

Non compressé

H.264

Vidéo

.streaming720p (Main 2.5Mbps), .streaming1080p (High 4.5Mbps), .lowLatency (Baseline CAVLC), .archive (High 20Mbps)

HEVC

Vidéo

Main, Main 10 — HDR support

ProRes

Vidéo

Proxy, LT, Standard, HQ, 4444, 4444 XQ

AV1

Vidéo

Profile 0, 1, 2

MV-HEVC

Vidéo

Vidéo spatiale visionOS

JPEG

Vidéo

Capture d'images fixes

Enregistrement fichier

Le FileOutput enregistre vers 7 formats de conteneur avec support de la rotation automatique par durée et/ou taille. Les métadonnées (titre, artiste, album) sont embarquées dans le fichier.

Streaming live

Le StreamingPipeline est la pièce maîtresse pour le live. Il orchestre la capture, l'encodage et l'envoi dans un pipeline unifié. Trois modes de fonctionnement — audio seul, vidéo seule, ou muxé audio+vidéo. En mode muxé, le pipeline attend la première keyframe vidéo, extrait les parameter sets (SPS/PPS pour H.264, VPS/SPS/PPS pour HEVC), les envoie via sendConfiguration, puis démarre le flux interleaved audio+vidéo avec une horloge monotone partagée.

Le protocole StreamingTransport est volontairement minimal — quatre méthodes à implémenter :

Les implémentations concrètes — bridges RTMP, HLS, SRT, Icecast — vivent dans l'app consommatrice, ce qui maintient CaptureKit transport-agnostic. L'app de démo inclut des bridges fonctionnels pour les quatre protocoles de l'écosystème Atelier Socle.

Intégration RTMP

Un bridge RTMP connecte CaptureKit à RTMPKit pour diffuser sur Twitch, YouTube, Facebook et les autres plateformes RTMP :

Intégration Icecast

Pour le streaming audio vers Icecast/SHOUTcast, le bridge IcecastKit envoie de l'AAC ou du MP3 en mode audioOnly :

Metering audio

L'AudioMeter fournit des niveaux audio en temps réel avec cinq modes d'analyse et des données de waveform pour la visualisation. Il accepte des buffers provenant de n'importe quelle source et expose deux AsyncStream — un pour les niveaux, un pour les waveforms.

PresetModeWaveformUsage

.broadcast

.full

Diffusion professionnelle

.podcast

.peakAndRMS

Enregistrement podcast

.loudnessCompliance

.loudness

Conformité EBU R128

.voiceMessage

.peak

.message

Messages vocaux

.dawEditing

.full

.dawHighRes

Édition audio DAW

Presets de capture

25 presets couvrent les cas d'usage courants, des plateformes de streaming aux workflows professionnels. Chaque preset configure automatiquement le codec, le bitrate, la résolution et le frame rate.

CatégoriePresetsDétails

Streaming

twitch(), youtube(), facebook(), instagram(), tiktok()

H.264 + AAC, résolution/FPS personnalisables

Podcast

podcastAudio(), podcastAudioHQ(), podcastVideo(), podcastLossless()

Audio AAC 128k ou ALAC lossless

Radio

radioLive(), webRadioMP3(), webRadioOpus()

AAC, MP3 ou Opus pour webradio

Broadcast

broadcastHD(), broadcast4K(), proResRecording()

HEVC 1080p, UHD 4K, ProRes HQ

Spatial

spatialVideo(), dolbyAtmos()

MV-HEVC visionOS, audio immersif

Screen Recording

screenRecording(), screenRecording4K(), screenRecordingRetina()

Capture d'écran optimisée

Low Bandwidth

lowBandwidth(), voiceOnly()

Connexions limitées

Archive

archiveLossless(), archive4K()

Archivage haute qualité

Découverte de périphériques

Le DeviceDiscovery surveille les connexions et déconnexions de périphériques audio et vidéo en temps réel via un AsyncStream<DeviceChangeEvent>. Chaque périphérique expose ses capacités, son type de connexion et ses formats supportés.

Gestion des permissions

Le PermissionManager unifie la vérification et la demande de permissions pour 6 types de ressources. Les changements de statut sont exposés via un AsyncStream<PermissionChange> :

Contrôle dynamique de la session

Pendant la capture, la session permet de changer de source à chaud, d'ajuster les bitrates, de forcer des keyframes et de surveiller 17 types d'événements — du changement d'état aux frames perdues en passant par la qualité du transport.

Vidéo spatiale visionOS

Sur visionOS, le SpatialCameraSource capture en MV-HEVC (Multiview HEVC) pour produire de la vidéo spatiale stéréoscopique, visualisable nativement dans Apple Vision Pro. Le MVHEVCEncoder gère l'encodage avec les layouts appropriés.

Architecture

La bibliothèque est organisée en modules clairement séparés, chacun avec une responsabilité bien définie :

Tests

La suite de tests couvre l'ensemble de la bibliothèque avec des tests unitaires, d'intégration, end-to-end et showcase. Les tests showcase illustrent les patterns d'utilisation recommandés.

MétriqueValeur

Tests

1 763

Fichiers de test

219

Tests Showcase

8 suites (audio, vidéo, encodage, sorties, streaming, presets, formats, erreurs)

Tests E2E

2 suites (audio pipeline, streaming pipeline)

Tests d'intégration

6 suites (lifecycle, routing, contrôle dynamique, événements)

CI/CD

GitHub Actions + CodeCov

Documentation

La documentation DocC couvre 17 guides :

GuideContenu

Getting Started

Premier projet avec CaptureKit

Audio Capture

Sources audio, configuration, formats

Video Capture

Sources vidéo, caméras, presets

Screen Capture

ScreenCaptureKit, ReplayKit, Broadcast Extension

Encoding

Codecs audio/vidéo, configuration, presets

Outputs Guide

FileOutput, rotation, callbacks, preview

Streaming Guide

StreamingPipeline, modes, transport

Streaming Integration

Bridges RTMP, HLS, SRT, Icecast

Metering

AudioMeter, peak/RMS, loudness EBU R128, waveforms

Device Discovery

Monitoring des périphériques

Permissions Guide

PermissionManager, vues SwiftUI

Formats Guide

SampleRate, ChannelLayout, VideoResolution, FrameRate

Presets Guide

25+ presets par catégorie

Error Handling

CaptureError, 26 cas d'erreur typés

Platform Compatibility

Différences macOS/iOS/visionOS

Testing Guide

Mocks, patterns de test

CaptureKit

Vue d'ensemble de l'architecture

Sous le capot

MétriqueValeur

Fichiers Swift (Sources)

213

Types publics

196

Protocoles

20+

Actors

40+

Sources audio

9

Sources vidéo

10

Codecs audio

6

Codecs vidéo

6

Sorties

8

Formats conteneur

7

Presets de capture

25+

Guides DocC

17

Tests

1 763

Dépendances runtime

0

Écosystème

CaptureKit est la brique de capture de l'écosystème streaming d'Atelier Socle. Elle s'intègre avec les quatre bibliothèques de transport via le protocole StreamingTransport :

  • HLSKit — HTTP Live Streaming, manifest M3U8, packaging fMP4, vidéo spatiale

  • RTMPKit — Client et serveur RTMP, Enhanced RTMP v2, 10 plateformes

  • SRTKit — Transport SRT en Swift pur, chiffrement AES, FEC, bonding

  • IcecastKit — Client Icecast/SHOUTcast, bitrate adaptatif, multi-destination

  • CaptureKit (cette bibliothèque) — Capture média unifiée

Liens

GitHub - atelier-socle/swift-capture-kit: Unified media capture, encoding & streaming for Apple platforms — every source, every codec, zero dependencies. Pure Swift 6.2.

GitHub - atelier-socle/swift-capture-kit: Unified media capture, encoding & streaming for Apple platforms — every source, every codec, zero dependencies. Pure Swift 6.2.

Unified media capture, encoding & streaming for Apple platforms — every source, every codec, zero dependencies. Pure Swift 6.2. - atelier-socle/swift-…

GitHub