世界を動かす技術を、日本語で。

HNに表示: Appleの動画壁紙を逆アセンブルしました

概要

  • Phosphene はmacOS Tahoe向けの 動画壁紙エンジン
  • メニューバーアプリ+壁紙拡張として 独自動画をデスクトップ/ロック画面に設定 可能
  • Apple純正Aerialsと同じフレームワーク を利用し、システム連携・安定動作を実現
  • 電源・パフォーマンス状態に応じて自動制御、複数ディスプレイにも対応
  • オープンソース(MITライセンス)、Apple Silicon専用

Phosphene:macOS Tahoe向け動画壁紙エンジン

  • Phosphene は、 macOS Tahoe(26.0以降) 専用の動画壁紙アプリケーション
  • メニューバーアプリ+壁紙拡張(WallpaperExtensionKit)構成
  • 自身のMP4/MOV等の動画を壁紙に設定、システム標準の壁紙ピッカーに統合
    • Apple純正Aerialsと並列表示、設定画面から簡単選択
  • ロック画面・デスクトップ両対応、AppleのAerials同等の動作体験

主な特徴

  • 動画ファイルのインポート :MP4/MOV/AVFoundation対応ファイルをライブラリ管理
  • シームレスなループ再生 :PTS/DTSオフセットによるフラッシュ・スタッター無しの滑らかループ
  • 複数ディスプレイ・Spaceごとの壁紙設定 :macOS標準の永続化機能利用
  • 電源・パフォーマンス管理 :サーマル・バッテリー・Game Mode等の状態に応じて再生制御
  • ロック画面時の滑らかな遷移 :キュービックカーブによるアニメーション
  • ウィンドウ重なり検知で自動一時停止 :全画面隠蔽時は描画停止
  • 適応的な解像度/フレームレート切替 :状況に応じて低負荷バリアントへ自動切替
  • メニューバーからの操作 :壁紙プレビュー・一時停止・ディスプレイ切替・設定・自動起動

システム要件

  • macOS Tahoe(26.0+)
    • Wallpaper extension point(macOS 14以降)+Tahoe専用SwiftUI/glassEffect() API利用
  • Apple Silicon(arm64-apple-macos26.0)
  • Xcode 17+(Swift 6厳格コンカレンシー有効)

ビルド・セットアップ手順

  • git clone https://github.com/<you>/phosphene
  • cd phosphene
  • open Phosphene.xcodeproj(Xcodeで開く)
  • Phospheneスキームを選択しRun
  • 開発チームの設定必須(コード署名用)
  • 拡張機能はアプリバンドルに埋め込み、起動時にシステムへ登録

使い方

  • Phospheneを起動、メニューバーからライブラリ管理で動画追加
  • システム設定→壁紙 で、Phospheneの動画が「コレクション」として表示
  • 任意の動画を選択、macOSが壁紙設定を実行(Phosphene拡張がフレーム提供)

アーキテクチャ概要

  • Phosphene.app (メニューバーUI)

    • ライブラリ管理、動画メタデータ、HEVC最適化、設定、Darwin通知
  • PhospheneExtension.appex (WallpaperAgent内で動作)

    • XPCハンドラ、AVSampleBufferDisplayLayerによる描画、電源/サーマル監視、スナップショット生成
  • 共有App Groupコンテナ (~/Library/Group Containers/glass.kagerou.phosphene)

    • 動画ライブラリ・バリアント、設定plist、スナップショットキャッシュ

    • App側(Phosphene/)

      • SwiftUIメニューバーアプリ
      • オンディスク動画管理、低解像度バリアント変換(VideoOptimizationService)、設定管理、Darwin通知
    • Extension側(PhospheneExtension/)

      • WallpaperAgentプロセス内で動作
      • WallpaperExtensionKit.frameworkをdlopenで動的ロード
      • リモートCAContextへAVSampleBufferDisplayLayerで直接描画
      • XPC経由で壁紙状態管理・スナップショット応答
      • PlaybackPolicy :全ての再生制御状態の集約点(サーマル・バッテリー・ユーザ一時停止・ウィンドウ隠蔽等)
  • VideoRenderer

    • AVPlayerLayer非使用(リモートCAContext非対応のため)
    • AVAssetReaderをループごとに手動管理、PTSオフセットで滑らかループ実現

