PrismCore
FFmpeg demuxuje, Apple přehrává.
Přehrávací stack Applu umí věci, na které žádný cizí přehrávač nedosáhne — hardwarové dekódování, průchod Dolby Atmos, Dolby Vision, Match Content. Jen prostě neotevře MKV. PrismCore remuxuje jakýkoli kontejner, který umí přečíst libavformat, do HLS-fMP4, servíruje ho z loopback serveru a obyčejnému AVPlayeru předá URL playlistu. Stejný soubor, engine od Applu.
Běží v
Aether
Výchozí přehrávací engine na iPhonu, iPadu, Macu, Apple TV i Apple Vision Pro — zapnutý pro každou instalaci, ne za přepínačem.
Je to Swift balíček, ne framework, který musíte stavět. Použije ho cokoli, co už dnes předává URL AVPlayeru.
Co se změní, když dáte přehrát
PrismCore má být neviditelný: otevřete film a on se přehraje. Získáváte přitom všechno to, čeho se přehrávač, který si kreslí vlastní obraz, musí vzdát.
Receiver dostane opravdový zvuk
Dolby Atmos odchází ze souboru jako bitstream a jako bitstream do receiveru i dorazí — nikde se nedekóduje, nikde se nezplošťuje. Receiver rozsvítí Atmos proto, že mu Atmos skutečně přišel, ne jeho stereo aproximace.
Televize opravdu naskočí do Dolby Vision
Na Apple TV se panel naprogramuje ještě před začátkem přehrávání — snímkování, dynamický rozsah, Dolby Vision — přesně tím handshakem, jaký dostávají aplikace od Applu. Televizi, která Dolby Vision master odmítne, se film nabídne znovu bez toho nároku, takže uvidíte obraz místo chybové hlášky.
Je to přehrávač, který znáte
Menu stop, titulky, Picture in Picture, AirPlay, Match Content, posouvání ovladačem: všechno je to nativní přehrávací rozhraní Applu, protože pod ním doopravdy jede přehrávač od Applu.
Chladné zařízení, nedotčená baterie
Obraz dekóduje vyhrazený video čip, ne procesor, takže MKV stojí stejně jako soubor, na který Apple dodává podporu. Nic se netranskóduje — ani ve vašem zařízení, ani na serveru, ze kterého soubor přišel.
Přeskakování zůstává okamžité
Mapa celého souboru se publikuje dřív, než se odešle první snímek, takže skok do půlky tříhodinového filmu prostě dopadne tam, kam má, a hraje — nepřipravuje film znovu od začátku. A při tahání za posuvník vidíte snímek, ke kterému míříte, i u souboru, pro který žádný server náhledy nikdy nevyrobil.
Nic neopouští vaše zařízení
Přebalení se děje v zařízení a přehrávači se servíruje přes 127.0.0.1 — loopback adresu, která se do sítě vůbec nedostane. Žádný krok v cloudu, žádný účet a nic o tom, co sledujete, co by se dalo někam poslat.
Ten trik, na jednom obrázku
MKV · MPEG-TS
Kontejner, který Apple neotevře
Rozklad
FFmpeg přečte stopy
HLS-fMP4
Znovu zabaleno na 127.0.0.1
AVPlayer
Přehrávač přímo od Applu
Obraz · Zvuk · Titulky
Soubor se čte, ne převádí
Demuxer z FFmpegu otevře kontejner — MKV, MPEG-TS, AVI — a rozdělí jeho obsah na jednotlivé stopy: obraz, každý jazyk zvuku, každé titulky. Nic se nedekóduje a nic nepřevádí; soubor se jen čte na části.
Stopy se beze změny znovu zabalí
Tentýž komprimovaný obraz a zvuk se vloží do fragmentovaných MP4 kousků, které popisuje playlist toho druhu, jaký AVPlayer nativně otevře. Mění se obal, ne obsah — bit po bitu stejné video a stejný zvuk, jaké byly v souboru.
Servíruje to lokální adresa
Ty kousky dostane AVPlayer ze 127.0.0.1, tedy z adresy, která nikdy neopustí zařízení, jako by se film streamoval. A v tom je celý trik: přehrávač od Applu rád streamuje to, co odmítá otevřít jako soubor.
Zbytek udělá engine Applu
Hardwarové dekódování, průchod Atmosu, handshake Dolby Vision, menu stop, PiP i AirPlay — nic z toho se nepíše znovu, protože z pohledu AVPlayeru se nedějí žádné zvláštnosti.
Dvě věci přebalit nejde a řeší se zvlášť. Titulky, které jsou obrázkem textu, a ne textem (PGS v blu-ray ripech), přečte přímo v zařízení OCR z Vision a přidají se jako obyčejné titulky. A hrstka kodeků, které Apple nedekóduje vůbec — VP9, MPEG-2, VC-1 — jde druhou cestou, kde obraz dekóduje a kreslí PrismCore sám; tam přicházíte o systémové rozhraní přehrávače, ale film hraje.
Na co se lidi ptají
Překódovává mi to soubory?
Ne. Obraz i zvuk se kopírují přesně tak, jak byly přečtené — mění se jenom krabice, ve které leží. A soubor se ani neupravuje: PrismCore z něj vždycky jen čte.
Tak proč AVPlayer neotevře MKV sám?
Apple dodává podporu pro pevný seznam kontejnerů a MKV v něm není — i když obraz a zvuk uvnitř jsou formáty, které Apple dekóduje naprosto bez problémů. Je to problém obalu, ne dekódování, a právě proto stačí k jeho vyřešení přebalení.
Co se stane se zvukem v TrueHD nebo DTS?
Ty stack Applu jako bitstream nebere, takže nemůžou projít netknuté. Místo aby je PrismCore srazil do sterea, převede je na EAC3 se všemi kanály na svých místech — surround zůstane surroundem. Jediné, co tuhle cestu nepřežije, je Atmos nesený v TrueHD; Atmos v EAC3, který má většina remuxů, projde beze změny.
Musí můj Plex nebo Jellyfin transkódovat?
Ne, a to je hodně velká část smyslu. Server pošle původní soubor a přebalení proběhne ve vašem zařízení, takže není žádný transkód na straně serveru, který by tavil NAS — a ani žádná kvalita, kterou by sebral.
Dá se to vypnout?
Ano — Nastavení ▸ Přehrávání v Aetheru. Zapnuté je to ve výchozím stavu; když to vypnete, přehrávání spadne zpátky na ostatní enginy přesně jako dřív, pro danou instalaci a bez jakékoli reinstalace nebo resetu.
Rozjíždí se to pomaleji?
Ne. Zdroj se otevírá jen jednou a čte se z něj jen hlavička, což jsou u lokálního souboru desítky milisekund a po síti přibližně desetina sekundy — „Připravuji“ tedy uvidíte asi tak dlouho jako u souboru, který Apple otevře přímo.
Všechno níž je o tom, jak engine dostat do vlastní aplikace. Pokud jste tu jako divák, celý příběh už znáte — zbytek je instalatérství.
Co všechno zvládne
Kontejnery a kodeky
Cokoli, co libavformat přečte — MKV, MPEG-TS, AVI. HEVC, H.264 i AV1 projdou stream copy rovnou, spolu s AAC, AC3, EAC3, FLAC a ALAC. TrueHD, DTS, Opus a zbytek jdou přes audio bridge a dorazí jako EAC3 místo toho, aby se zploštily. Anamorfní zdroj si udrží tvar, který hlásí jeho kontejner — v boxu pasp, na který AVPlayer dá.
Dolby Atmos, ne downmix
EAC3+JOC se kopíruje netknuté a nikdy se nedekóduje do PCM — a dec3 box, který FFmpeg při stream copy zahodí, se doplní zpátky: jediný signál, kvůli kterému AVFoundation zvolí Dolby cestu místo obyčejného DD+. Ověřeno na receiveru přes HDMI.
Dolby Vision a HDR
Profile 5 si nechá svůj dvh1 sample entry, Profile 7 se přes libdovi převede na jednovrstvý 8.1 a na tvOS se panel naprogramuje dřív, než AVPlayer playlist vůbec uvidí — handshake musí proběhnout první, jinak je varianta rovnou odmítnutá. Master, který televize odmítne, se zkusí znovu bez toho nároku, místo aby selhal.
Každá stopa i každé titulky
Z každé zvukové stopy je alternate rendition se svým názvem, jazykem i počtem kanálů, takže menu stop v AVKitu prostě funguje. Textové titulky se převedou na segmentované WebVTT, které přežije PiP i AirPlay; PGS a VOBSUB nesou jen bitmapy, takže je přečte OCR z Vision přímo v zařízení a přidají se jako obyčejné renditions — a než si o stopu přehrávač skutečně řekne, nedělá se s ní vůbec nic, takže remux s desítkami PGS stop nic nestojí.
Seek jako v lokálním souboru
Segmentová mapa zarovnaná na keyframy se publikuje dřív, než projde první paket, a seek mimo vyrobené okno demuxer na požádání překotví na správný keyframe. Cache s bajtovým rozpočtem omezuje disk, ne seekovatelnost — vyhozené segmenty se prostě vyrobí znovu a segment, který se právě servíruje, nikdy nepadne za oběť úklidu. Výroba se drží zhruba minutu před posledním segmentem, který si přehrávač opravdu stáhl, takže víc než gigabajtový soubor nikdy nezávodí s vlastní cache — a odběr ze zdroje se ustálí u skutečného datového toku filmu místo rychlosti linky. Kontejner bez vlastního indexu na tom nemusí zůstat: první sekvenční přehrání posbírá každý keyframe, který přečte, a mapu uloží, takže příští přehrání podle ní plánuje od první sekundy. Tatáž mapa odpovídá i SeekPreviewService, který z keyframu krytého danou pozicí udělá náhled pro vlastní posuvník hostitele.
Softwarová cesta pro zbytek
Kodeky, které AVPlayer nedekóduje vůbec — VP9, MPEG-2, VC-1 — jdou přes libavcodec do AVSampleBufferDisplayLayer, zero-copy všude, kde má VideoToolbox hardwarový dekodér. AV1 se ptá skutečného křemíku, ne jména čipu, a ověřeně prokládané zdroje opouštějí nativní cestu, aby si je vzal odkládač prokladu — na GPU, nad snímky, které dekodér už vyrobil, pokud je ten filtr v použitém FFmpegu.
Rychlý rozjezd
Přehrání dřív otevíralo zdroj dvakrát — jednou kvůli rozhodnutí hostitele o routování, jednou kvůli výrobě — a po síti je ten druhý open celá obrátka uvnitř čekání, na které uživatel kouká. Sonda teď svůj otevřený kontext předá session, každý open přečte jen to, co sebeopisný kontejner potřebuje, a interní čekání se kontrolují po 10 ms místo po 100. Remux 5,4 GB HEVC/EAC3 po HTTP dojde od sondy k playlistu za nějakých 135 ms místo 520 — a soubor bez seek indexu, který by se jinak scanoval minutu, se rozjede taky, na omezeném plánu.
Licence, která projde App Storem
LGPL-2.1-or-later s výjimkou pro distribuci v obchodě (Application Store Exception). Podepsaná aplikace nikomu nedovolí relinkovat se, takže čistá LGPL a App Store byly v rozporu; výjimka tenhle jediný požadavek pro buildy do obchodu ruší, zatímco změny v samotném PrismCore zůstávají pod LGPL a musí se zveřejnit. Veřejné API je stabilní od 1.0 — rozbíjející změna znamená major verzi a každé vydání je zapsané v changelogu.
Jak si stojí
Na platformách Apple se obvykle vybírá mezi přehrávačem, který si udrží to dobré, ale otevře jen kontejnery od Applu, a tím, který otevře všechno, ale kreslí si vlastní snímky a audio dekóduje do PCM — a přesně tam Atmos i Dolby Vision končí. PrismCore není přehrávač: krmí AVPlayer, takže se není čeho vzdávat.
| PrismCore | AVPlayer | VLCKit | libmpv | |
|---|---|---|---|---|
| Přehraje MKV, MPEG-TS, AVI | ||||
| Dolby Atmos projde jako bitstream | ||||
| Dolby Vision naskočí na displeji | ||||
| Match Content na tvOS — snímkování i rozsah | ||||
| Nativní přehrávač Applu: menu stop, PiP, AirPlay | ||||
| VP9, MPEG-2 a VC-1 |
VLCKit i libmpv kreslí do vlastní vrstvy a předají vám PCM, a proto jim prostřední řádky nevycházejí — je to důsledek toho, že si vlastní vykreslování, ne opomenutí. AVPlayeru nevychází první a poslední řádek, protože bere jen kontejnery, na které Apple dodává podporu.
Jak začít
Přidejte balíček a předejte mu URL. Jeden vstupní bod zdroj prozkoumá a vrátí buď playlist pro AVPlayer, nebo softwarovou pipeline, už nastartovanou.
.package(url: "https://github.com/Wenzlik/PrismCore.git", from: "1.8.7")switch try await PrismCoreEngine.open(url: mkvURL) {
case .remux(let session, let playlist):
player.replaceCurrentItem(with: AVPlayerItem(url: playlist))
…
await session.stop()
case .software(let pipeline):
hostView.layer.addSublayer(pipeline.displayLayer!)
pipeline.play()
}Až první přehrání funguje, vyplatí se znát dvě věci k zapnutí. Když session dáte adresář pro cache, kontejner, který vlastní index nemá, si ho při přehrávání posbírá sám — a příští přehrání seekuje jako indexovaný soubor. Tentýž adresář stojí i za náhledy pro posuvník: ty jsou vlastní malá pipeline — samostatný kontext, dekódování na CPU, cache po keyframech — takže nikdy nezdrží přehrávání, ke kterému patří, ať na scéně hraje kterýkoli engine.
let session = try PrismCoreSession(url: mkvURL, keyframeIndexCacheDirectory: caches)
let previews = SeekPreviewService(url: mkvURL, keyframeIndexCacheDirectory: caches)
let frame: CGImage = try await previews.thumbnail(at: 42 * 60)Minimální verze jsou iOS 16, tvOS 17, macOS 14 a visionOS 1. FFmpeg přichází přes dynamické xcframeworky MPVKitu, takže hostitel, který už MPVKit veze, nepřidává žádné nové binární závislosti. Pokud vám závislosti řeší CI, připíchněte přesnou verzi a držte s ní commitnutý Package.resolved v souladu — jinak vám build na zařízení a build v TestFlightu potichu jedou na jiném enginu.
Chcete si jen něco pustit?
To byla vývojářská polovina stránky. Pokud jste tu proto, abyste si pustili vlastní filmy a seriály, PrismCore svou práci odvádí uvnitř Aetheru — nikdy na něj nemusíte myslet.
Prohlédnout AetherPrismCore staví Václav Zmrhal · zmrhal.cz