Bug: tx.send() 失败被静默忽略,编码器继续无效工作 (avhw.rs) #6
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
位置
src/avhw.rs:875严重性
🟡 中
问题描述
tx.send()返回Result<(), SendError<T>>,当接收端(WebRTC 客户端)断开连接时 channel 会被关闭,send将失败。当前用let _ =忽略返回值,会导致:建议修复
记录 warning 并 break 退出 drain 循环,避免无效编码:
修复方案
第一层:channel 断开检测(SendError)
drain_encoder()中将let _ = tx.send(data.to_vec())替换为:设置
webrtc_disconnected终态标志,encode_filtered_frame()在标志为 true 时跳过编码,避免反复 drain 做无用功。第二层:WebRTC 客户端断连感知(AtomicBool)
经 Oracle 审核发现:WebRTC 客户端断连时 receiver 不会被 drop(它存活在 State 生命周期内),
tx.send()永远不会返回 SendError。因此新增
Arc<AtomicBool> webrtc_paused共享于 State ↔ SwEncState:poll_webrtc()中同步wrtc.is_connected()→webrtc_pausedencode_filtered_frame()检查webrtc_paused,断连时跳过编码true(首个客户端连接前暂停编码)断连时丢弃陈旧帧
poll_webrtc()中rx.try_recv()在!connected时continue丢弃队列中的陈旧帧,不再传给write_h264_frame()。改动文件
src/avhw.rs:SwEncState 新增两个标志 + encode_filtered_frame 双重早返回 + drain_encoder 错误处理src/state.rs:State 新增 webrtc_paused + poll_webrtc 同步标志 + 传 clone 给 new_webrtcsrc/state_portal.rs:与 state.rs 对称的改动Commit:
226768c