Repository navigation
Releases
v0.9.1 — 清单 I/O 退出码修复
moonmux v0.9.1 — 0.9.0 补丁
修复
mux的manifest.txt是目录/管道/设备时按 I/O 错误退出 2(与文档和 smoke 契约一致;0.9.0 误归为数据错误 1)。looks_like_packet_member平台测试修正:POSIX 大小写敏感,大写 8.3 短名只在 Windows 识别。
验证
- Windows native 336 个测试通过(Linux 335);覆盖率未覆盖行 710(CI 上限 750)。
- CI 10 个 job 全绿(含 native/Windows smoke、MP4 ffprobe、install、bench、fuzz、coverage)。
mooncakes:moon add WangYF0829/moonmux@0.9.1
v0.9.0 — 第二轮正确性/契约修复
moonmux v0.9.0 — 第二轮正确性/契约修复
容器正确性
- MP4 写侧补
edts/elst(按 pre-skip 裁剪播放时间轴)与roll样本组;末包粒度不推进时按 Ogg end-trim 裁掉多余样本;mvhd/tkhd用裁剪后时长,mdhd保留总样本数。 - MP4 读侧支持 64 位
largesize并做边界检查;v1 时长钳到 Int32 上限;多条音频轨显式拒绝。 - WAV 浮点写
fact块;解析拒绝重复fmt/data块。 - Ogg 重同步候选加 version/头类型预筛、合并相邻 gap;新增
validate_page/serialize_pages_checked,CLI 写命令全部走校验入口;修正verify_page。 - manifest 拒绝重复
serial/packets/chain头字段。
CLI 契约
- 错误/用法信息走 stderr;
--json失败输出{\"error\":...};info增加parsed_bytes/truncated。 dump --hex对损坏文件仍输出整文件 hex;extract --force允许幂等覆盖;--json/--hex可出现在路径前后;无参调用退出 2。tags控制字符转义;plan_mux类型化错误分流;2 GiB 聚合输出闸门;MOONMUX_MAX_PCM_MB校验与 2048 上限;POSIX 路径修正。
工程 / CI
- checkout 固定 SHA、每个 job 记录工具链版本;文档-only 推送跳过 CI;install job 等待 mooncakes 发布;新增 Windows smoke job 与版本一致性脚本。
- 测试 315 → 335;覆盖率未覆盖行 710(Windows;CI 门禁上限 750)。
mooncakes:moon add WangYF0829/moonmux@0.9.0
v0.8.0 — 正确性修复
本版基于独立审阅(静态审查 + 动态复现)修复了容器层与 MP4/CLI 的正确性问题,无 API 破坏性变更。
修复
- Opus TOC:SILK 60 ms 帧长 3840→2880;code-3 帧数改读
data[1] >> 2;补 M≤48、包时长≤120 ms 校验。 - remux 输入闸门:CLI 先做 CRC/结构/EOS 检查;库层拒绝链式与多逻辑流(不再静默只取第一段)。
- MP4 读侧防崩溃:box 字段读取先校验长度,32 字节截断文件不再 panic;mvhd/mdhd version 1 正确解析。
- stsz / 样本偏移:定长样本数与偏移用文件大小上界;
pos + size用 Int64 防回绕。 - 多声道 OpusHead:dOps 保留
StreamCount/CoupledCount,family≠0 输出 21+C 字节。 - granule 语义:MP4→Ogg 写累计样本数(RFC 7845 §4,PCM = granule − pre-skip)。
- dOps OutputGain:从 OpusHead 透传 Q7.8 增益。
- 头包页隔离:
paginate_sized不再把 OpusTags / Vorbis 头包与音频包合并。 - 跨页包替换:
replace_packet修正回溯条件,大 OpusTags/封面可正确替换。 - WAV fmt 布局保真:
to_bytes写回原始 fmt 负载(16/18/40 字节),24-bit tag1、float tag3、Extensible 小声道数不再被改写。 - manifest / mux:拒绝空清单与非单调 granule;
mux落盘前内存回读校验。 - 工程加固:LICENSE 去掉 HTTP Server 子组件声明;
.moonignore排除_*/;CI bench 启用pipefail;verify_mp4.sh在 CI 强制要求 ffmpeg/ffprobe。
验证
- 测试 299 → 315;覆盖率未覆盖行 683(CI 门禁 715);
moon check --deny-warn零警告。 - 本地实测:链式/截断/CRC 损坏输入 → remux exit 1;干净工程
moon add WangYF0829/moonmux@0.8.0→ 运行公开 API 通过。 - CI 8 job 全绿(check×2 / coverage / smoke / mp4·ffprobe / install / bench / fuzz)。
安装:moon add WangYF0829/moonmux@0.8.0
mooncakes: https://mooncakes.io/docs/WangYF0829/moonmux
v0.7.1 — 文档同步发布
本版为文档同步发布:无代码、API 或文件格式变更,功能与 v0.7.0 相同。
变更
项目申报书.md重写为工程说明:项目定位、工作内容(按模块)、技术方案与关键设计、工程质量与验证、能力边界、开源合规与参考来源、使用方式、发布与开发记录。- README 与 CHANGELOG 改为中性的版本历程与能力清单(去除历史评审与赛道相关表述),测试数与版本引用同步更新。
- 版本号同步到 0.7.1(
moon.mod/describe()/ smoke / install / CI install env / 文档)。
验证
- 测试 299/299;覆盖率未覆盖行 682(CI 门禁 715);''moon check --deny-warn'' 零警告。
- 干净工程
moon add WangYF0829/moonmux@0.7.1→moon check→ 运行公开 API 通过。
安装:moon add WangYF0829/moonmux@0.7.1
mooncakes: https://mooncakes.io/docs/WangYF0829/moonmux
v0.7.0 — WAV 块保真与流式写接口
本期(2026-11-09)补齐 WAV 容器层的两块能力:块保真与流式写接口。无破坏性 API 变更(只新增字段/类型/函数)。
新增
- WAV 块保真:
WavFile新增chunks : Array[WavChunk](fourcc / data / after_data)与channel_mask;解析保留fmt/data之外的所有块(LIST / fact / junk …,含奇数长度块的填充字节);WavFile::to_bytes()按原顺序、原容器宽度(24-in-4)与原 channelMask 逐字节还原。 - 流式写接口
WavWriter:write增量追加 PCM、add_chunk/add_trailing_chunk插入扩展块、finish生成 WAV;简单布局(Int/≤2 声道/≤16 位)与 Extensible 布局输出都与encode_wav_ex逐字节一致。 info输出扩展块列表(文本 +--json的chunks数组)。
验证
- 测试 288 → 299:块保真逐字节往返(含 LIST/fact 奇数填充、24-in-4 + channelMask 往返)、WavWriter 与 encode_wav_ex 等价、错误分支(fmt 太短 / cbSize / validBits / 参数校验);覆盖率未覆盖行 682(CI 门禁 715)。
- CI 8 job 全绿(check×2、coverage、smoke、mp4·ffprobe、install、bench、fuzz);smoke/fuzz 同时覆盖 WAV 读路径回归。
安装:moon add WangYF0829/moonmux@0.7.0
mooncakes: https://mooncakes.io/docs/WangYF0829/moonmux
v0.6.0 — 性能基准与确定性变异测试
本期(2026-11-09)补齐工程能力:可复现的端到端性能基准与确定性变异测试,CI 新增两个 job。无库 API / 文件格式变更。
新增
scripts/bench.mjs(Node,无第三方依赖):在 release native CLI 上测verify/info/dump/remux/to-ogg/demux端到端耗时;自动把真实 Opus 样本复制成 16 条 serial 递增的链接流(≈1.0 MiB)作为大输入;多次运行取最小值。CIbench · nativejob 把表格写入 job summary(只记录、不设阈值)。scripts/fuzz.mjs:真实 Ogg Opus / Vorbis / MP4 / WAV 种子 × 6 类变异(翻位、块覆盖、截断、插入、删除、整段复制),以info/verify/seek/dump/to-ogg为靶;断言退出码只能是 0/1/2、无超时/崩溃;固定随机种子可复现。CIfuzz · mutationjob 跑 400 次迭代。- README 新增「性能基准」「变异测试」章节与实测数据;参考实现表增加 hyperfine/cargo bench、cargo-fuzz/AFL++ 的模式对照。
本机实测(Windows 11 x64,release native)
| 操作 | 输入 | 最小耗时 | 吞吐 |
|---|---|---|---|
| verify(CRC + 结构体检) | 1.02 MiB | 21.7 ms | 47 MB/s |
| info --json | 1.02 MiB | 17.6 ms | 58 MB/s |
| dump | 1.02 MiB | 18.2 ms | 56 MB/s |
| remux | 65 KiB | 16.9 ms | — |
| to-ogg | 66 KiB | 18.7 ms | — |
| demux | 65 KiB | 87.8 ms | — |
fuzz 本地 200 次:成功 121 / 数据或用法错误 79 / 异常 0。
安装:moon add WangYF0829/moonmux@0.6.0
mooncakes: https://mooncakes.io/docs/WangYF0829/moonmux
v0.5.0 — MP4 → Ogg 解封装(to-ogg,读写闭环)
本期(2026-11-09)新增反向解封装,把 MP4(Opus-in-MP4)还原成 Ogg Opus,与 v0.3.x 的 remux 形成读写闭环。
新增
mp4.demux_mp4_opus:解析stsd样本条目 /dOps配置(版本、声道、pre-skip、输入采样率、增益、映射族)、stts样本时长、stscchunk 映射、stsz样本大小、stco(含co64)偏移,按 chunk 切出 Opus 包;重建 OpusHead,输出最小 OpusTags,granule = pre-skip + 累计时长。to-ogg子命令:MP4 → Ogg Opus;写后回读自检(页可解析、首包 OpusHead、≥3 包);只支持单音轨 / Opus /mdhdtimescale=48000。
验证
- 测试 279 → 288(demux 闭环:音频包与 OpusHead 逐字节还原、二次 remux;坏表防御覆盖缺 moov/mdat/track 与 stts/stsc/stsz/stco/dOps 各分支;CLI 解析与 run_to_ogg I/O)。
- 真实样本
testdata/opus_sample.opus→ MP4 → Ogg:verify通过,303 个包中 301 个音频包 SHA256 与原始 Ogg 完全一致,ffprobe识别 opus/48000/1ch,ffmpeg解码无错。 scripts/smoke.sh4e 段与scripts/verify_mp4.sh第 6 段均加入反向闭环检查。- CI 6 job 全绿(check×2、coverage、smoke、mp4·ffprobe、install)。
安装:moon add WangYF0829/moonmux@0.5.0
mooncakes: https://mooncakes.io/docs/WangYF0829/moonmux
v0.4.0 — WAV 全格式兼容 + 流式页读取
本期(2026-11-09)新增:WAV 全格式兼容 + Ogg 增量流式页读取;v0.3.x 的 MP4 写入、remux、CRC 查表能力保留。
新增
- WAV 全格式(参照 Rust
hound语义独立实现):fmt 标签 1/3/0xFFFE、Extensible SubFormat GUID 全量比较、IEEE float 32/64、validBits与容器位深分离(24-in-4)、未知块跳过;新增WavFile.sample_format/bytes_per_sample与encode_wav_ex;encode_wav输出逐字节不变。 - 流式页读取(参照 libogg / RustAudio
ogg语义独立实现):ogg.PageReader分块喂入、按需取页、CRC 失步重同步、前缀垃圾/截断区间定位;for_each_page_chunked;任意分块与一次性parse_pages逐字节等价。 info输出 WAV 采样格式与容器位深(文本 +--json的sample_format/container_bits)。
质量
- 测试 259 → 279;覆盖率未覆盖行 644(门禁 675/685);CI 6 job 全绿(含 mp4 ffprobe 与 install 复验)。
- 参考实现与取舍写入 README「参考实现与取舍」与
docs/architecture.md。
安装:moon add WangYF0829/moonmux@0.4.0
mooncakes: https://mooncakes.io/docs/WangYF0829/moonmux
v0.3.2 — 最终交付版(MP4 写入 + remux + 覆盖率测试)
本期最终交付版本(2026-11-07):功能与 v0.3.0/0.3.1 一致,补齐覆盖率门禁所需的 I/O 层测试,并同步版本号。
内容
- MP4/ISOBMFF 写入(Opus-in-MP4)+
remux(Ogg Opus → .m4a)+info识别 MP4 - CRC-32 查表优化(输出与 RFC 3533 逐字节一致)
examples/三个可运行示例、docs/architecture.md、CHANGELOG.md- 测试 237 → 259;覆盖率未覆盖行 753 → 628(CI 门禁 ≤675)
- 外部验证:真实样本经 ffprobe(opus/48000/1ch/≈6.02s)与 ffmpeg 解码;干净工程 moon add 安装运行
安装:moon add WangYF0829/moonmux@0.3.2
mooncakes: https://mooncakes.io/docs/WangYF0829/moonmux
v0.3.1 — 版本号修正(推荐使用)
本版为 v0.3.0 的补丁:修正 moonmux version / 根包 describe() 输出的版本号(0.3.0 发布包中仍为 0.2.0)。无 API / 格式变更。
功能与 v0.3.0 相同:MP4/ISOBMFF 写入(Opus-in-MP4)、
emux(Ogg Opus → .m4a)、info 识别 MP4、CRC-32 查表、examples/、docs/architecture.md;252 个测试;真实样本经 ffprobe/ffmpeg 验证。
安装:moon add WangYF0829/moonmux@0.3.1
mooncakes: https://mooncakes.io/docs/WangYF0829/moonmux