- built-in muxing support with timeline offset handling
- screen recording
- camera recording
- composed screen + camera recording
- microphone recording
- optional system-audio capture
- separate or mixed audio tracks
- gain controls for microphone and system audio
- configurable final output path
- configurable workspace root for intermediate recording files
- fixed-duration recording with
--duration - live recording for
record,camera, andcomposewhen--durationis omitted - device listing for displays, cameras, and audio inputs
List available displays, cameras, and audio inputs:
capturer devicesRecord the main display and microphone until stopped:
capturer record \
--audio ext-in \
--output ~/Desktop/recording.movRecord a 30-second screen clip:
capturer record \
--audio ext-in \
--duration 30 \
--output ~/Desktop/recording.movRecord at 4K / 50 fps:
capturer record \
--audio ext-in \
--width 3840 \
--height 2160 \
--fps 50 \
--quality standard \
--output /tmp/4k.movUse an explicit bitrate instead of a quality preset:
capturer record \
--audio ext-in \
--width 3840 \
--height 2160 \
--fps 50 \
--bitrate 45000000 \
--output /tmp/high-bitrate.movUse a named input device:
capturer record \
--audio "Built-in Microphone" \
--duration 10 \
--output /tmp/builtin-mic.movChoose a final output path and a separate workspace root:
capturer record \
--audio ext-in \
--duration 30 \
--output ~/Movies/Capture/final-recording.mov \
--workdir /Volumes/FastScratch/Capture--output is the final exported recording.
--workdir is only for intermediate files such as temporary screen video, microphone audio, system audio, composed video, and retained partial files after a failed export.
Use CAPTURE_WORKDIR as the default workspace root:
CAPTURE_WORKDIR=/Volumes/FastScratch/Capture \
capturer record \
--audio ext-in \
--duration 30 \
--output ~/Movies/Capture/recording.movA command-line --workdir takes precedence over CAPTURE_WORKDIR.
Record screen, microphone, and system audio as separate audio tracks:
capturer record \
--audio ext-in \
--system-audio \
--audio-layout separate \
--output /tmp/separate-audio.movseparate is the cheapest path: passthrough muxing, with no audio render pass.
Record screen, microphone, and system audio mixed into one audio track:
capturer record \
--audio ext-in \
--system-audio \
--audio-layout mixed \
--mic-gain 1.0 \
--system-gain 0.35 \
--output /tmp/mixed-audio.movmixed renders microphone and system audio into one track before muxing.
Lower the system audio relative to the microphone:
capturer record \
--audio ext-in \
--system-audio \
--system-gain 0.35 \
--output /tmp/balanced-audio.movRaise the mic audio while lowering system audio:
capturer record \
--audio ext-in \
--system-audio \
--system-gain 0.35 \
--mic-gain 1.5 \
--output /tmp/balanced-audio.movDo not pass a non-default --system-gain without --system-audio:
capturer record \
--audio ext-in \
--system-gain 0.35 \
--output /tmp/invalid.movThat fails early with:
Cannot use --system-gain without --system-audio. Add --system-audio or remove --system-gain.
Record camera and microphone until stopped:
capturer camera \
--camera "Studio Display Camera" \
--audio ext-in \
--output ~/Desktop/camera.movRecord a fixed-duration camera clip:
capturer camera \
--camera "Studio Display Camera" \
--audio ext-in \
--duration 10 \
--fps 30 \
--quality standard \
--mic-gain 1.5 \
--output ~/Desktop/camera.movRecord camera with a dedicated workspace root:
capturer camera \
--camera "Studio Display Camera" \
--audio ext-in \
--duration 10 \
--output ~/Desktop/camera.mov \
--workdir /Volumes/FastScratch/CaptureCompose screen and camera with the camera overlaid in the bottom-right corner:
capturer compose \
--camera "Studio Display Camera" \
--audio ext-in \
--layout overlay \
--overlay-source camera \
--overlay-width 0.24 \
--overlay-x right \
--overlay-y bottom \
--overlay-margin 32 \
--output ~/Desktop/composed-overlay.movCompose a fixed-duration overlay recording with system audio:
capturer compose \
--camera "Studio Display Camera" \
--audio ext-in \
--layout overlay \
--overlay-source camera \
--overlay-width 0.24 \
--overlay-x right \
--overlay-y bottom \
--system-audio \
--audio-layout mixed \
--mic-gain 2.0 \
--system-gain 0.30 \
--duration 30 \
--output ~/Desktop/composed-overlay.movCompose screen and camera side by side:
capturer compose \
--camera "Studio Display Camera" \
--audio ext-in \
--layout side-by-side \
--gap 24 \
--duration 30 \
--output ~/Desktop/side-by-side.movUse the screen as the overlay source on top of the camera:
capturer compose \
--camera "Studio Display Camera" \
--audio ext-in \
--layout overlay \
--overlay-source screen \
--overlay-width 0.30 \
--overlay-x right \
--overlay-y top \
--duration 30 \
--output ~/Desktop/camera-with-screen-overlay.movCompose with an explicit workspace root:
capturer compose \
--camera "Studio Display Camera" \
--audio ext-in \
--layout overlay \
--overlay-width 0.24 \
--overlay-x right \
--overlay-y bottom \
--system-audio \
--system-gain 0.30 \
--mic-gain 2.0 \
--duration 30 \
--output ~/Desktop/composed-overlay.mov \
--workdir /Volumes/FastScratch/CaptureUse continuity camera, and a vocal chain:
capturer compose \
--camera "levi-iphone-16-pro Camera" \
--audio ext-in \
--layout overlay \
--overlay-width 0.24 \
--overlay-x right \
--overlay-y bottom \
--system-audio \
--system-gain 0.50 \
--output ~/main/rec/vid/test.mov \
--workdir ~/main/rec/vid \
--mic-chain voiceRecord video only:
capturer video \
--duration 10 \
--width 1920 \
--height 1080 \
--fps 30 \
--quality standard \
--output /tmp/video-only.movTest microphone capture only:
capturer audio \
--audio ext-in \
--duration 5 \
--sample-rate 48000 \
--channel 1 \
--output /tmp/ext-in.wavTrigger the retained-partial-recording failure path:
capturer test failCapture all sources individually:
capturer sources \
--screen \
--camera "FaceTime HD Camera" \
--camera "levi-iphone-16-pro Camera" \
--audio "MG-XU" \
--sample-rate 44100 \
--channel 2 \
--align-start \
--output /tmp/video-01 \I tried doing this with ffmpeg, but it caused audio underruns I could not and do not want to resolve. This is a light implementation over native macOS APIs.
- multi-input support for audio and screens
- [-] multi-output rendering, summing, gain, and routing
- proper alignment of sources
- prepending sine wave in recording and video flicker for synchronization
- live input gain modification
- live metering
- loss-less failure behavior for partial recording files
- workspace/tempdir override
- recording failure as system notifications
- [-] make ins, outs, sinks reusable components
- overwrite-confirmation, explicit --overwrite flag for override of overwrite-confirmatio step
- fix continuity camera latent failures
- refactor to reduce duplications