1P by GN⁺ 3시간전 | ★ favorite | 댓글 1개
  • 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 안에서 조용히 실패하기 때문에, VideoRendererAVAssetReaderAVSampleBufferDisplayLayer를 직접 구동해 단조 증가하는 타임라인을 유지함
  • WallpaperSnapshotXPC swizzle과 Mirror 기반 XPC 파싱에 의존하므로, Apple이 비공개 타입이나 필드명을 바꾸면 스냅샷·요청 처리 쪽이 깨질 수 있음
  • 요구 사항은 macOS Tahoe 26.0+, Apple Silicon, Xcode 17+이며, arm64-apple-macos26.0을 대상으로 Swift 6 strict concurrency가 활성화되어 있음
  • 라이선스는 MIT이며, 보증 없이 자유롭게 사용할 수 있다고 명시됨

댓글과 토론

Hacker News 의견들
  • 아주 깔끔함. 처음엔 “동영상 화면 보호기는 내려받을 수 있는데 왜 프레임을 긁어오지?” 하고 헷갈렸는데, 댓글을 보고 내 동영상을 데스크톱과 잠금 화면에 쓸 수 있다는 걸 이해함
    핵심을 숨기지 말고, 무엇을 어떻게 할 수 있는지 바로 드러나는 제목이면 훨씬 좋겠음

  • Tahoe가 꽤 욕먹는 건 어느 정도 이해하지만, 동영상 배경화면과 투명 효과는 Windows Vista 느낌이라 재밌고 향수가 돋음
    이제 Vista 폭포 배경화면을 설정해서 정말 2007년처럼 느껴볼 때임

    • Windows Vista “향수”라니, 내가 좀 오래 산 것처럼 느껴짐
    • Tahoe에서 가장 큰 문제는 잠금 화면 애니메이션이 계속 끊기고 멈춘다는 것임. M3 Pro를 쓰는데, 4K 동영상을 프레임 드롭 없이 볼 수 있다면 단순한 동영상 배경도 잘 돌아가야 하고, 안 된다면 존재하면 안 된다고 봄
    • 전 세계에서 Vista 향수를 공유하는 사람이 수십 명쯤 있을 것 같음
    • https://windowswallpaper.miraheze.org/wiki/Windows_Vista
      어떤 폭포를 말하는 건지 궁금함. Vista에 배경화면이 이렇게 많이 있었다는 것도 놀랍고, 기억나는 건 기본 초록 그라데이션 같은 것과 한때 썼던 대나무 숲 정도임
    • 1998년쯤 xscreensaver 해킹을 X 루트 창 배경, 그러니까 데스크톱에 띄워 쓰던 때가 그리워짐
  • 이거 정말 고마움. 화면 보호기 모음을 만들고 있었는데 LegacyScreenSaver가 너무 엉성했음
    누군가 Apple의 비공개 배경화면 프레임워크를 알아내길 바랐는데, 정말 해냈음

    • 내가 보기엔 이건 WallpaperAgent용이고, com.apple.wallpaper의 확장을 WallpaperAgent가 데스크톱에서 실행하는 구조임
      화면 보호기는 다른 글을 보면 되고, 그쪽에는 이를 우회하는 비공개 화면 보호기 API 샘플을 올려둠. Apple은 자체 “Aerials”에서 둘 다 쓰고, 화면 보호기 플레이어와 데스크톱 플레이어 사이의 위치를 공유하는 동기화 시스템을 갖고 있음
    • LegacyScreenSaver는 메모리를 정말 많이 먹음
  • Apple 최고의 동영상 배경화면은 Macintosh라고 생각함. 어떻게 동작하는지 궁금함

    • 나도 궁금함. 이 배경화면 일부를 보고 단순한 동영상 파일 모음이 아니라 절차적으로 생성되는 것 같다고 느꼈고, 확인하려고 다시 봤음
      날짜와 시간이 시스템 날짜·시간과 초 단위까지 맞는 지점이 여러 군데 있음
  • 와, 이건 진짜 멋짐. 비공개 화면 보호기 .appex 프레임워크를 역공학해서 Aerial 4에서 동작하게 만드는 데는 성공했고, 원하는 사람을 위해 지난주 v4와 함께 샘플 프로젝트와 문서를 공개했음: https://github.com/AerialScreensaver/AppexSaverMinimal
    Wallpaper appex도 같은 방식으로 시도했는데 역공학 자체는 쉬워 보였지만 WallpaperAgent가 로드를 거부해서, 아직은 배경화면 위와 아이콘 아래에 내 창과 동영상 플레이어를 띄우는 고전적인 트릭을 쓰고 있음. 뭘 놓쳤는지 살펴볼 예정임

  • 정말 잘 만들었음. 최근 비슷한 토끼굴에 빠져서 Aerials 카탈로그를 역공학하고 Apple이 이걸 어떻게 연결하는지 파악했는데, 또 다른 오픈소스 프로젝트가 이걸 하는 걸 보니 좋음
    가장 마음에 드는 세부 요소이자 우리 도구에서는 재현하지 못한 부분은 로그인 창과 라이브 데스크톱 사이에서 애니메이션이 계속 이어지는 방식임. 우리는 같은 아이디어를 크로스 플랫폼으로 구현한 phonto를 만들었음: https://github.com/museslabs/phonto. 전체 역공학 과정을 글로 쓰려던 참이었는데, 이게 시작할 계기가 될 수도 있겠음

    • 동작 방식은 동영상 재생이 잠금 화면과 데스크톱 사이에서 공유되고, Apple 프레임워크가 표시되는 표면을 투명하게 전환하는 구조임
  • Windows 98에서 HTML 페이지를 배경화면으로 쓸 수 있었던 게 떠오름. 그 HTML에는 동영상도 넣을 수 있었음

    • X11에서는 원하는 어떤 프로그램이든 루트 창으로 설정할 수 있음
      그건 그렇고 Windows 98의 Active Desktop은 이미 불안정한 운영체제에서 가장 불안정한 부분이었음. 새 시스템을 설치하면 제일 먼저 꺼야 했고, 잘못 쳐다보기만 해도 여전히 죽긴 했지만 적어도 재미로 죽지는 않게 됨
  • 잘 만들었지만 README에 시연 영상이 있으면 좋겠음

  • 앱에 이제 다운로드 링크가 있는 랜딩 페이지가 생겼고, 다른 프로젝트들도 볼 수 있음. 가장 큰 프로젝트는 Refrax 브라우저이고, 그 밖에도 작은 유틸리티 앱이 많음
    https://kagerou.glass/phosphene/
    https://kagerou.glass

    • 페이지를 어떻게 그렇게 빨리 만들었는지 궁금함
      디자인에는 무엇이 도움이 됐는지도 궁금함
  • 정말 멋짐. 예전에 갖고 있던 영상으로 사용자 지정 동영상 배경을 설정해보고 싶었던 게 떠오름
    이걸 보기 전까지는 기본으로 지원되지 않는다는 것도 몰랐음