Skip to content

Releases

v0.9.1 — 清单 I/O 退出码修复

Choose a tag to compare

@WangYF0829 WangYF0829 released this 10 Nov 04:58

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 — 第二轮正确性/契约修复

Choose a tag to compare

@WangYF0829 WangYF0829 released this 10 Nov 04:58

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 — 正确性修复

Choose a tag to compare

@WangYF0829 WangYF0829 released this 10 Nov 03:36

本版基于独立审阅(静态审查 + 动态复现)修复了容器层与 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 — 文档同步发布

Choose a tag to compare

@WangYF0829 WangYF0829 released this 09 Nov 15:37

本版为文档同步发布:无代码、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 块保真与流式写接口

Choose a tag to compare

@WangYF0829 WangYF0829 released this 09 Nov 14:34

本期(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 — 性能基准与确定性变异测试

Choose a tag to compare

@WangYF0829 WangYF0829 released this 09 Nov 14:17

本期(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)作为大输入;多次运行取最小值。CI bench · native job 把表格写入 job summary(只记录、不设阈值)。
  • scripts/fuzz.mjs:真实 Ogg Opus / Vorbis / MP4 / WAV 种子 × 6 类变异(翻位、块覆盖、截断、插入、删除、整段复制),以 info / verify / seek / dump / to-ogg 为靶;断言退出码只能是 0/1/2、无超时/崩溃;固定随机种子可复现。CI fuzz · mutation job 跑 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,读写闭环)

Choose a tag to compare

@WangYF0829 WangYF0829 released this 09 Nov 14:01

本期(2026-11-09)新增反向解封装,把 MP4(Opus-in-MP4)还原成 Ogg Opus,与 v0.3.x 的 remux 形成读写闭环。

新增

  • mp4.demux_mp4_opus:解析 stsd 样本条目 / dOps 配置(版本、声道、pre-skip、输入采样率、增益、映射族)、stts 样本时长、stsc chunk 映射、stsz 样本大小、stco(含 co64)偏移,按 chunk 切出 Opus 包;重建 OpusHead,输出最小 OpusTags,granule = pre-skip + 累计时长。
  • to-ogg 子命令:MP4 → Ogg Opus;写后回读自检(页可解析、首包 OpusHead、≥3 包);只支持单音轨 / Opus / mdhd timescale=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.sh 4e 段与 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 全格式兼容 + 流式页读取

Choose a tag to compare

@WangYF0829 WangYF0829 released this 09 Nov 13:45

本期(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 + 覆盖率测试)

Choose a tag to compare

@WangYF0829 WangYF0829 released this 07 Nov 09:43

本期最终交付版本(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 — 版本号修正(推荐使用)

Choose a tag to compare

@WangYF0829 WangYF0829 released this 07 Nov 09:31

本版为 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