注意点・テクニカルクイック

  • WallpaperSnapshotXPCスウィズル
    • システムのスナップショットエンコーダが型判定で失敗するため、ランタイムスウィズル必須
    • 未対応だとロック画面遷移時にグレー表示
  • MirrorベースのXPCパース
    • Apple非公開リクエスト型(WallpaperCreationRequestXPC等)はMirrorで動的解析
    • フィールド名変更時は即時動作不能リスク
  • バリアントは助言的
    • 例:1080p@30バリアントも、AC&アイドル時は最高画質優先(PlaybackPolicyが最終決定)

ライセンス・クレジット

  • MITライセンス :自由利用・無保証
  • @kageroumado 作、元商用→オープンソース化(競合多数のため)

開発者の思い・補足

  • Appleの動画壁紙対応をきっかけに 独自動画壁紙実現を目指しリバースエンジニアリング
  • WallpaperExtensionKit.framework の挙動を再現するため試行錯誤
  • システム標準の壁紙UIに カスタム動画壁紙を完全統合
  • 「追加」ボタン実装は不可 だったため、ライブラリ管理は別アプリで対応
  • Aerialsと異なりデスクトップでも動画再生継続
  • AVSampleBufferDisplayLayerを直接駆動、PTSオフセットによるギャップレスループ、電源・ウィンドウ状況で自動制御
  • 無料・高機能な動画壁紙エンジンとして公開

Hackerたちの意見

すごく neat!最初は混乱したけど、「動画のスクリーンセーバーをダウンロードできるのに、フレームをスクレイピングするの?」って思ってた。コメントを見て、自分の動画をデスクトップやロック画面に使えるって知ったよ。素晴らしい仕事だね!大事なことを隠さないで!何ができるか、どうやるかを示すタイトルがあれば、めっちゃ助かるな!

すごくクール!でも、君が言うように、Appleに壊される可能性はあるね。

しばらくの間、この部分には手を加えないと思うよ。数年変わってないし、他に優先すべきことがたくさんあるだろうから。

めっちゃクール!これを見て、持ってる映像でカスタム動画背景を設定してみたくなった。これがネイティブでサポートされてないなんて、気づかなかったよ!

ありがとう!気に入ってもらえて嬉しいよ。

これらの機能を活用できる特定の動画壁紙セットをダウンロードできるの?

動画壁紙をダウンロードできるサイトならどこでも使えるし、自分で作ることもできるよ。どんな動画でも再生できるからね。

個人的にはVistaの壁紙に投票するよ。ちょうどいい感じだね。

Tahoeに対する(まあ、かなり妥当な)批判は多いけど、動画壁紙と透明感はWindows Vistaの楽しい雰囲気を思い出させて、懐かしい気持ちになる。Vistaの滝の壁紙でこれを設定して、2007年の気分を味わう時が来たね!

世界中の何十人もの人が、君のVistaへのノスタルジーを共有してるのを想像してるよ。

ウィンドウズVistaの「ノスタルジー」ってどういう意味?ちょっと年を感じるわ。

動く壁紙は最初のうちは新鮮だけど、オフにできないのが困る。壁紙キットを深く掘り下げないといけなかったよ(マジで?ただの壁紙なのに)。動いてるやつの静止画を見つけるのが大変だった。

ウィンドウズにHTMLの壁紙があったの覚えてる?ちょっと用事があるから、エージェント何かやってくるね。これが俺の人生全体をサプライチェーンにしないことを願ってる。

あの「アクティブデスクトップ」って呼ばれる小さなIE4ウィジェット?

アプリにダウンロードリンク付きのランディングページができたよ!他のプロジェクトも見れるよ。最大のはRefraxブラウザだけど、小さいユーティリティアプリもたくさんあるよ! https://kagerou.glass/phosphene/ https://kagerou.glass

わお、ありがとう!これらはロックスクリーンでも動き続けるし、スクリーンセーバーとしても使えるの?

動画はロックスクリーンで再生され続けるけど、スクリーンセーバーは別物だよ。でも、同じ動画を壁紙とスクリーンセーバーにすることはできるよ。

わあ、これをありがとう。スクリーンセーバーのスイートを作ってたんだけど、LegacyScreenSaverがすごく不安定でさ。誰かがAppleのプライベート壁紙フレームワークを見つけてくれることを期待してたんだけど、君がやってくれたんだね!

OMG、LegacyScreenSaverはめっちゃメモリ食うね!

Appleの最高のビデオ壁紙は「Macintosh」だね。どうやって動いてるのか気になる!

同感!この壁紙の一部を見たとき、プロシージャル生成だと思ったんだよね。ただの動画ファイルの集まりじゃないって。確認するために再度見返さなきゃいけなかったし。日時がシステムの日時と秒単位で一致するポイントがいくつかあったよ。