OMP — Opportun Media Player
A local media player built on Avalonia and FFmpeg. Its headline
feature: route different audio tracks from the same file to different audio output devices
simultaneously — for example, main audio to your speakers and a commentary track to a headset,
playing at the same time.
opportunv.github.io/OpportunMediaPlayer
Source-available, not OSI open source: free for any noncommercial use, but not under a
license like MIT/GPL. See License below.
Screenshots
Features
- Multi-output audio routing — assign any audio track to any output device; the same track
can be sent to multiple devices at once, each with independent volume.
- Per-output and master volume, 0–200%, composed multiplicatively (each slider's feel stays
independent of the other). A quick per-output volume popup sits right on the main toolbar, next
to the full routing/delay controls in Options.
- Playback speed control — 0.5x–2x, YouTube-style presets, pitch-preserving (speeding up or
slowing down doesn't change pitch).
- Subtitles with positionable zones — assign subtitle tracks to on-screen zones you define
and style. Load an external subtitle file onto an already-open video from Options, on top of
whatever the file/URL itself provides.
- Open URL playback via yt-dlp — paste a page URL
(File → Open URL...) and OMP resolves and streams it. When a video exposes multiple audio dubs
or caption tracks, they show up as ordinary routable audio/subtitle tracks, same as a local
file's — including auto-generated captions, in the original language and (when different) the
app's own UI language.
- Light / dark / system theme, applied consistently across the main window, popups, and
dialogs.
- In-app keyboard shortcut reference (Help → Keyboard Shortcuts).
Keyboard shortcuts
| Keys | Action |
|---|
| Space | Play / pause |
| Left Arrow | Step back |
| Right Arrow | Step forward |
| Up Arrow | Increase volume |
| Down Arrow | Decrease volume |
| M | Toggle mute |
| F | Toggle fullscreen |
| C | Toggle subtitles |
| Esc | Exit fullscreen |
| Shift + , | Decrease playback speed |
| Shift + . | Increase playback speed |
Double-clicking the video also toggles fullscreen. The same shortcut list is available from
Help → Keyboard Shortcuts inside the app.
Platform support
- Windows x64 — fully supported, native FFmpeg libraries bundled.
- Linux x64 — native FFmpeg libraries bundled and CI builds/tests pass, but real-world testing
so far has only been on a single Ubuntu 22.04/24.04 VirtualBox VM — broader distro and desktop
environment coverage is unverified. If you try it on something else, a report via
Issues is welcome either way.
- macOS (Apple Silicon and Intel) — confirmed working on one Apple Silicon Mac so far — Intel
and broader macOS version coverage is still unverified. Unlike Windows/Linux, FFmpeg isn't
bundled; install it yourself first via Homebrew:
brew install ffmpeg@7. Try it and report back
via Issues, good or bad.
- Ships self-contained (bundles its own .NET 10 runtime) — no separate .NET install needed.
- URL playback is optional and needs yt-dlp installed
separately (
winget install yt-dlp.yt-dlp / brew install yt-dlp / pip install -U yt-dlp) —
OMP looks for it on your PATH by default, or you can point it at a specific executable from
Options. Not required for local files.
Limitations
These are current, code-level limits, not artificial restrictions — worth knowing before you rely
on OMP for a given file:
Video
- Only the first video track in a file is used; files with multiple video tracks (e.g. multi-angle)
can't switch between them.
- Decoding is software-only — no GPU-accelerated decode. Playback of very high-resolution or
high-bitrate video is limited by CPU decode speed.
- All video is converted to 8-bit BGRA for display regardless of source bit depth — no HDR or
10-bit-aware rendering.
- Frame buffers are sized once when a file opens; a stream that changes resolution mid-playback
is not handled.
Audio
- Every audio track is downmixed/converted to 16-bit stereo before playback — no surround-sound
passthrough and no output above 16-bit, regardless of the source format.
- A given output device can only be assigned to one route at a time (you can't send two different
tracks to the same speaker simultaneously), but the same track can fan out to multiple devices.
Subtitles
- Only text-based subtitle formats are supported: SRT, ASS, SSA, WebVTT, and MOV_TEXT. Bitmap-based
subtitles (PGS, VobSub/DVD, DVB, XSUB) are detected and listed, but can't be routed or rendered.
- Of ASS/SSA styling, only bold, italic, and line breaks are applied. Color, custom fonts,
position/movement, karaoke, and animation override tags are ignored. Embedded container fonts
are not used.
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