A native macOS desktop app to inspect, remux and transcode media files, powered by FFmpeg/FFprobe.
StreamMuxer offers FFmpeg's power through a native UI, without requiring the user to write FFmpeg commands:
- Drag and drop one or more files (
.mkv,.mp4,.mov) - Inspect all streams grouped by source file
- Per-stream decision: Copy / Transcode / Discard
- Quality-oriented video transcoding (H.264 / HEVC / AV1, software or VideoToolbox hardware)
- Audio transcoding (AAC, Opus, AC-3, E-AC-3, FLAC, ALAC — whatever the local build supports)
- Keep output ordering as: video -> audio -> subtitles -> other
- Native SwiftUI macOS app (
macOS 13+) - FFmpeg/FFprobe detection with startup environment check (version + encoder scan)
- Dynamic encoder detection: only codecs actually available in the local FFmpeg build are offered (including
h264_videotoolbox/hevc_videotoolbox) - Stream probing with
ffprobe(JSON), including container info, chapters and default/forced disposition - Per-stream copy/transcode/discard with quality-based controls (Higher quality / Balanced / Smaller file) and encoder speed presets
- Container compatibility validation (e.g. PGS subtitles into MP4 are rejected; text subtitles auto-convert to
mov_text) - MKV / MP4 / MOV output
- FFmpeg command preview (transparency/debugging) — execution always uses structured
Processarguments, never a shell string - Structured progress via
-progress pipe:1: percentage, processed time, speed, fps and ETA - Cancellation of a running export (partial output is cleaned up)
- Full FFmpeg log accessible from the UI ("Show FFmpeg Log")
- Per-row expandable stream details (bitrate, profile/level, color metadata, SAR/DAR, refs, B-frames, and more)
- Default output suggestion based on source file:
- same folder
<original_name>_conf.<selected_extension>
- macOS 13+
ffprobeandffmpegavailable either:- embedded in app bundle, or
- installed in system (Homebrew supported)
The app checks common Homebrew paths automatically (/opt/homebrew/bin, /usr/local/bin, etc).
cd StreamMuxer
swift build
swift run StreamMuxerYou can also open the folder in Xcode and run the StreamMuxer target.
To build a double-clickable StreamMuxer.app:
scripts/make-app.sh
open dist/StreamMuxer.appSee Setup and Distribution for details (including embedding ffmpeg in the bundle).
- Add files via drag-and-drop or the file picker.
- Wait for stream analysis to complete. All streams default to Copy (nothing is modified unless you say so).
- Set each stream to Copy, Transcode (choose codec, encoder and quality) or Discard.
- Pick the output container (MKV/MP4/MOV) and review the output path (auto-suggested, editable).
- Optionally inspect the generated FFmpeg command.
- Export — watch progress/speed/ETA, cancel anytime.
During export, selected streams are always reordered before muxing:
- Video streams
- Audio streams
- Subtitle streams
- Other streams
This guarantees deterministic output stream layout.
To distribute StreamMuxer without external runtime dependencies:
- Provide
ffmpegandffprobebinaries. - Embed them in app resources (for example under
Resources/bin). - Ensure they are copied to the final
.appbundle during build.
If not embedded, the app falls back to system paths.
StreamMuxer/
Sources/StreamMuxer/
App/ # app entry + main views/view model
Models/ # media file/stream models, capabilities, per-stream settings, export session
Services/ # ffprobe/ffmpeg integration: locator, capability scanner, command builder, runner
Views/ # UI components
Resources/ # runtime resources
Additional technical docs:
No license file has been added yet. Add one before public/commercial redistribution.
