改进: discover_video_params 硬编码 mid 值遍历 (webrtc.rs:314) #11

Closed
opened 2026-06-04 20:59:38 +08:00 by dailz · 1 comment
Owner

位置

src/webrtc.rs:314-316

严重性

🟢

问题描述

discover_video_params 固定遍历 ["0", "1", "2", "3"] 四个 mid 值来查找视频媒体。虽然 str0m 通常分配小整数 mid,但并非承诺行为——若未来版本或特定场景下 mid 为 "4" 或其他值,视频编码参数将无法被发现,导致后续 write_h264_framevideo_mid / video_ptNone 而静默跳过所有帧发送。

建议修复

查阅 str0m 0.20 是否提供 rtc.media_ids() 或类似迭代器来遍历所有媒体。如无此 API,至少应扩大范围并添加未找到时的 warning 日志:

for s in ["0", "1", "2", "3", "4", "5", "6", "7"] {
    let mid: Mid = s.into();
    if let Some(media) = self.rtc.media(mid) {
        if media.kind() == MediaKind::Video {
            tracing::info!("Found video media: mid={mid}");
            self.video_mid = Some(mid);
            break;
        }
    }
}
if self.video_mid.is_none() {
    tracing::warn!("No video media found in SDP");
}
## 位置 `src/webrtc.rs:314-316` ## 严重性 🟢 低 ## 问题描述 `discover_video_params` 固定遍历 `["0", "1", "2", "3"]` 四个 mid 值来查找视频媒体。虽然 str0m 通常分配小整数 mid,但并非承诺行为——若未来版本或特定场景下 mid 为 `"4"` 或其他值,视频编码参数将无法被发现,导致后续 `write_h264_frame` 因 `video_mid` / `video_pt` 为 `None` 而静默跳过所有帧发送。 ## 建议修复 查阅 str0m 0.20 是否提供 `rtc.media_ids()` 或类似迭代器来遍历所有媒体。如无此 API,至少应扩大范围并添加未找到时的 warning 日志: ```rust for s in ["0", "1", "2", "3", "4", "5", "6", "7"] { let mid: Mid = s.into(); if let Some(media) = self.rtc.media(mid) { if media.kind() == MediaKind::Video { tracing::info!("Found video media: mid={mid}"); self.video_mid = Some(mid); break; } } } if self.video_mid.is_none() { tracing::warn!("No video media found in SDP"); } ```
Author
Owner

修复方案

根因: discover_video_params 硬编码遍历 ["0","1","2","3"] 来查找 video media,但 str0m 的 Mid 是 SDP 协商决定的字符串标识符(如 "aud""video"),不是数字索引。若实际 mid 不在范围内,video 帧会被静默跳过。

修复:

  1. Event::MediaAdded 中直接捕获 video mid(str0m 事件提供准确的 midkind),并加 direction().is_sending() 方向校验
  2. 捕获后立即调用 discover_video_params 发现 H.264 payload type
  3. discover_video_params 移除硬编码遍历,改为幂等调用(先 video_pt = None 清除旧值)
  4. Event::Connected 中的调用保留为兜底(幂等)

改动文件: src/webrtc.rs(2 处)

提交: 1beaea8 fix(webrtc): use MediaAdded event to discover video mid instead of hardcoded iteration

## 修复方案 **根因**: `discover_video_params` 硬编码遍历 `["0","1","2","3"]` 来查找 video media,但 str0m 的 `Mid` 是 SDP 协商决定的字符串标识符(如 `"aud"`、`"video"`),不是数字索引。若实际 mid 不在范围内,video 帧会被静默跳过。 **修复**: 1. 在 `Event::MediaAdded` 中直接捕获 video mid(str0m 事件提供准确的 `mid` 和 `kind`),并加 `direction().is_sending()` 方向校验 2. 捕获后立即调用 `discover_video_params` 发现 H.264 payload type 3. `discover_video_params` 移除硬编码遍历,改为幂等调用(先 `video_pt = None` 清除旧值) 4. `Event::Connected` 中的调用保留为兜底(幂等) **改动文件**: `src/webrtc.rs`(2 处) **提交**: 1beaea8 fix(webrtc): use MediaAdded event to discover video mid instead of hardcoded iteration
dailz closed this issue 2026-06-06 21:17:44 +08:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/wl-webrtc#11