Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion docker/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,21 @@ pwsh ./tools/interop.ps1 `
[OBS 官方 SRT 指南](https://obsproject.com/kb/srt-protocol-streaming-guide)。测试 OBS 的
WebSocket 鉴权只在未暴露端口的临时容器内关闭,不是生产配置示例。

OBS 的 RTMP 发布和接收可以单独运行。脚本临时启动固定 digest 的 MediaMTX:发布侧
要求 ffprobe 读到 H.264/AAC、首帧 keyframe 与单调时间戳;接收侧由 OBS Media Source
读取 FLV 并截图。截图门槛会解码 PNG、还原行过滤器并检查像素颜色多样性,不以文件
大小猜测是否渲染成功:

```powershell
pwsh ./tools/interop.ps1 `
-EngineImage aimedia:gpu `
-PeerImage aimedia:test-tools `
-DesktopImage aimedia:desktop-tools `
-Suite rtmp-obs `
-DurationSeconds 20 `
-SkipToolBuild
```

VLC 的 SRT input module 位于 Ubuntu 的 `vlc-plugin-access-extra`,不能只根据
`vlc --version` 判断 SRT 可用。脚本先检查插件文件,再通过 raw dump 保存 aimedia
原始 TS;这样 ffprobe 检查的是引擎时间戳,而不是 VLC 重新 mux 后的时间戳。
Expand Down Expand Up @@ -187,4 +202,4 @@ pwsh ./tools/rtmp.ps1 `

报告验证 H.264/AAC profile、两段媒体的逐包时间戳、输出恢复后的首个 keyframe、节目
时钟连续性、输入/输出重连计数、p95 延迟、RSS、GPU surface、队列水位和运行镜像依赖。
短门禁不代替 OBS、真实 RTMPS 平台或两小时 soak。
短门禁和 OBS 门禁都不代替真实 RTMPS 平台或两小时 soak。
29 changes: 17 additions & 12 deletions docs/handoff.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 暂停交接:v0.3 Normalize & Bridge

更新时间:2026-08-06
更新时间:2026-08-10

暂停点:V3-03F1 的 RTMP 长连接 ACK 修复与 420 秒故障回归完成后
暂停点:V3-03F2OBS RTMP 发布、接收和实际渲染门槛完成后

Git 基线:`main` 的 `acc06d2`,交付分支 `codex/feat/rtmp-soak`
Git 基线:`main` 的 `6b86a7b`,交付分支 `codex/feat/rtmp-obs`

## 先读结论

Expand All @@ -26,14 +26,21 @@ Git 基线:`main` 的 `acc06d2`,交付分支 `codex/feat/rtmp-soak`
| RTMP/FLV 契约、会话、AVC/AAC 转换、listener、RTMP/RTMPS publisher | 已合并 | PR #32—#36 |
| RTMP FFmpeg -> aimedia -> MediaMTX 180/420 秒故障门禁 | 本交付 | PR #38;`docs/reports/rtmp.md` |
| RTMP publisher ACK 竞态修复 | 本交付 | PR #38;`anvsk/rtmp-rs@00e97a6` |
| RTMP OBS、真实平台、完整两小时 soak | 未完成 | 保持 `experimental` |
| OBS RTMP publisher/consumer 与实际渲染 | 本交付 | PR #39;`tools/interop.ps1 -Suite rtmp-obs`;`docs/reports/rtmp.md` |
| RTMP 真实平台、完整两小时 soak | 未完成 | 保持 `experimental` |
| v0.4 多输出与 AI Tap | 未开始 | 暂停期间不要开发 |

V3-03F 短门禁在 RTX 5060 Laptop + 577.12 上运行 180 秒。修复 ACK 竞态后又运行
420 秒:输入和输出各只有一次计划内重连,网络损伤为 40ms RTT、20ms 抖动、1% 丢包;
p95 141ms,音视频 PTS 单调,恢复片段首视频包为 keyframe,队列最高 1/1、surface
最高 3/4,运行镜像无 FFmpeg/libav。

V3-03F2 使用 OBS 30.0.2.1 完成两条 20 秒独立链路。OBS publisher 经 aimedia GPU
转码和 MediaMTX 后,ffprobe 读到 581 个 H.264 视频包与 948 个 AAC 音频包,首视频包
为 keyframe,PTS/DTS 单调。反向链路由 OBS Media Source 实际渲染 1280x720 彩条,
PNG 解码后检测到 13 种颜色;OBS、aimedia 均正常退出。运行镜像再次确认没有
FFmpeg/ffprobe 或 `libav*`。

两小时测试使用相同镜像启动,按用户要求在 2,911 秒主动停止,容器与网络已清理。停止
前输入/输出仍连接,重连 1/1,p95 72ms,RSS 约 229 MiB,隔离设备显存 180 MiB;因为
没有跑满且没有生成最终 `summary.json`,V3-03F4 必须保持未完成。
Expand Down Expand Up @@ -76,13 +83,11 @@ FFmpeg 和 MediaMTX 只属于测试端,不进入运行镜像。

按以下顺序关闭门槛:

1. 复用 `tools/obs.py` 的隔离 HOME 和 obs-websocket 方式,增加 OBS RTMP publisher 与
consumer 门禁;必须检查实际渲染帧和 ffprobe,不只看连接状态。
2. 用户提供测试直播账号或临时 stream key 后,验证至少两个 endpoint。建议一条国内
1. 用户提供测试直播账号或临时 stream key 后,验证至少两个 endpoint。建议一条国内
通用 RTMP/RTMPS、一条海外 RTMPS;凭证只通过环境变量或挂载文件传入,日志不得输出。
3. 如果上述互操作带来代码变更,先重新跑 420 秒 ACK 与故障回归;输入/输出重连必须
2. 如果上述互操作带来代码变更,先重新跑 420 秒 ACK 与故障回归;输入/输出重连必须
仍严格等于计划次数。
4. 用户允许继续长稳测试后,重新跑满 1080p30 两小时门禁并保存 summary/samples 到
3. 用户允许继续长稳测试后,重新跑满 1080p30 两小时门禁并保存 summary/samples 到
GitHub Release。不要把本次 2,911 秒的中止运行拼接或折算为通过:

```powershell
Expand All @@ -99,7 +104,7 @@ pwsh ./tools/rtmp.ps1 `
-SampleIntervalSeconds 30
```

5. 全部通过后才勾选 V3-03F、更新支持矩阵并考虑 v0.3 Release。
4. 全部通过后才勾选 V3-03F、更新支持矩阵并考虑 v0.3 Release。

本轮新增的 ACK 修复已经完成,无需下次重新定位:

Expand Down Expand Up @@ -183,5 +188,5 @@ pwsh ./tools/rtmp.ps1 -EngineImage aimedia:rtmp-next -DurationSeconds 420 `
## 暂停原则

本交付合并后按用户要求停止开发,不创建 v0.4 分支,不继续后台测试,也不发布“RTMP
已 supported”的社区广告。下次恢复时依次完成 V3-03F2 OBS、V3-03F3 真实平台和
V3-03F4 完整两小时长稳;优先补外部证据,不继续增加新协议或格式。
已 supported”的社区广告。下次恢复时依次完成 V3-03F3 真实平台和 V3-03F4 完整
两小时长稳;优先补外部证据,不继续增加新协议或格式。
13 changes: 4 additions & 9 deletions docs/reports/interop.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,11 @@ Media Source 读取 aimedia SRT 并截取实际渲染帧。
| 角色 | 运行时间 | 结果 |
|---|---:|---|
| OBS 作为输入 | 8s | 输出 300 个视频包、469 个音频包;首视频包为 keyframe;PTS/DTS 单调 |
| OBS 作为输出 | 8s | SRT 输入/输出均连接;渲染出 1,416 字节彩条 PNG;aimedia 退出码 0 |
| OBS 作为输出 | 8s | SRT 输入/输出均连接;渲染出 1,424 字节彩条 PNG,解码后检测到 16 种颜色;aimedia 退出码 0 |

两条场景的 obs-websocket controller 和 aimedia 均正常退出。当前本机临时桌面工具
镜像中的 OBS 在日志已经报告 `Number of memory leaks: 0` 后,于测试 teardown 阶段
出现 segmentation fault,因此报告中的 `cleanShutdown=false`。这不改变媒体互操作
结果,但也不把测试工具退出质量伪装为通过。仓库中的 `desktop` target 已改用固定
Ubuntu 基础镜像,避免继承 FFmpeg 工具镜像的第二套 libav/libsrt;本机受镜像源下载
速度影响,尚未完成该纯净 target 的全量重建。
两条场景的 obs-websocket controller、OBS 和 aimedia 均正常退出。桌面工具镜像使用
固定 Ubuntu 基础镜像,避免继承 FFmpeg 工具镜像的第二套 libav/libsrt。渲染门槛会
解码 PNG 像素并检查颜色多样性,不再以压缩后文件大小推断画面是否有效。

## VLC 输出

Expand Down Expand Up @@ -114,8 +111,6 @@ SRT 突发交付时替换仍然有效的帧,因此 V2-09 将它收紧为容量

- 延迟 output listener 的 NVDEC 205 已有失败对照、容量 1 背压和零丢帧修复回归;
V2-09 的两小时 1080p30 soak、延迟 p95 和 RSS/GPU 内存趋势由独立性能报告记录。
- OBS 的 `cleanShutdown=false` 是当前本机测试工具镜像的独立已知问题;它不会改写
aimedia 的退出码或媒体结果。
- 本报告证明 v0.2 支持范围内的外部互操作,不证明 RTMP、RTSP、H.265、缩放、变帧率
或双路导播能力。

