You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:24:06