如何将远端Peer SDP设为本地描述及解决信令状态无法从stable转answer的问题
问题:如何将远端Peer的SDP设置为本地描述,以及如何将信令状态从stable切换为answer?
执行answer_sdp = RTCSessionDescription(sdp, type_value)尝试设置远端Peer的offer后,信令状态始终停留在stable,无法切换到对应状态,调用await pc.setRemoteDescription(answer_sdp)时触发如下错误:
File "/home/pi/Desktop/webrtc04.py", line 237, in <module> asyncio.run(main()) File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run return loop.run_until_complete(main) File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete return future.result() File "/home/pi/Desktop/webrtc04.py", line 217, in main await pc.setRemoteDescription(answer_sdp) File "/home/pi/.local/lib/python3.9/site-packages/aiortc/rtcpeerconnection.py", line 827, in setRemoteDescription self.__validate_description(description, is_local=False) File "/home/pi/.local/lib/python3.9/site-packages/aiortc/rtcpeerconnection.py", line 1253, in __validate_description raise InvalidStateError( aiortc.exceptions.InvalidStateError: Cannot handle answer in signaling state "stable"
添加状态检查后,输出始终显示:
Invalid signaling state: stable
原因分析
核心问题是SDP类型与信令状态不匹配:WebRTC信令状态流转有严格的规则,stable状态表示当前没有未完成的信令交互,此时直接传入answer类型的SDP不符合协议逻辑——你大概率把远端发送的offer错误封装成了answer类型的RTCSessionDescription,导致状态校验失败。
解决方案
1. 修正SDP类型匹配
如果远端发送的是offer,必须创建对应类型的RTCSessionDescription,再调用setRemoteDescription接收:
# 确保type参数为"offer",与远端SDP类型一致 offer_sdp = RTCSessionDescription(sdp, "offer") await pc.setRemoteDescription(offer_sdp)
接收offer后,本地才能生成并发送自己的answer:
# 生成本地answer local_answer = await pc.createAnswer() await pc.setLocalDescription(local_answer) # 通过信令通道将local_answer发送给远端
2. 遵循信令状态流转逻辑
WebRTC信令状态的正常流转路径:
- 初始状态:
stable - 本地发起offer → 状态变为
have-local-offer - 接收远端answer → 回到
stable - 接收远端offer → 状态变为
have-remote-offer - 本地发送answer → 回到
stable
必须严格按顺序操作,不能跳过步骤直接处理answer。
3. 排查代码中的类型错误
检查type_value变量的取值,确认它与远端实际发送的SDP类型完全一致。如果远端发的是offer,type_value绝对不能设为"answer"。
内容的提问来源于stack exchange,提问作者Moaz Azam
相关产品推荐
相关产品推荐

