Skip to content

Instantly share code, notes, and snippets.

@colbyn
Created June 24, 2025 16:30
Show Gist options
  • Select an option

  • Save colbyn/a330f615615c1bbf2957feb15cb51479 to your computer and use it in GitHub Desktop.

Select an option

Save colbyn/a330f615615c1bbf2957feb15cb51479 to your computer and use it in GitHub Desktop.
FFMPEG Video Recording Automation Scripts — 2025-6-24
#!/usr/bin/env bash
set -euo pipefail
# ffmpeg -encoders | grep -E 'hevc_videotoolbox|aac_at'
ffmpeg -encoders | grep -E 'hevc_videotoolbox|aac_at'
#!/usr/bin/env bash
set -euo pipefail
ffmpeg -f avfoundation -list_devices true -i ""
#!/usr/bin/env bash
set -euo pipefail
# ── Device indices ───────────────────────────────────────────────
SCREEN_IDX="2:none" # Capture screen 0
WEBCAM_IDX="0" # FaceTime HD Camera (Built-in)
INT_MIC_IDX=":1" # MacBook Pro Microphone
OUT="master_$(date +%Y-%m-%d_%H-%M-%S).mkv"
ffmpeg \
-capture_cursor 1 -capture_mouse_clicks 1 \
-f avfoundation -framerate 30 -video_size 1920x1080 -i "$SCREEN_IDX" \
-f avfoundation -framerate 30 -i "$WEBCAM_IDX" \
-f avfoundation -i "$INT_MIC_IDX" \
\
# ── Video streams ──────────────────────────────────────────────
-map 0:v -c:v:0 hevc_videotoolbox -pix_fmt yuv420p10le -b:v:0 20M \
-metadata:s:v:0 title="Screen Capture" \
-map 1:v -c:v:1 hevc_videotoolbox -pix_fmt yuv420p10le -b:v:1 8M \
-metadata:s:v:1 title="Webcam (FaceTime HD)" \
\
# ── Audio stream ───────────────────────────────────────────────
-map 2:a -c:a:0 aac_at -b:a:0 256k \
-metadata:s:a:0 title="MacBook Pro Microphone" \
\
# ── Container ─────────────────────────────────────────────────
-metadata title="Pilot Recording $(date +%Y-%m-%d)" \
-f matroska "$OUT"
@colbyn
Copy link
Author

colbyn commented Jun 24, 2025

Workflow:

Example:

➜  YouTubeProjects ./check-hardware.sh
ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers
  built with Apple clang version 16.0.0 (clang-1600.0.26.6)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/7.1.1_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox
  libavutil      59. 39.100 / 59. 39.100
  libavcodec     61. 19.101 / 61. 19.101
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample   5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
 V....D hevc_videotoolbox    VideoToolbox H.265 Encoder (codec hevc)
 A..... aac_at               aac (AudioToolbox) (codec aac)
➜  YouTubeProjects ./list-capture-devices.sh
ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers
  built with Apple clang version 16.0.0 (clang-1600.0.26.6)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/7.1.1_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox
  libavutil      59. 39.100 / 59. 39.100
  libavcodec     61. 19.101 / 61. 19.101
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample   5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
2025-06-24 10:34:41.696 ffmpeg[32874:1284932] WARNING: Add NSCameraUseContinuityCameraDeviceType to your Info.plist to use AVCaptureDeviceTypeContinuityCamera.
2025-06-24 10:34:41.891 ffmpeg[32874:1284932] WARNING: AVCaptureDeviceTypeExternal is deprecated for Continuity Cameras. Please use AVCaptureDeviceTypeContinuityCamera and add NSCameraUseContinuityCameraDeviceType to your Info.plist.
[AVFoundation indev @ 0x7f8490104940] AVFoundation video devices:
[AVFoundation indev @ 0x7f8490104940] [0] FaceTime HD Camera (Built-in)
[AVFoundation indev @ 0x7f8490104940] [1] Phone Camera
[AVFoundation indev @ 0x7f8490104940] [2] Capture screen 0
[AVFoundation indev @ 0x7f8490104940] AVFoundation audio devices:
[AVFoundation indev @ 0x7f8490104940] [0] Microsoft Teams Audio
[AVFoundation indev @ 0x7f8490104940] [1] MacBook Pro Microphone
[AVFoundation indev @ 0x7f8490104940] [2] Phone Microphone
[in#0 @ 0x7f8490104340] Error opening input: Input/output error
Error opening input file .
Error opening input files: Input/output error

Therefore my options are:

[AVFoundation indev @ 0x7f8490104940] AVFoundation video devices:
[AVFoundation indev @ 0x7f8490104940] [0] FaceTime HD Camera (Built-in)
[AVFoundation indev @ 0x7f8490104940] [1] Phone Camera
[AVFoundation indev @ 0x7f8490104940] [2] Capture screen 0
[AVFoundation indev @ 0x7f8490104940] AVFoundation audio devices:
[AVFoundation indev @ 0x7f8490104940] [0] Microsoft Teams Audio
[AVFoundation indev @ 0x7f8490104940] [1] MacBook Pro Microphone
[AVFoundation indev @ 0x7f8490104940] [2] Phone Microphone

Notes:

  • The output format is matroska (.mkv) which works best for the master copy, this will store the original A/V streams. This allows you to then decide how to use such streams in post-processing without burning a predefined configuration into the master copy.
  • In real life settings, I will be muxing multiple audio streams into a single container from all available devices in case one is faulty (all my mics are terrible so I'll be capturing all audio from e.g. build-in device, external and headset mics and then I'll decide which one to use in post processing).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment