Skip to content

feat(media): SRS WebRTC streaming via mediamtx push-to-RTMP#11

Merged
xinquiry merged 2 commits into
mainfrom
feature/srs-webrtc-streaming
Jun 20, 2026
Merged

feat(media): SRS WebRTC streaming via mediamtx push-to-RTMP#11
xinquiry merged 2 commits into
mainfrom
feature/srs-webrtc-streaming

Conversation

@xinquiry

@xinquiry xinquiry commented Jun 20, 2026

Copy link
Copy Markdown
Collaborator

Summary

Make the optional SRS path actually work end-to-end so teammates can view cameras over WHEP. Previously the code advertised a webrtc://host/path URL that no client could fetch and bound mediamtx WebRTC to the same UDP port SRS needs (8000), so the two coexisted in config but never both worked at runtime.

  • mediamtx: new webrtc_udp ListenerPort (default :8189), rendered as webrtcLocalUDPAddress. When any path has push_to, force RTSP TCP-only and zero out RTP/RTCP UDP to free host UDP 8000 for SRS. Always-on the source for push_to paths so the upstream pull doesn't deadlock waiting on a local viewer.
  • endpoints: emit a real WHEP URL — http://<webrtc_host>/rtc/v1/whep/?app=<app>&stream=<id>&codec=h264. WHEP is HTTP-POST-application/sdp; H.264 pinned so Electron builds with optional HEVC don't trip SRS into a codec path Chrome never offers.
  • onvif_camera: default to H.264 passthrough (was HEVC). Production cameras already emit H.264 Baseline; the {id}_h264 transcode path becomes opt-in for legacy gear that can't be reconfigured. Push the passthrough path with -c copy when transcoding is off; otherwise push {id}_h264.
  • recipes: cameras-jzt31.yaml now wires remote_rtmp against the local SRS dev compose (1935/1985/18085); onvif-camera.yaml and media-gateway.md updated to match.

Pairs with the Xyzen team-channel SRS WebRTC PR.

Test plan

  • cargo check --all-features clean
  • cargo test --all-features — all 161 tests pass
  • Bring up dev Xyzen + SRS compose, confirm cam131 reaches the team-channel viewer over WHEP at http://localhost:1985/rtc/v1/whep/?app=live&stream=cam131&codec=h264
  • Confirm local mediamtx WHEP at :8889/<id>/whep still works while the camera is also pushed to SRS
  • Confirm RTSP-TCP-only mode doesn't break HLS / FLV egress on the SRS-pushing path

🤖 Generated with Claude Code

Summary by Sourcery

集成可选的 SRS RTMP/WebRTC 采集到 mediamtx 中,同时保留本地 WebRTC,并调整摄像头默认配置和文档以支持基于 H.264 直通的流媒体。

New Features:

  • 添加可配置的 mediamtx WebRTC UDP 监听器,以便与运行在 UDP 8000 端口上的 SRS WebRTC 共存。
  • 将远程 SRS WHEP HTTP URL 暴露为媒体端点,用于配置了远程 RTMP 采集的摄像头。

Bug Fixes:

  • 确保 mediamtx 避免绑定 UDP 8000,并在任意路径向 SRS 推流时保持源始终在线,从而防止本地 WebRTC 与 SRS 之间的死锁和端口冲突。

Enhancements:

  • 将基于转码的摄像头推流从 ffmpeg 直接路由到 SRS FLV/RTMP,而不再通过 mediamtx tee 分路;同时将直通模式的推流保留给非转码路径。
  • 将 ONVIF 摄像头默认配置和配方(recipes)调整为 H.264 直通,将可选转码迁移到旧有部署中,同时将示例摄像头接入本地 SRS 开发栈。
  • 优化本地与远程端点生成逻辑,确保本地 WebRTC 始终被发布,而远程 WebRTC 使用兼容 SRS 的 WHEP URL,并带有明确的 H.264 编码提示。

