CaptureKit
Publié le · 21 min
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 audio —
MicrophoneSource,SystemAudioSource,LineInSource,BluetoothAudioSource,AggregateAudioSource,FileAudioSource,VoIPAudioSource,ToneSource(générateur programmable),SilenceSource10 sources vidéo —
CameraSource,ExternalCameraSource,ScreenCaptureSource(ScreenCaptureKit + ReplayKit + Broadcast Extension),CinematicCameraSource,SpatialCameraSource(MV-HEVC visionOS),MultiCameraSource,FileVideoSource,TestPatternSource,BlackSource,ColorSource6 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 sorties —
FileOutput(MP4, MOV, M4A, CAF, WAV, AIFF, FLAC avec rotation),CallbackOutput,PixelBufferOutput,SampleBufferOutput,PreviewOutput,AudioPreviewOutput,TeeOutput(duplication),NullOutputStreaming transport-agnostic —
StreamingPipelineavec modesaudioOnly,videoOnlyetmuxed, protocoleStreamingTransportpour brancher RTMP, HLS, SRT, Icecast ou tout autre transportMetering temps réel —
AudioMeteravec peak/RMS, loudness EBU R128 (momentary, short-term, integrated), true peak, waveform data pour visualisation25+ presets — Twitch, YouTube, Facebook, Instagram, TikTok, podcast, radio, broadcast, screen recording, spatial video, archive, ProRes, Dolby Atmos
Découverte de périphériques —
DeviceDiscoveryavec monitoring AsyncStream des connexions/déconnexions audio et vidéoGestion des permissions —
PermissionManagerunifié pour microphone, caméra, screen recording avec vues SwiftUI intégréesContrô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,
Sendablepartout,async/awaitde 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
| Plateforme | Version minimum | Particularité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.
| Type | Rôle |
|---|---|
| Orchestrateur principal (actor) — sources, encodeurs, sorties, état, événements, statistiques |
| Protocoles de capture — 9 implémentations audio, 10 vidéo |
| Protocoles d'encodage — 7 codecs audio, 6 codecs vidéo |
| Protocole de sortie — 8 implémentations (file, callback, preview, tee, null…) |
| Pipeline unifié capture → encode → envoi (actor) |
| Protocole transport-agnostic pour le streaming live |
| Metering temps réel peak/RMS/loudness (actor) |
| Monitoring des périphériques audio/vidéo (actor) |
| 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 :
| Preset | Sample Rate | Canaux | Bit Depth | Usage |
|---|---|---|---|---|
| 48 kHz | 2 | Float32 | Usage général |
| 48 kHz | 2 | Float32 | Broadcast (buffer 10ms) |
| 96 kHz | 2 | Float32 | Hi-Res audio |
| 16 kHz | 1 | Float32 | VoIP / chat vocal |
| 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 :
| Preset | Résolution | FPS | Particularités |
|---|---|---|---|
| 1080p | 30 | SDR, BT.709 |
| 720p | 30 | Stabilisation standard |
| 1080p | 60 | Broadcast full HD |
| UHD 4K | 30 | HDR10, BT.2020 |
| 1080p | 24 | Display P3, stabilisation cinématique |
| 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.
| Codec | Type | Presets |
|---|---|---|
AAC (LC/HE v1/HE v2/ELD/xHE) | Audio |
|
ALAC | Audio | Lossless Apple |
Opus | Audio | Codec interactif |
FLAC | Audio | Lossless libre |
MP3 | Audio |
|
PCM / WAV | Audio | Non compressé |
H.264 | Vidéo |
|
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.
| Preset | Mode | Waveform | Usage |
|---|---|---|---|
|
| — | Diffusion professionnelle |
|
| — | Enregistrement podcast |
|
| — | Conformité EBU R128 |
|
|
| Messages vocaux |
|
|
| É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égorie | Presets | Détails |
|---|---|---|
Streaming |
| H.264 + AAC, résolution/FPS personnalisables |
Podcast |
| Audio AAC 128k ou ALAC lossless |
Radio |
| AAC, MP3 ou Opus pour webradio |
Broadcast |
| HEVC 1080p, UHD 4K, ProRes HQ |
Spatial |
| MV-HEVC visionOS, audio immersif |
Screen Recording |
| Capture d'écran optimisée |
Low Bandwidth |
| Connexions limitées |
Archive |
| 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étrique | Valeur |
|---|---|
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 :
| Guide | Contenu |
|---|---|
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étrique | Valeur |
|---|---|
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.
Unified media capture, encoding & streaming for Apple platforms — every source, every codec, zero dependencies. Pure Swift 6.2. - atelier-socle/swift-…