Phosphene - Appleのビデオ壁紙をリバースエンジニアリングした macOS Tahoe 向けビデオ壁紙エンジン
(github.com/kageroumado)- Phosphene は、ユーザーが持つビデオファイルを macOS のデスクトップおよびロック画面の壁紙として再生する メニューバーアプリ + 壁紙拡張
- システムの標準壁紙セレクタに統合されており、追加したビデオは System Settings → Wallpaper で Apple 内蔵の Aerials と一緒に表示される
- Apple の非公開 WallpaperExtensionKit の上に構築されており、Apple Aerials と同じ方式で out-of-process 再生、アプリ終了後の維持、ロック画面・アイドル・スリープのライフサイクル連携を提供する
- MP4、MOV、AVFoundation が読み込めるファイルを取り込め、複数ディスプレイや Space ごとの壁紙選択は macOS が保存する
- ループ境界で PTS/DTS にオフセットを加えてフレーム単位でつなぎ合わせる方式により、flush や途切れのない gapless looping を実現する
PlaybackPolicyは、開閉状態、バッテリー残量、バッテリー/AC 電源、Game Mode、表示モード、ユーザーによる一時停止、遮蔽状態などを組み合わせて、full / reduced / minimal / pausedのいずれかで再生動作を決定する- すべてのディスプレイがウィンドウで完全に覆われるとレンダリングを停止し、デスクトップが再び見えるまで再生を一時停止する
- オプションで低解像度・低 fps の adaptive variants を事前生成でき、レンダラーがループ境界ごとに現在のポリシーを満たす最も低コストなバリアントへ切り替える
- Only on Lock Screen 設定では、ロック・ロック解除時に cubic curve で壁紙が自然に現れたり消えたりし、Apple Aerials の挙動に合わせている
- アプリ側は SwiftUI のメニューバーアプリで、ビデオライブラリ、ビデオごとのメタデータ、HEVC 最適化、環境設定、ライブラリ変更の Darwin notification を担当する
- 拡張側はシステムの
WallpaperAgent内で実行され、実行時にWallpaperExtensionKit.frameworkをロードし、AVSampleBufferDisplayLayerでリモートCAContextにフレームをレンダリングする AVPlayerLayerはリモートCAContext内で静かに失敗するため、VideoRendererはAVAssetReaderとAVSampleBufferDisplayLayerを直接駆動して単調増加するタイムラインを維持するWallpaperSnapshotXPCの swizzle とMirrorベースの XPC パースに依存しているため、Apple が非公開の型やフィールド名を変更すると、スナップショット・リクエスト処理側が壊れる可能性がある- 要件は macOS Tahoe 26.0+、Apple Silicon、Xcode 17+ で、
arm64-apple-macos26.0を対象に Swift 6 strict concurrency が有効化されている - ライセンスは MIT で、無保証で自由に利用できると明記されている
1件のコメント
Hacker Newsのコメント
とてもすっきりしている。最初は「動画スクリーンセーバーはダウンロードできるのに、なぜフレームを抜き出すんだ?」と混乱したが、コメントを見て、自分の動画をデスクトップとロック画面に使えるのだと理解した
要点を隠さず、何をどうできるのかがすぐ分かるタイトルのほうがずっと良い
Tahoeがかなり酷評されているのはある程度わかるが、動画壁紙と透明効果はWindows Vistaっぽくて面白いし、郷愁を誘う
さあVistaの滝の壁紙を設定して、本当に2007年気分を味わう時だ
どの滝のことを言っているのか気になる。Vistaにこんなに壁紙があったことにも驚いたし、覚えているのはデフォルトの緑のグラデーションっぽいものと、昔しばらく使っていた竹林くらいだ
これは本当にありがたい。スクリーンセーバー集を作っていたのだが、LegacyScreenSaverがあまりにも雑だった
誰かがAppleの非公開壁紙フレームワークを解明してくれればと思っていたが、本当にやってのけた
com.apple.wallpaperの拡張をWallpaperAgentがデスクトップ上で実行する構造だスクリーンセーバーについては別の投稿を見ればよく、そちらにはこれを回避する非公開スクリーンセーバーAPIのサンプルを載せてある。Appleは自社の「Aerials」で両方を使っていて、スクリーンセーバープレーヤーとデスクトッププレーヤーの間で位置を共有する同期システムを持っている
Appleで最高の動画壁紙はMacintoshだと思う。どう動いているのか気になる
日付と時刻がシステムの日付・時刻と秒単位まで一致する箇所がいくつもある
うわ、これは本当にすごい。非公開スクリーンセーバーの
.appexフレームワークをリバースエンジニアリングしてAerial 4で動かすことには成功していて、興味のある人向けに先週v4と一緒にサンプルプロジェクトとドキュメントを公開した: https://github.com/AerialScreensaver/AppexSaverMinimalWallpaper appexも同じように試したが、リバースエンジニアリング自体は簡単そうだった一方でWallpaperAgentが読み込みを拒否したので、今のところは壁紙の上でアイコンの下に自分のウィンドウと動画プレーヤーを置く古典的なトリックを使っている。何を見落としたのか調べるつもりだ
本当によくできている。最近似たような沼にはまって、Aerialsのカタログをリバースエンジニアリングし、Appleがこれをどうつないでいるのかを調べていたので、また別のオープンソースプロジェクトがこれをやっているのを見るのはうれしい
一番気に入っていて、こちらのツールでは再現できなかった細部は、ログイン画面とライブデスクトップの間でアニメーションが途切れず続く仕組みだ。私たちは同じアイデアをクロスプラットフォームで実装したphontoを作った: https://github.com/museslabs/phonto. リバースエンジニアリングの過程全体を記事にしようと思っていたところなので、これが書き始めるきっかけになるかもしれない
Windows 98でHTMLページを壁紙にできたことを思い出した。そのHTMLには動画も埋め込めた
それはそうとして、Windows 98のActive Desktopは、もともと不安定なOSの中でも最も不安定な部分だった。新しいシステムを入れたら真っ先に無効にすべきもので、変な見方をしただけでも相変わらず落ちるのだが、少なくとも面白半分で落ちることはなくなった
よくできているが、READMEにデモ動画があるといい
アプリには今やダウンロードリンク付きのランディングページができていて、ほかのプロジェクトも見られる。最大のプロジェクトはRefraxブラウザで、そのほかにも小さなユーティリティアプリがたくさんある
https://kagerou.glass/phosphene/
https://kagerou.glass
デザインに何が役立ったのかも気になる
本当にすばらしい。昔持っていた動画でカスタム動画壁紙を設定してみたかったことを思い出した
これを見るまでは、そもそも標準では対応していないことすら知らなかった