6.3 KiB
Audio Track 1.1.0 兼容基线
PKG-AUDIO-01;源码起点 26b2983daf9edf9c798ce6a1638deeb3c36ba778。 固定来源、逐文件 SHA-256、npm SRI、历史源码及比较结果见 audio-track-release.json。不覆盖 BASE-01 的历史快照。
来源与范围
npm 观察到 1.0.0、1.1.0,采集时 latest 为 1.1.0。本次实际归档范围为 1.1.0, 不是所有历史版本。六文件归档完整性通过,manifest、README、公开声明与起点源码 在 LF 规范化后相同,发布 ESM 与源码工厂经 AST 提取/esbuild 规范化后相同。 这证明比较范围内的逻辑一致,不能代替真实媒体行为测试。
registry gitHead daf133b226 对应本地包版本 1.0.2,
不是该 npm 1.1.0 源码的充分证明;因此保留归档完整性和独立工厂比较。
manifest 无 runtime/peer 依赖、无核心/浏览器/TS 最低版本承诺。
旧核心对照使用现有冻结的 5.4.0;这只是具体检查点,不宣称最低支持版本为 5.4.0。
公开形状及调用
const attach = artplayerPluginAudioTrack({ url: '/audio.aac', offset: 0, sync: 0.3 })
// ArtPlayer 注册时调用 attach(art)
const result = art.plugins.artplayerPluginAudioTrack
result.update({ url: '/next.aac', offset: 0.2 })
const audio = result.audio // 同一 HTMLAudioElement,可直接操作
工厂配置为必传对象;工厂同步返回安装函数,安装同步返回 { name, audio, update }。
name 固定为 artplayerPluginAudioTrack,update 同步返回 undefined。没有额外公开 destroy、
事件、UI、CSS、静态版本或 SDK。插件创建独立 Audio 元素,不替换主视频,也不自动静音主视频;
因此含原音轨的主视频可能与外部音频同时播放,这是现有行为,不静默改变音量策略。
每次安装创建独立状态;配置在安装时解构,调用工厂后、安装前的对象修改会生效。
| 输入或行为 | 1.1.0 源码/发布实现事实 | 兼容与后续验证 |
|---|---|---|
| url | 初始仅 truthy 时赋给 audio.src,preload 为 auto | URL 字符串交给浏览器解析,无 SDK |
| offset | 默认 0,目标 audio 时间是 art.currentTime + offset | 正数音频领先、负数滞后;负目标/超时长在 02 实测 |
| sync | 默认 0.3,仅绝对偏差严格大于阈值才 seek | 等于阈值不写;未校验负数、NaN、Infinity,不能凭猜测新增拒绝规则 |
| update | truthy 且不同 URL 才赋 src;playing 时调用 play;之后才更新 offset/sync | 同 URL 不重载,空 URL 不清源;JS 允许只传 offset/sync,且不立即同步 |
| audio | 公开真实元素,同一引用贯穿安装/更新/销毁 | 不换为不可访问封装,不用新元素实现每次切源 |
| 音量/倍率 | 初始 volume/muted 来自 art;倍率 video?.playbackRate 或 1 | 后续 video:volumechange/ratechange 同步,无自有主视频 mute |
| play 拒绝 | 三个调用点各自 catch 并 console.warn 原错误 | 没有返回给调用者的 play Promise、没有自定义错误事件 |
| ArtPlayer 事件 | 外部音频行为 |
|---|---|
| play | 有 URL 才同步目标时间,随后 audio.play |
| pause | audio.pause |
| seek | 有 video/URL 才同步时间 |
| video:timeupdate | art.playing 时同步时间 |
| video:ratechange | 读 art.video.playbackRate |
| video:volumechange | 同步 art.volume 和 art.muted |
| video:waiting | audio.pause |
| video:playing | 有 URL 且 art.playing 才 audio.play,不主动 sync |
| destroy | pause、src = ''、load,按此顺序 |
没有定时器或自建请求;浏览器拥有媒体加载。当前九个 emitter 回调没有插件自身解绑, 依赖核心销毁清空事件。没有 closed 状态,外部保留的 update 可在销毁后写入新 src。 这些是源码观察,02 用受控复现及真实媒体验证;不能只凭观察称内存泄漏已复现。
类型和分发
公开默认导出为 (option: Option) => (art: Artplayer) => Result,Option.url 必需、
offset/sync 可选;Result.audio 为 HTMLAudioElement,update(option: Option): void。
Option/Result 未具名导出,消费者可用 Parameters/ReturnType 提取;04 保留这些旧合法调用。
JS 的 update({ offset: 1 }) 与声明不一致,允许拓宽 update 为部分配置,但不弱化字段类型。
docs 编辑器声明还同时包含 export default/export =,由 04 做语义验证及生成修正,
本步不声称编辑器或 TS 消费已经通过。
root exports 使用 types + import(mjs)/require(js),legacy import/require 都指向 legacy.js;
main/module/types/legacy 的完整值冻结在 manifest。UMD 全局名与默认导出一致。
保留 /legacy、旧文件路径、同步注册和未加载 DOM 时的导入边界;实际各格式消费由 02/04/06 验证。
当前版本保持 1.1.0,REL-09 按用户要求准备 2.0.0,未获 npm 发布授权。
文档、样本与差异归属
README 仅说明插件名、Demo 和 MIT;其 example=audio-track 与真实
docs/assets/example/audio.track.js 不一致。common.js 直接拼接名称,无连字符转换。
实际示例使用本地 sprite-fight.mp4 + sprite-fight.aac,二者存在;没有演示 update、
偏移边界或销毁。06 应修链接并以正式 8082 demo 验证,不能拿静态文件存在作为播放通过。
| 风险 | 当前证据等级 | 负责任务 |
|---|---|---|
| AUDIO-LIFE-01:销毁后 update 可写 src,监听/异步播放归属缺少终止守卫 | 源码事实,未作浏览器泄漏结论 | 02/03/05 |
| AUDIO-SYNC-01:偏移边界及切源/缓冲恢复缺少媒体时序证据 | 待取证,不预设所有当前行为是缺陷 | 02/03/05 |
| AUDIO-TYPE-01:update 部分配置和编辑器声明不一致 | 源码/声明事实 | 04 |
| AUDIO-DEMO-01:README 示例名不匹配、维护说明缺失 | 源码/文件事实 | 06 |
重跑
node refactor/scripts/audio-contract.mjs:重验固定归档、六文件、manifest、历史 Git 内容与工厂。
首次仅从固定 npm URL 下载至忽略缓存;不安装、不执行归档脚本、不覆盖基线。
node --test refactor/scripts/audio-contract.test.mjs:包含该验证及规范化工具的有意行为变化检查。
本步不改生产代码/声明/构建产物;所有媒体、类型和设备验收仍是后续任务。