Expand Down
31 changes: 28 additions & 3 deletions docs/reports/rtmp.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@

测试包含输入 publisher 中断、输出 MediaMTX 中断,以及 40ms RTT、20ms 抖动、1%
丢包。全部自动 gate 通过。420 秒回归还跨过了多个 RTMP ACK 窗口,输入和输出各只有
一次计划内重连。它证明 FFmpeg、MediaMTX 和明文 RTMP 的短时互操作及故障恢复,不替代
OBS、RTMPS 真实平台或两小时稳定性验证,因此状态仍是 `experimental`。
一次计划内重连。2026-08-10 又完成 OBS 作为 publisher 和 consumer 的双向门槛,
包含实际渲染与 ffprobe。它证明 FFmpeg、OBS、MediaMTX 和明文 RTMP 的短时互操作及
故障恢复,不替代 RTMPS 真实平台或两小时稳定性验证,因此状态仍是 `experimental`。

## 可复现环境

Expand All @@ -23,6 +24,10 @@ OBS、RTMPS 真实平台或两小时稳定性验证,因此状态仍是 `experi
| 视频 | H.264 Main、1920x1080、30fps、6Mbps、无 B 帧、1 秒 GOP |
| 音频 | AAC-LC、48kHz、双声道、128kbps |

OBS 门槛额外使用 OBS Studio 30.0.2.1 和桌面工具镜像
`sha256:e5c63696b818430e389765a15c09d8d6340228464c94bea6bc95b2356d6215f0`;引擎镜像为
`sha256:ea041dba0836edd9d9d6774553ee49f5a55579cf185df793f022936f42b3435d`。

运行命令:

```powershell
Expand Down Expand Up @@ -56,6 +61,27 @@ pwsh ./tools/rtmp.ps1 `
网络损伤在 110—130 秒注入。结束时输入和输出均为连接状态,输出断线期间没有建立
历史媒体队列;重连后从新的 SPS/PPS 与 IDR 恢复,节目时钟没有回退。

### OBS publisher 与 consumer

`tools/interop.ps1 -Suite rtmp-obs` 启动两条隔离场景,每条使用独立 OBS HOME、
obs-websocket 控制器和 aimedia 管线:

| 场景 | 自动验收结果 |
|---|---|
| OBS publisher -> aimedia -> MediaMTX -> ffprobe | OBS/aimedia 正常退出;输入/输出 connected;581 个 H.264 视频包、948 个 AAC 音频包;首视频包为 keyframe;PTS/DTS 单调 |
| FFmpeg 测试源 -> aimedia -> MediaMTX -> OBS consumer | OBS/aimedia 正常退出;H.264 1280x720;AAC 48kHz 双声道;渲染 PNG 869 bytes,解码后 13 种颜色 |

第二条场景先由 ffprobe 确认 MediaMTX 已发布 H.264/AAC,再要求 OBS Media Source
截取真实画面。PNG 文件大小不作为通过依据;控制器使用标准库解压像素、还原 PNG
filter,并要求至少 4 种颜色,从而拒绝黑帧、空帧和无效占位图。

本机汇总位于
`C:\Users\anvsk\AppData\Local\Temp\aimedia-interop-ca8b327d\summary.json`,SHA-256 为
`A33EE13209444F303C4F12FD7A06124713C9BCE31BF5FA4243CACBBB1B8D5E65`。同一版本还跑了
8 秒 SRT/OBS 回归:publisher 输出 300/469 个视频/音频包,consumer 截图检测到 16 种
颜色;汇总 SHA-256 为
`B2C3FF6ECD305CB3958D1A7FE85089EEB9F13249E2FC614C3A710CEAB147173C`。

### 420 秒 ACK 与重连回归

修复后镜像 `sha256:ea041dba0836edd9d9d6774553ee49f5a55579cf185df793f022936f42b3435d`
Expand Down Expand Up @@ -126,7 +152,6 @@ Release 附件保存并在报告中记录下载地址与哈希。

## 尚未完成

- OBS 作为 RTMP publisher 和 consumer 的真实互操作;
- 至少两个真实直播平台 endpoint,包括 RTMPS 证书与鉴权错误路径;
- 1080p30 两小时 GPU soak;
- 上述门槛完成前不把 RTMP/RTMPS 从 `experimental` 升为 `supported`。
7 changes: 6 additions & 1 deletion docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,12 @@ v0.3 工程。只有 V2-11 也完成后,总览才把 v0.2 标记为完全完
和 [RTMP 互操作报告](reports/rtmp.md)。后续 420 秒回归跨过多个 ACK 窗口,输入/
输出重连严格为计划内 1/1,p95 141ms;两小时测试按用户要求在 2,911 秒停止,
不计入 F4。
- [ ] V3-03F2:OBS 作为 RTMP publisher 与 consumer,包含实际渲染和 ffprobe。
- [x] V3-03F2:OBS 30.0.2.1 作为 RTMP publisher 与 consumer。发布链由 ffprobe
确认 H.264/AAC、首帧 keyframe 和 PTS/DTS 单调;接收链由 OBS Media Source
渲染 1280x720 彩条,并通过 PNG 解码后的颜色多样性确认不是黑帧或空图。两条链路
的 OBS、aimedia 均正常退出;证据见 `tools/interop.ps1` 的 `rtmp-obs` suite 和
[RTMP 互操作报告](reports/rtmp.md)。交付:
[PR #39](https://github.com/anvsk/aimedia/pull/39)。
- [ ] V3-03F3:至少两个真实平台 endpoint,覆盖 RTMPS 证书和鉴权路径。
- [ ] V3-03F4:1080p30 两小时 GPU soak、资源趋势和原始证据附件。2026-08-06 的
一次运行在 2,911 秒按用户要求主动停止;容器已清理,部分样本已记录,但该门槛
Expand Down
4 changes: 2 additions & 2 deletions docs/support-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
| H.264 Annex-B / AAC ADTS parser | supported | NAL/frame、关键帧和 Alpha profile header |
| BS.1770/4x true-peak DSP | foundation | 响度、增益、淡化和 limiter 已实现;AAC 帧级 codec 已就绪,待接运行时音频链 |
| SRT caller/listener | supported | libsrt 1.5.5 adapter、epoll、指数退避和断开后 native 重连已测;caller/listener 四种组合、断流恢复、1% 丢包/20ms 抖动/40ms RTT 及两小时长稳已验证 |
| RTMP listener input + FLV | experimental | 明文 `rtmp://` listener、H.264 Annex-B/AVCC 与 AAC ADTS/raw 转换已接入单路 `aimedia run`。FFmpeg 8.1.2 -> aimedia -> MediaMTX 的 180 秒门禁和 420 秒故障回归已通过;后者输入/输出重连严格为计划内 1/1。已修复握手前控制输出和长连接 ACK 竞态。OBS、真实硬件编码器和两小时 soak 未完成 |
| RTMP/RTMPS publisher output | experimental | 编码后的 H.264 Annex-B/AAC ADTS 直接进入有界 publisher;RTMPS 使用 rustls 与公开 WebPKI 信任根校验证书和主机名。MediaMTX 回归验证了输出断线、无历史积压、重连后配置/IDR、节目 PTS 连续和 p95 141ms;OBS至少两个真实平台 endpoint、RTMPS 实站和两小时 soak 未完成,不能标记为 supported |
| RTMP listener input + FLV | experimental | 明文 `rtmp://` listener、H.264 Annex-B/AVCC 与 AAC ADTS/raw 转换已接入单路 `aimedia run`。FFmpeg 8.1.2 -> aimedia -> MediaMTX 的 180 秒门禁和 420 秒故障回归已通过;后者输入/输出重连严格为计划内 1/1。OBS 30.0.2.1 发布链也已由 ffprobe 验证 H.264/AAC、首帧 keyframe 和单调时间戳。真实硬件编码器、真实平台和两小时 soak 未完成 |
| RTMP/RTMPS publisher output | experimental | 编码后的 H.264 Annex-B/AAC ADTS 直接进入有界 publisher;RTMPS 使用 rustls 与公开 WebPKI 信任根校验证书和主机名。MediaMTX 回归验证了输出断线、无历史积压、重连后配置/IDR、节目 PTS 连续和 p95 141ms;OBS Media Source 已实际渲染 1280x720 输出。至少两个真实平台 endpoint、RTMPS 实站和两小时 soak 未完成,不能标记为 supported |
| RTSP/RTP input | experimental | `aimedia run` 已接 TCP interleaved 单路数据面:H.264/AAC-LC/G.711 直接进入有界 codec 队列,G.711 8kHz 单声道归一到 48kHz 双声道;MediaMTX 1.20.0 + FFmpeg 发布端已通过 180 秒 GPU 闭环、发布源 404 重连和 40ms RTT/20ms 抖动/1% 丢包短门禁,p95 90ms 且输出时间戳零回退。H.265 可重组为 Annex-B access unit,但 HEVC bridge 仍返回 `videoBridgePending`;UDP、非 48kHz 双声道 AAC、物理摄像机认证和两小时长稳未完成,不代表 GB28181 支持 |
| 多输出与 Analyzer Tap | planned | v0.4;每个支路独立有界并与媒体主链隔离 |
| WHIP output | planned | v0.6 以后按真实服务采用证据评估;H.264/Opus |
Expand Down
Loading
Loading