Documentation:

  • 扩展媒体网关和 ONVIF 摄像头配方,加入详细的 SRS 开发环境搭建说明、远程采集配置、浏览器回退顺序以及更新后的以 H.264 为核心的摄像头示例。
Original summary in English

Summary by Sourcery

Integrate optional SRS RTMP/WebRTC ingest with mediamtx while preserving local WebRTC, and adjust camera defaults and docs for H.264 passthrough-based streaming.

New Features:

  • Add configurable mediamtx WebRTC UDP listener to coexist with SRS WebRTC on UDP 8000.
  • Expose remote SRS WHEP HTTP URLs as media endpoints for cameras configured with remote RTMP ingest.

Bug Fixes:

  • Ensure mediamtx avoids binding UDP 8000 and keeps sources always-on when any path pushes to SRS, preventing deadlocks and port conflicts between local WebRTC and SRS.

Enhancements:

  • Route transcode-based camera pushes directly from ffmpeg to SRS FLV/RTMP without teeing through mediamtx, and reserve passthrough-based pushes for non-transcoded paths.
  • Default ONVIF camera configs and recipes to H.264 passthrough, shifting optional transcoding to legacy deployments while wiring example cameras to the local SRS dev stack.
  • Refine local and remote endpoint generation so local WebRTC is always advertised and remote WebRTC uses SRS-compatible WHEP URLs with explicit H.264 codec hints.

Documentation:

  • Expand media gateway and ONVIF camera recipes with detailed SRS dev setup, remote ingest configuration, browser fallback order, and updated H.264-centric camera examples.

Make the optional SRS path actually work end-to-end so teammates can
view cameras over WHEP. The previous implementation advertised a
`webrtc://host/path` URL that no client could fetch and bound mediamtx
WebRTC to the same UDP port SRS needs (8000), so the two coexisted in
config but never both worked at runtime.

- mediamtx: new `webrtc_udp` ListenerPort (default :8189), rendered as
  `webrtcLocalUDPAddress`. When any path has `push_to`, force RTSP to
  TCP-only and zero out RTP/RTCP UDP — that frees host UDP 8000 for
  SRS. Always-on the source for `push_to` paths so the upstream pull
  doesn't deadlock waiting on a local viewer.
- endpoints: build a real WHEP URL —
  `http://<webrtc_host>/rtc/v1/whep/?app=<app>&stream=<id>&codec=h264`.
  Real http(s):// because WHEP is HTTP-POST-application/sdp; pinned to
  H.264 so Electron builds with optional HEVC don't trip SRS into a
  codec path Chrome never offers.
- onvif_camera: default to H.264 passthrough (was HEVC). Production
  cameras already emit H.264 Baseline; the `{id}_h264` transcode path
  becomes opt-in for legacy gear that can't be reconfigured. When
  transcoding is on, push the `{id}_h264` path; otherwise push the
  passthrough path with `-c copy`.
- recipes: cameras-jzt31.yaml now wires `remote_rtmp` against the local
  SRS dev compose (1935/1985/18085); onvif-camera.yaml and
  media-gateway.md updated to match.
@sourcery-ai

sourcery-ai Bot commented Jun 20, 2026

Copy link
Copy Markdown

