在Python的aiortc中设置Answer为LocalDescription时触发ValueError异常如何解决?
解决aiortc调用setLocalDescription时的ValueError问题
我来帮你排查这个问题——你遇到的ValueError: None is not in list是因为aiortc在处理媒体轨道的方向时遇到了None值,结合你的代码来看,主要是几个基础的异步函数定义和参数问题导致的,下面一步步分析:
错误原因分析
从错误栈可以看到,问题出在aiortc/rtcpeerconnection.py的and_direction函数里,它尝试从DIRECTIONS列表中查找None的索引,自然会报错。这个问题通常是因为:
- 你的
negotiate函数没有定义为异步函数,但里面用到了await关键字,导致代码执行逻辑混乱 negotiate函数缺少websocket和path参数,不符合websockets.serve要求的处理器签名,导致websocket对象未正确传入- 代码漏掉了将Answer发送回客户端的步骤,导致连接流程不完整
修正后的完整代码
from aiortc import RTCIceCandidate, MediaStreamTrack, RTCPeerConnection, RTCSessionDescription, MediaPlayer import asyncio, websockets async def negotiate(websocket, path): # 初始化媒体播放器和PeerConnection player = MediaPlayer('foo.mp4') pc = RTCPeerConnection() pc.addTrack(player.video) # 接收客户端发来的Offer client_offer_request = await websocket.recv() offer_sdp = RTCSessionDescription(client_offer_request, type='offer') await pc.setRemoteDescription(offer_sdp) # 创建Answer并设置本地描述 answer = await pc.createAnswer() await pc.setLocalDescription(answer) # 将Answer发送回客户端,这一步很关键! await websocket.send(pc.localDescription.sdp) # 启动WebSocket服务器 start_server = websockets.serve(negotiate, 'localhost', 8765) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()
关键修正点说明
- 将
negotiate改为异步函数:添加async关键字,因为函数内使用了await来处理异步操作(WebSocket接收、PeerConnection方法调用) - 补充必要的函数参数:
websockets.serve的处理器必须接收websocket和path两个参数,否则无法正确与客户端建立WebSocket连接 - 添加Answer发送逻辑:创建并设置本地描述后,需要将Answer的SDP发送回客户端,否则客户端无法完成
setRemoteDescription,连接流程会卡壳 - 确保媒体依赖正常:如果
MediaPlayer无法读取视频文件,建议安装完整的aiortc依赖:pip install aiortc[ffmpeg],同时确认foo.mp4文件路径正确
内容的提问来源于stack exchange,提问作者Ahmad Alhilal
相关产品推荐
相关产品推荐

