forsin["0","1","2","3","4","5","6","7"]{letmid: Mid=s.into();ifletSome(media)=self.rtc.media(mid){ifmedia.kind()==MediaKind::Video{tracing::info!("Found video media: mid={mid}");self.video_mid=Some(mid);break;}}}ifself.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");
}
```
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
位置
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 日志:修复方案
根因:
discover_video_params硬编码遍历["0","1","2","3"]来查找 video media,但 str0m 的Mid是 SDP 协商决定的字符串标识符(如"aud"、"video"),不是数字索引。若实际 mid 不在范围内,video 帧会被静默跳过。修复:
Event::MediaAdded中直接捕获 video mid(str0m 事件提供准确的mid和kind),并加direction().is_sending()方向校验discover_video_params发现 H.264 payload typediscover_video_params移除硬编码遍历,改为幂等调用(先video_pt = None清除旧值)Event::Connected中的调用保留为兜底(幂等)改动文件:
src/webrtc.rs(2 处)提交:
1beaea8fix(webrtc): use MediaAdded event to discover video mid instead of hardcoded iteration