审查者指南(Reviewer's Guide)

通过调整 mediamtx 监听器配置以避免 UDP 8000 端口冲突、改变 push-to-RTMP 通过 ffmpeg 的接线方式、将 ONVIF 摄像头默认为 H.264 直通并提供可选的 H.264 转码来承载远程推流、以及更新端点生成逻辑和文档/示例,以输出真实的 SRS WHEP URL 和开发环境中 SRS 的接线,从而实现端到端的 SRS WebRTC(WHEP)支持。

文件级变更

变更 详情 文件
添加专用的 mediamtx WebRTC UDP 监听器,并在任意路径推送到远程时为 SRS 保留 UDP 8000,同时保持本地 WHEP 可用。
  • 扩展 ListenerPorts,新增 webrtc_udp 并默认设为 8189,将其接入生成 YAML 中的 webrtcLocalUDPAddress。
  • 引入 should_reserve_udp_8000_for_remote,用于检测 push_to 路径,并在存在时强制将 rtspTransports 设为 [tcp],并将 RTP/RTCP/多播 UDP 端口清零。
  • 重构 render_config 和 MediamtxProcess::spawn 的签名/格式,同时保持校验与启动行为不变。
crates/osdl-core/src/media/mediamtx.rs
重构针对转码/推流路径的 ffmpeg 编排,使 SRS 推流来自单一编码进程,同时直通路径仍通过 -c copy 进行推流。
  • 对于 transcode_from 路径,使 push_to 意味着“始终开启”(sourceOnDemand: no),并在设置了 push_to 时,将 runOnInit/runOnDemand 命令改为直接输出 FLV/RTMP,避免使用 tee 和 runOnReady 钩子。
  • 对仅转码(非推流)路径保留 RTSP 输出路径,使本地 mediamtx 的 H.264 路径仍按原有方式工作。
  • 将基于 runOnReady 的 push_to 限制为纯直通路径(无 transcode_from),并保持它们作为 -c copy 的 FLV 推流,走 RTSP-over-TCP。
  • 更新测试以断言新的 push_to 行为(无 tee、FLV 输出、始终开启),并保持配置校验的保证。
crates/osdl-core/src/media/mediamtx.rs
更改 ONVIF 摄像头默认行为为 H.264 直通,在主路径和 H.264 路径之间移动远程 RTMP 推流的归属,并明确 RemoteRtmpConfig 语义。
  • 调整 OnvifCameraConfig 文档和 produces_h264_path 语义,将摄像头默认视为 H.264-baseline,并将转码视为可选兜底方案。
  • 修改 paths():当 h264_transcode 为 false 时,由主路径携带 push_to;当为 true 时,将 push_to 移动到生成的 {id}_h264 路径,而主路径变为仅本地。
  • 明确 RemoteRtmpConfig.webrtc_host 为 host:port,并更新 pushes_to_remote,反映出任何 remote_rtmp 现在都意味着有推流,不再受 h264_transcode 是否开启的影响。
  • 更新 onvif_camera 测试以反映新的推流归属及生产默认值。
crates/osdl-core/src/media/onvif_camera.rs
输出正确的远程 SRS 端点,包括带 app/stream 查询参数及显式 H.264 codec 的 HTTP WHEP URL,同时保留本地 mediamtx 端点。
  • 优化 MediaSourceConfig::endpoints,先在循环中生成 RTSP 和 HLS 端点,再单独添加 WebRTC 端点,并通过注释解释本地 WebRTC 与远程 ingest 的共存关系。
  • 修改 build_remote_endpoints,生成形如 http://<webrtc_host>/rtc/v1/whep/?app=<app>&stream=<stream>&codec=h264 的 SRS WHEP URL,替代原来的 webrtc:// URL,并在 app 为空时默认为 "live"。
  • 保留现有的远程 RTMP/FLV/HLS 端点,但调整格式和注释以提升清晰度。
crates/osdl-core/src/media/mod.rs
更新文档和示例配置,以描述 SRS 开发环境搭建、新的 WHEP URL,以及“优先 H.264”摄像头配置。
  • 扩展 media-gateway.md,新增一个完整章节介绍通过 SRS 的远程 ingest,包括本地开发端口、WHEP 路径、UDP 8000 约束以及浏览器回退顺序。
  • 重写 cameras-jzt31.yaml,使其假设 H.264 直通,将 cam131/cam53 接入本地开发 SRS(1935/18085/1985),并在注释中说明本地/远程 WebRTC URL。
  • 调整 onvif-camera.yaml 中示例 remote_rtmp 配置块,使其使用 localhost 开发 SRS 端口,并明确 http_host/webrtc_host 的角色。
docs/recipes/media-gateway.md
docs/recipes/configs/cameras-jzt31.yaml
docs/recipes/configs/onvif-camera.yaml

提示与命令

与 Sourcery 交互

  • 触发新的审查: 在 Pull Request 中评论 @sourcery-ai review
  • 继续讨论: 直接回复 Sourcery 的审查评论。
  • 从审查评论生成 GitHub issue: 通过回复审查评论,请求 Sourcery 从该评论创建一个 issue。你也可以在审查评论中回复 @sourcery-ai issue 来从该评论创建 issue。
  • 生成 Pull Request 标题: 在 Pull Request 标题中任意位置写入 @sourcery-ai 来随时生成标题。你也可以在 Pull Request 中评论 @sourcery-ai title 来(重新)生成标题。
  • 生成 Pull Request 摘要: 在 Pull Request 描述正文任意位置写入 @sourcery-ai summary,即可在该位置生成 PR 摘要。你也可以在 Pull Request 中评论 @sourcery-ai summary 来在任意时间(重新)生成摘要。
  • 生成审查者指南: 在 Pull Request 中评论 @sourcery-ai guide,即可在任意时间(重新)生成审查者指南。
  • 解决所有 Sourcery 评论: 在 Pull Request 中评论 @sourcery-ai resolve,以解决所有 Sourcery 评论。当你已经处理完所有评论且不希望再看到它们时,这会很有用。
  • 撤销所有 Sourcery 审查: 在 Pull Request 中评论 @sourcery-ai dismiss,以撤销所有现有的 Sourcery 审查。特别适用于你想从头开始一次新审查的场景——别忘了再评论 @sourcery-ai review 来触发新的审查!

自定义你的体验

访问你的 控制面板 以:

  • 启用或禁用审查功能,例如 Sourcery 生成的 Pull Request 摘要、审查者指南等。
  • 更改审查语言。
  • 添加、移除或编辑自定义审查指令。
  • 调整其他审查设置。

获取帮助

Original review guide in English

Reviewer's Guide

Implements end-to-end SRS WebRTC (WHEP) support by adjusting mediamtx listener configuration to avoid UDP 8000 conflicts, changing how push-to-RTMP is wired through ffmpeg, defaulting ONVIF cameras to H.264 passthrough with optional H.264 transcode carrying the remote push, and updating endpoint generation and docs/recipes to emit real SRS WHEP URLs and dev SRS wiring.

File-Level Changes

Change Details Files
Add dedicated mediamtx WebRTC UDP listener and reserve UDP 8000 for SRS when any path pushes to remote, while keeping local WHEP functional.
  • Extend ListenerPorts with webrtc_udp and default it to 8189, wiring it into webrtcLocalUDPAddress in the generated YAML.
  • Introduce should_reserve_udp_8000_for_remote to detect push_to paths and, when present, force rtspTransports to [tcp] and zero out RTP/RTCP/multicast UDP ports.
  • Refactor render_config and MediamtxProcess::spawn signatures/formatting while keeping validation and startup behavior intact.
crates/osdl-core/src/media/mediamtx.rs
Rework ffmpeg orchestration for transcode/push paths so SRS pushes come from a single encoder process and passthrough paths still push via -c copy.
  • For transcode_from paths, make push_to imply always-on (sourceOnDemand: no) and change runOnInit/runOnDemand commands to output directly to FLV/RTMP when push_to is set, avoiding tee and runOnReady hooks.
  • Retain the RTSP output path for transcode-only (non-push) paths, so local mediamtx H.264 paths still work as before.
  • Limit runOnReady-based push_to to pure passthrough paths (no transcode_from) and keep them as -c copy FLV pushes over RTSP-over-TCP.
  • Update tests to assert new push_to behavior (no tee, FLV output, always-on) and to maintain config validation guarantees.
crates/osdl-core/src/media/mediamtx.rs
Change ONVIF camera defaults to H.264 passthrough, move remote RTMP push ownership between main and H.264 paths, and clarify RemoteRtmpConfig semantics.
  • Adjust OnvifCameraConfig docs and produces_h264_path semantics to treat cameras as H.264-baseline by default, with transcode as an opt-in fallback.
  • Modify paths() so that when h264_transcode is false, the main path carries push_to; when true, push_to is moved to the generated {id}_h264 path and the main path becomes local-only.
  • Clarify RemoteRtmpConfig.webrtc_host as host:port, and update pushes_to_remote to reflect that any remote_rtmp now implies a push regardless of h264_transcode.
  • Update onvif_camera tests to reflect new push placement and production defaults.
crates/osdl-core/src/media/onvif_camera.rs
Emit correct remote SRS endpoints, including HTTP WHEP URLs with app/stream query params and explicit H.264 codec, while preserving local mediamtx endpoints.
  • Refine MediaSourceConfig::endpoints to generate RTSP and HLS endpoints in a loop, then add WebRTC endpoints separately, with comments clarifying coexistence of local WebRTC and remote ingest.
  • Change build_remote_endpoints to generate SRS WHEP URLs of the form http://<webrtc_host>/rtc/v1/whep/?app=&stream=&codec=h264 instead of webrtc:// URLs, and default empty app to "live".
  • Keep existing remote RTMP/FLV/HLS endpoints but adjust formatting and comments for clarity.
crates/osdl-core/src/media/mod.rs
Update documentation and example configs to describe SRS dev setup, new WHEP URLs, and H.264-first camera configuration.
  • Expand media-gateway.md with a full section on remote ingest via SRS, including local dev ports, WHEP path, UDP 8000 constraints, and browser fallback order.
  • Rework cameras-jzt31.yaml to assume H.264 passthrough, wire cam131/cam53 to a local dev SRS (1935/18085/1985), and mention local/remote WebRTC URLs in comments.
  • Adjust onvif-camera.yaml sample remote_rtmp block to use localhost dev SRS ports and clarify http_host/webrtc_host roles.
docs/recipes/media-gateway.md
docs/recipes/configs/cameras-jzt31.yaml
docs/recipes/configs/onvif-camera.yaml

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - 我发现了 1 个问题,并留下了一些高层次的反馈:

  • render_config_unchecked 函数现在内联了两段很长且大部分重复的 ffmpeg 命令字符串,分别用于转码和推流场景;建议把共享的参数(编解码器、时延调节、音频设置等)抽取成辅助构造器或常量,这样以后修改时不需要同时改两处,从而避免行为漂移的风险。
  • should_reserve_udp_8000_for_remote 当前只要任一路径设置了 push_to 就会保留 UDP 8000,隐含假设推流目标是 SRS;如果还有其他不需要该端口的 RTMP/RTSP 后端,你可能需要一个更明确的标志(例如 reserve_webrtc_udp_for_srs),或基于 scheme/host 的检查,以避免对 mediamtx 传输施加不必要的约束。
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The `render_config_unchecked` function now embeds two large, mostly duplicated ffmpeg command strings for the transcode + push cases; consider factoring out shared flags (codec, latency knobs, audio settings) into helper builders or constants so future changes don’t need to touch both branches and risk drifting behaviour.
- `should_reserve_udp_8000_for_remote` currently reserves UDP 8000 whenever any path has `push_to` set, implicitly assuming push targets are SRS; if other RTMP/RTSP backends are used that don’t need this port, you may want a more explicit flag (e.g. `reserve_webrtc_udp_for_srs`) or a scheme/host check to avoid unnecessarily constraining mediamtx transports.

## Individual Comments

### Comment 1
<location path="docs/recipes/media-gateway.md" line_range="119-121" />
<code_context>
+OpenFGA `network-service` already occupies 8080. See
+`docker/docker-compose.srs.yaml`.)
+
+If your dev host port 1935/18085/1985 is taken, override via
+`SRS_RTMP_PORT` / `SRS_HTTP_PORT` / `SRS_API_PORT` in
+`docker/.env.dev`.
+
</code_context>
<issue_to_address>
**nitpick (typo):** Consider rephrasing the "dev host port 1935/18085/1985" clause for grammatical agreement and clarity.

