关于 axiom-media
axiom-media 是一项技能,用于将 Apple 平台的相机、照片、音频、触感反馈和媒体播放任务导向专门参考资料及相关技能,面向开发媒体功能或排查问题的开发者。
主要功能
- 01指引相机采集与照片图库任务
- 02涵盖音频、视频和播放 API
- 03提供触感反馈与媒体路由指引
- 04提供媒体问题排查路径
适用场景
- 01查找相机采集或旋转问题的指导
- 02实现照片图库访问
- 03开发音频播放或视频导出
- 04审查相机代码的可靠性
MCP 相关
README 提到可通过 MCP 使用 `axiom_get_agent` 获取 Agent 流程,但没有说明它是 MCP 服务。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ charleswiltgen/ axiom --skill axiom-media安装后在 Claude Code 中输入/axiom-media确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
skills/avfoundation-ref.mdavfoundation-video-ref.mdcamera-auditor.mdcamera-capture-diag.mdcamera-capture-ref.mdcamera-capture.mdcarplay-hig.mdcarplay-navigation-ref.mdcarplay-templates-ref.mddockkit.mdhaptics.mdmedia-intelligence.mdmusic-library.mdmusic-understanding.mdnow-playing-carplay.mdnow-playing-musickit.mdnow-playing.mdphoto-library-ref.mdphoto-library.mdscreen-capture.mdshareplay-playback.mdshazamkit-ref.mdshazamkit.mdsystem-media-routing.md详细介绍
媒体
任何涉及相机、照片、音频、触觉或媒体播放的工作,都必须使用此技能。
无法启动 Axiom 智能体? 如果此路由将你指向某个智能体,请直接按照其流程操作。通过 MCP,
axiom_get_agent会返回该智能体;在其他环境中,请读取下方的文件,只需使用文件搜索和读取功能即可。此处提供:
skills/camera-auditor.md。对于任何其他智能体,通过 MCP 使用
axiom_get_agent也会返回该智能体;请使用axiom_xclog_*、axiom_xcsym_*和axiom_xcprof_*工具运行其 xclog、xcsym 和 xcprof 步骤。在其他环境中,请在 Axiom 的技能中搜索skills/<agent>.md;如果没有该文件,请使用此套件的技能自行完成工作,并使用PATH上的任意 Axiom 工具。
快速参考
| 症状 / 任务 | 参考 |
|---|---|
| 相机采集、AVCaptureSession | 参见 skills/camera-capture.md |
相机启动缓慢 / 延迟启动(iOS 26+)、通过 Pro Video Storage 录制 ProRes(OS27) | 参见 skills/camera-capture.md 模式 8-9 |
| 相机 API(RotationCoordinator 等) | 参见 skills/camera-capture-ref.md |
镜头光圈 / 快门 / ISO 优先模式、曝光信号、连续自动对焦跟踪、低光视频降噪、电影级视频元数据采集(OS27) | 参见 skills/camera-capture-ref.md |
| Center Stage 前置相机(iPhone 17)、动态宽高比、智能取景、24/48 MP 拍摄 | 参见 skills/camera-capture-ref.md |
| iPhone Duo 前置相机(虚拟前置相机、内侧 / 外侧超广角)、相机方向与位置 | 参见 skills/camera-capture.md 模式 6 和 skills/camera-capture-ref.md(iPhone Duo 前置相机) |
| 相机冻结、预览黑屏、旋转 | 参见 skills/camera-capture-diag.md |
| 照片选择器、图库访问 | 参见 skills/photo-library.md |
PHPicker、PhotosPicker、PhotoKit API 参考:资源元数据编辑(关键词、评分、说明文字)、持久化更改观察器、后台资源上传(OS27) | 参见 skills/photo-library-ref.md |
PhotoKit + Swift 6 严格并发、nonisolated 观察器、performChanges 隔离、_dispatch_assert_queue_fail | 参见 axiom-concurrency(skills/isolation-inheritance-diag.md) |
音频、AVFoundation、空间音频、异步会话激活、会抛出错误的 AVAudioEngine API(OS27) | 参见 skills/avfoundation-ref.md |
视频写入 / 导出 / 播放、样本缓冲区引擎、可恢复导出、Apple Log 2、iOS 27 弃用 API(OS27) | 参见 skills/avfoundation-video-ref.md |
| 音频识别、ShazamKit | 参见 skills/shazamkit.md |
| ShazamKit API 参考 | 参见 skills/shazamkit-ref.md |
设备端音乐分析(调性、节奏、结构、响度)、MusicUnderstanding(OS27) | 参见 skills/music-understanding.md |
设备端人脸分组(在整个图库中将人脸聚类为人物)、视频精彩片段 / 关键帧、MediaIntelligence(OS27) | 参见 skills/media-intelligence.md |
| 触觉反馈、Core Haptics | 参见 skills/haptics.md |
| SharePlay 协调播放、AVDelegatingPlaybackCoordinator、自定义引擎同步 | 参见 skills/shareplay-playback.md |
| SharePlay 会话生命周期、激活、非媒体状态 | 请改用 axiom-integration(skills/shareplay.md) |
| “正在播放”元数据、远程命令 | 参见 skills/now-playing.md |
| Siri 在你的音频应用中播放内容(“在 MyApp 中播放 X”、通过语音点赞 / 添加到播放列表) | 请使用 axiom-integration(skills/siri-audio.md) — 音频架构领域 + SiriKit 媒体 |
| 动态锁屏插图(iOS 26+) | 参见 skills/now-playing.md 模式 8 |
NowPlaying 框架(import NowPlaying、Swift 原生 MediaSession、OS27) | 参见 skills/now-playing.md(NowPlaying 框架部分) |
将媒体投放 / 路由到非 AirPlay 设备(Google Cast/Chromecast、DLNA),作为系统路由,AVSystemRouting(iOS27,可能受欧盟地区限制) | 参见 skills/system-media-routing.md |
屏幕采集 / 录制 / 串流屏幕或你自己的应用、ScreenCaptureKit(OS27 — iOS/iPadOS/tvOS/visionOS 27 新增;macOS 12.3+) | 参见 skills/screen-capture.md |
| CarPlay HIG、应用类别、设计规则、权利 | 参见 skills/carplay-hig.md |
| CarPlay 模板参考(全部 12 种模板、可用性矩阵、深度限制) | 参见 skills/carplay-templates-ref.md |
| CarPlay 导航参考(基础视图、路线指引、仪表盘 / HUD、多点触控、语音提示、地图面板 + iOS 27 电动汽车充电) | 参见 skills/carplay-navigation-ref.md |
| CarPlay“正在播放”模板自定义 + 体育模式 | 参见 skills/now-playing-carplay.md |
| MusicKit“正在播放”、ApplicationMusicPlayer 播放、订阅 / 授权 | 参见 skills/now-playing-musickit.md |
枚举用户的 Apple Music 资料库 — MusicLibraryRequest 与 MPMediaQuery 的比较、两者的协调、播放列表条目、同步、资料库身份、每台设备的 Song.id、缺失的 PlayParameters、扫描后 MusicKit 停止响应 | 参见 skills/music-library.md |
| DockKit 电动支架 / 云台、主体跟踪、自定义电机控制 | 参见 skills/dockkit.md |
| 语音转文本 / 转录(SpeechAnalyzer、麦克风 → 转录文本) | 调用 axiom-ai(skills/speech.md) |
决策树
digraph media {
start [label="Media task" shape=ellipse];
what [label="Which media feature?" shape=diamond];
auditor [label="camera-auditor agent" shape=box];
start -> what;
what -> "skills/camera-capture.md" [label="camera capture"];
what -> "skills/photo-library.md" [label="photo pickers\n/ library"];
what -> "skills/avfoundation-ref.md" [label="audio / AVFoundation"];
what -> "skills/avfoundation-video-ref.md" [label="video write/export\n/ sample-buffer (OS27)"];
what -> "skills/shazamkit.md" [label="ShazamKit\n/ audio recognition"];
what -> "skills/music-understanding.md" [label="music analysis\n(key/tempo/structure)"];
what -> "skills/media-intelligence.md" [label="face grouping /\nvideo highlights (OS27)"];
what -> "skills/haptics.md" [label="haptic feedback"];
what -> "skills/now-playing.md" [label="Now Playing\n/ remote commands"];
what -> "skills/music-library.md" [label="enumerate Apple Music\nlibrary / identity"];
what -> "skills/system-media-routing.md" [label="cast to non-AirPlay\n(Chromecast/DLNA, iOS27)"];
what -> "skills/screen-capture.md" [label="screen capture /\nrecording (OS27)"];
what -> "skills/carplay-hig.md" [label="CarPlay app design\n/ categories / entitlements"];
what -> "skills/dockkit.md" [label="DockKit stands\n/ gimbals / tracking"];
what -> auditor [label="camera code audit"];
}
- 相机采集?→
skills/camera-capture.md(模式)、skills/camera-capture-ref.md(API)、skills/camera-capture-diag.md(调试) - 照片选择器/图库?→
skills/photo-library.md、skills/photo-library-ref.md - 音频/AVFoundation(音频)?→
skills/avfoundation-ref.md;视频写入/导出/播放、样本缓冲区引擎、可恢复导出、iOS 27 弃用项?→skills/avfoundation-video-ref.md(OS27) - ShazamKit/音频识别?→
skills/shazamkit.md、skills/shazamkit-ref.md - 设备端音乐分析(调性、节奏、结构、速度、乐器、响度)?→
skills/music-understanding.md(OS27) - 设备端人脸分组(跨图库将人脸聚类为人物)或视频精彩片段/关键帧检测?→
skills/media-intelligence.md(OS27) - 触觉反馈?→
skills/haptics.md - 正在播放/远程命令?→
skills/now-playing.md、skills/now-playing-carplay.md、skills/now-playing-musickit.md8a. 音频应用中的 Siri 播放(“在 MyApp 中播放 X”)?→ axiom-integration(skills/siri-audio.md);Siri 的“暂停”/“下一首”/“这是什么歌?”仍归此处(远程命令和正在播放的元数据) - 读取用户的 Apple Music 资料库(枚举歌曲/播放列表、资料库身份、同步)?→
skills/music-library.md——这与播放是不同的问题;遍历任何资料库之前,请先阅读 - 将媒体投放/路由到非 AirPlay 设备(Google Cast/Chromecast、DLNA)作为系统路由?→
skills/system-media-routing.md(iOS27,可能受欧盟地区限制) - 屏幕采集/录制/串流屏幕或你自己的应用(ScreenCaptureKit)?→
skills/screen-capture.md(OS27——iOS/iPadOS/tvOS/visionOS 27 新增) - CarPlay 应用设计、类别选择、权限申请?→
skills/carplay-hig.md(任何 CarPlay 工作都从这里开始) - DockKit 电动支架/云台、主体跟踪、自定义电机控制?→
skills/dockkit.md - 想要审查相机代码?→ 启动
camera-auditorAgent(检测已弃用 API 和架构缺陷:缺少中断处理程序、运行时错误恢复、音频会话停用、权限被拒时的用户体验、iOS 17+ 上的 RotationCoordinator;评分为 RELIABLE / FRAGILE / BROKEN)
跨领域路由
相机 + 权限(相机访问被拒绝、Info.plist 缺失):
- 相机代码 → 留在这里(camera-capture)
- 隐私清单 / Info.plist → 调用 axiom-integration(参考 privacy-ux)
- 构建 / 权限配置错误 → 调用 axiom-build
ShazamKit + 麦克风权限:
- 麦克风 NSMicrophoneUsageDescription → 调用 axiom-integration(参考 privacy-ux)
- ShazamKit API 和匹配 → 留在这里(shazamkit)
正在播放 + 后台音频:
- 正在播放的元数据 / 控制 → 留在这里(now-playing)
- 后台音频模式 / BGTaskScheduler → 调用 axiom-integration(参考 background-processing)
语音转文本 + 音频采集(转录麦克风或资源音频):
SpeechAnalyzer/SpeechTranscriber、OS27输入提供程序、iOS / visionOS 上约有 2 个分析器的上限;macOS 上没有此上限 → 调用 axiom-ai(skills/speech.md)- 音频会话类别 / 模式、
AVCaptureSession接线 → 留在这里(avfoundation-ref、camera-capture) - 注意这个陷阱:
CaptureInputSequenceProvider.providerWithSession(...)(OS27)会自动重新配置应用的默认AVAudioSession。如果添加转录后,这套工具的音频会话设置“随机失效”,原因就在这里——通过provider(from:in:)加入你自己的会话,或从拥有该会话的 Actor 调用init(session:analyzerFormat:priority:),并添加其captureAudioDataOutput。
Apple Music 资料库 + 播放 + 持久化:
- 枚举资料库、资料库身份、
PlayParameters可用性、同步资料库的风险 → 留在这里(music-library) - 将找到的内容加入队列并播放、发布正在播放的信息 → 留在这里(now-playing-musickit)
- 将资料库行存入你自己的数据库(哪个列是持久键、重新指定键时的迁移)→ 调用 axiom-data——但首先从 music-library 获取身份规则;
persistentID不是持久键 MusicAuthorization提示词文案 / 隐私清单 → 调用 axiom-integration(参考 privacy-ux)
照片资料库 + 隐私:
- 照片选择器(PHPicker、PhotosPicker)→ 留在这里(photo-library)——无需权限
- 完整的 PHPhotoLibrary 访问权限 → 留在这里(photo-library-ref)——有限访问模型
- 照片使用的隐私清单 → 调用 axiom-integration(参考 privacy-ux)
DockKit + 相机 / 自定义推理:
- DockKit 支架控制、取景、电机、跟踪状态 → 留在这里(dockkit)
- 底层 AVCaptureSession 设置 → 留在这里(camera-capture)
- 提供观察结果的自定义 Vision / Core ML 推理 → 调用 axiom-vision
- 相机权限(NSCameraUsageDescription)→ 调用 axiom-integration(参考 privacy-ux)
MediaIntelligence + Vision(人脸、图像分析):
- 在整个资料库中将人脸归类为人物、视频精彩片段 / 关键帧 → 留在这里(media-intelligence)——对身份进行聚类 + 在设备端检测视频片段
- 检测一张图像中人脸的位置(边界框、特征点)、OCR、分割 → 调用 axiom-vision——逐图像检测,是不同的问题
- 系统“照片”中的“人物”相簿 → 该相簿由系统拥有(PhotoKit);MediaIntelligence 会基于你管理的资源构建自己的索引 → 留在这里(通过 photo-library 访问资源)
反驳自我合理化
| 想法 | 事实 |
|---|---|
| “相机采集不过是设置 AVCaptureSession” | 相机需要处理中断、旋转和线程要求。 |
| “只要尽早调用 startRunning(),相机启动就够快了” | 输出初始化是启动耗时的主要部分;iOS 26 的延迟启动可将预览显示时间缩短一半。 |
| “我会用一个简单的 API 调用添加触觉反馈” | 触觉设计针对每种交互类型都有符合 HIG 的模式。 |
| “ShazamKit 不过就是 SHSession + 一个委托” | iOS 17+ 提供 SHManagedSession,可免去所有 AVAudioEngine 样板代码。 |
| “Now Playing 信息不过就是设置元数据” | 远程命令、封面处理和状态同步有 15+ 个易踩问题。 |
| “我会用 UIImagePickerController 选取照片” | PHPicker/PhotosPicker 才是现代 API,无需权限。 |
| “MediaPlayer 报告的播放列表成员比 MusicKit 少,所以同步不完整” | 这种差异来自结构,而非同步信号:它追踪的是没有本地表示的条目——检查过的五个播放列表中结果完全一致,在整个资料库范围内则相差一个。基于这一前提发布的保护逻辑会静默跳过 15 个播放列表中的 9 个,永远如此。请阅读 skills/music-library.md。 |
| “读取音乐资料库不过就是发起一个 MusicLibraryRequest” | 在大型资料库中读取一个 MusicKit 属性,会导致本次运行中之后的每个 MusicKit 请求都无法恢复,且不会抛出错误。池耗尽只是症状,并非根本机制——一个从不接触该池的普通 Thread,也会同样导致 MusicKit 失效。分批处理请求会慢约 100 倍,并不更安全。 |
“Song.id 是可以存储的稳定键” | 同一资料库在不同设备上的 ID 格式 不同(一台设备上是 i.…,另一台上是纯数字)。切勿解析它,也切勿将它用作跨设备键。 |
| “DockKit 不过就是配对一个支架” | 自定义控制需要禁用系统跟踪、处理倒置的底座状态,并应对两种不同的坐标原点。 |
| “分组人脸不过就是 Vision 人脸检测” | Vision 会检测单张图像中的人脸;MediaIntelligence 会在整个资料库中将人脸聚类为持久的人物(实体),并使用自己的工作目录和状态。 |
| “投放到 Chromecast 就意味着要捆绑 Google Cast SDK” | 在 iOS 27 上,AVSystemRouting 会将非 AirPlay 路由作为系统路由公开——你只需采用一个 Apple API(观察事件、启动会话、驱动 playbackControl),而不是使用各厂商的 SDK。可能受欧盟地区限制——请进行地区限制判断并保留后备方案。 |
| “我会通过信使广播当前时间来同步 SharePlay 播放” | 信使没有时钟。AVDelegatingPlaybackCoordinatorPlayCommand.hostClockTime 会提供一个绝对的 CMClockGetHostTimeClock() 开始时间;自行实现会很糟糕地重造启动屏障、seek 顺序、卡顿和中断处理。 |
| “播放协调器会替我处理中断” | 只有 AVPlayerPlaybackCoordinator 会这样做。AVDelegatingPlaybackCoordinator 不会自动挂起——自定义引擎必须负责开始和结束每次挂起;若未结束挂起,整个群组都会卡住。 |
| “iPad 上的 ScreenCaptureKit 和 Mac 上一样(枚举显示器/窗口)” | 在 iOS/iPadOS 上,SCShareableContent 和所有 SCContentFilter 初始化方法都仅限 macOS 使用——你只能从系统 SCContentSharingPicker 获取筛选器。iOS/iPadOS/tvOS/visionOS 27 中的新功能。也不是 ImageRenderer(它会对你自己的 SwiftUI 视图进行快照)。 |
示例调用
用户:“如何设置相机预览?”
→ 阅读:skills/camera-capture.md
用户:“我的相机应用要等一秒才显示预览”
→ 阅读:skills/camera-capture.md(模式 8,延迟启动)
用户:“支持 Center Stage 前置摄像头” / “拍摄 48MP 照片”
→ 阅读:skills/camera-capture-ref.md
用户:“如何在 iPhone Duo 上切换摄像头?” / “按方向而不是位置选择摄像头”
→ 阅读:skills/camera-capture.md(模式 6)和 skills/camera-capture-ref.md(iPhone Duo 前置摄像头)
用户:“接到电话时相机卡住了”
→ 阅读:skills/camera-capture-diag.md
用户:“如何在 SwiftUI 中让用户选择照片?”
→ 阅读:skills/photo-library.md
用户:“为按钮点击实现触觉反馈”
→ 阅读:skills/haptics.md
用户:“锁定屏幕上没有显示正在播放的信息”
→ 阅读:skills/now-playing.md
用户:“如何使用 ShazamKit 识别歌曲?”
→ 阅读:skills/shazamkit.md
用户:“如何在设备上检测歌曲的节奏 / 调性 / 节拍网格?” / “分析音频的响度或结构”
→ 阅读:skills/music-understanding.md
用户:“将整个照片图库中的人脸归类到不同人物” / “在设备上聚类人脸” / “查找视频中的精彩片段或缩略图帧”
→ 阅读:skills/media-intelligence.md
用户:“不使用 Cast SDK,将内容投放到 Chromecast / Google Cast” / “支持非 AirPlay 投放” / “将媒体作为系统路由传输到 DLNA 设备”
→ 阅读:skills/system-media-routing.md
用户:“录制 / 串流 iPad 屏幕” / “在 iOS 上使用 ScreenCaptureKit” / “在我的应用中录屏” / “仅捕获我应用的内容”
→ 阅读:skills/screen-capture.md
用户:“列出用户 Apple Music 资料库中的所有歌曲” / “枚举其播放列表” / “MPMediaQuery 与 MusicKit 对比” / “同步 Apple Music 播放列表” / “MediaPlayer 和 MusicKit 报告的播放列表数量不同” / “扫描资料库后,我的 MusicKit 请求不再响应” / “为每首歌曲存储可在不同设备间保持稳定的 ID” / “用户开启同步资料库后,播放列表变空了”
→ 阅读:skills/music-library.md
用户:“用电动支架跟踪主体” / “控制 DockKit 云台”
→ 阅读:skills/dockkit.md
用户:“检查我的相机代码是否存在问题”
→ 启动:camera-auditor Agent