Using singular "port" with a slash-separated list can be confusing. Consider pluralizing and listing them with commas, e.g., "If any of the dev host ports 1935, 18085, or 1985 are taken, override via ..." to improve clarity and agreement.

```suggestion
If any of the dev host ports 1935, 18085, or 1985 are taken, override via
`SRS_RTMP_PORT` / `SRS_HTTP_PORT` / `SRS_API_PORT` in
`docker/.env.dev`.
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
帮我变得更有用!请在每条评论上点击 👍 或 👎,我会根据你的反馈改进后续的代码审查。
Original comment in English

Hey - I've found 1 issue, and left some high level feedback:

  • The render_config_unchecked function now embeds two large, mostly duplicated ffmpeg command strings for the transcode + push cases; consider factoring out shared flags (codec, latency knobs, audio settings) into helper builders or constants so future changes don’t need to touch both branches and risk drifting behaviour.
  • should_reserve_udp_8000_for_remote currently reserves UDP 8000 whenever any path has push_to set, implicitly assuming push targets are SRS; if other RTMP/RTSP backends are used that don’t need this port, you may want a more explicit flag (e.g. reserve_webrtc_udp_for_srs) or a scheme/host check to avoid unnecessarily constraining mediamtx transports.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The `render_config_unchecked` function now embeds two large, mostly duplicated ffmpeg command strings for the transcode + push cases; consider factoring out shared flags (codec, latency knobs, audio settings) into helper builders or constants so future changes don’t need to touch both branches and risk drifting behaviour.
- `should_reserve_udp_8000_for_remote` currently reserves UDP 8000 whenever any path has `push_to` set, implicitly assuming push targets are SRS; if other RTMP/RTSP backends are used that don’t need this port, you may want a more explicit flag (e.g. `reserve_webrtc_udp_for_srs`) or a scheme/host check to avoid unnecessarily constraining mediamtx transports.

## Individual Comments

### Comment 1
<location path="docs/recipes/media-gateway.md" line_range="119-121" />
<code_context>
+OpenFGA `network-service` already occupies 8080. See
+`docker/docker-compose.srs.yaml`.)
+
+If your dev host port 1935/18085/1985 is taken, override via
+`SRS_RTMP_PORT` / `SRS_HTTP_PORT` / `SRS_API_PORT` in
+`docker/.env.dev`.
+
</code_context>
<issue_to_address>
**nitpick (typo):** Consider rephrasing the "dev host port 1935/18085/1985" clause for grammatical agreement and clarity.

Using singular "port" with a slash-separated list can be confusing. Consider pluralizing and listing them with commas, e.g., "If any of the dev host ports 1935, 18085, or 1985 are taken, override via ..." to improve clarity and agreement.

```suggestion
If any of the dev host ports 1935, 18085, or 1985 are taken, override via
`SRS_RTMP_PORT` / `SRS_HTTP_PORT` / `SRS_API_PORT` in
`docker/.env.dev`.
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread docs/recipes/media-gateway.md Outdated
Address PR #11 review feedback.

- Add `pushes_to_srs: bool` to `MediaPath` and check that flag (renamed
  to `should_reserve_webrtc_udp_for_srs`) instead of `push_to.is_some()`
  when deciding whether to free host UDP 8000. Generic RTMP relays
  (Twitch, YouTube, etc.) no longer trigger the gateway's TCP-only RTSP
  fallback. `OnvifCameraConfig::paths()` sets the flag when
  `remote_rtmp.webrtc_host` is configured — the unambiguous "this push
  feeds a server we'll also read over WHEP" signal.
- Extract the libx264/AAC encoder flags into FFMPEG_H264_LOWLATENCY_-
  ENCODE so the rtsp-republish and direct-RTMP-push branches share one
  encoder string. Future tuning lands in one place instead of two.
- Add a regression test contrasting SRS push (forces TCP-only) with a
  generic RTMP relay (transports unchanged).
- docs/recipes/media-gateway.md: rephrase the dev-port-override hint.
@xinquiry xinquiry merged commit a999b37 into main Jun 20, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant