bugfix
This commit is contained in:
parent
738c4f24bc
commit
84f61c8b71
108
rtcllm/rtc.py
108
rtcllm/rtc.py
@ -1,2 +1,108 @@
|
|||||||
from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription
|
import asyncio
|
||||||
|
|
||||||
|
from appPublic.dictObject import DictObject
|
||||||
|
from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription, RTCIceCandidate
|
||||||
from aiortc.contrib.media import MediaBlackhole, MediaPlayer, MediaRecorder, MediaRelay
|
from aiortc.contrib.media import MediaBlackhole, MediaPlayer, MediaRecorder, MediaRelay
|
||||||
|
|
||||||
|
# from websockets.asyncio.client import connect
|
||||||
|
from websockets.asyncio.client import connect
|
||||||
|
import websockets
|
||||||
|
|
||||||
|
class RTCLLM:
|
||||||
|
def __init__(self, ws_url, iceServers):
|
||||||
|
self.ws_url = ws_url
|
||||||
|
self.iceServers = iceServers
|
||||||
|
self.peers = DictObject()
|
||||||
|
|
||||||
|
def get_pc(self, data):
|
||||||
|
return self.peers[data['from'].id].pc
|
||||||
|
|
||||||
|
async def run(self):
|
||||||
|
async with connect(self.ws_url) as self.ws:
|
||||||
|
self.login()
|
||||||
|
while True:
|
||||||
|
msg = await self.ws.recv()
|
||||||
|
data = DictObject(**json.loads(msg))
|
||||||
|
f = self.handler.get(data.type)
|
||||||
|
await f(data)
|
||||||
|
self.ws.close()
|
||||||
|
|
||||||
|
async def login(self):
|
||||||
|
await self.ws.send(json.dumps({
|
||||||
|
'type':'login',
|
||||||
|
'info':{
|
||||||
|
'id':'rtcllm_agent',
|
||||||
|
'name':'rtcllm_agent'
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
async def save_onlineList(self, data):
|
||||||
|
self.onlineList = data.onlineList
|
||||||
|
|
||||||
|
async def auto_accept_call(self, data):
|
||||||
|
pc = await self.createPeerConnection(data['from'])
|
||||||
|
self.peers[data['from'].id] = DictObject(**{
|
||||||
|
'info':data['from'],
|
||||||
|
'pc':pc
|
||||||
|
})
|
||||||
|
await self.ws.send(json.dumps({'type':'callAccepted', 'to':data['from']}))
|
||||||
|
|
||||||
|
async def response_offer(self, data):
|
||||||
|
pc = self.get_pc(data)
|
||||||
|
offer = RTCSessionDescription(data.offer)
|
||||||
|
await pc.setRemoteDescription(offer)
|
||||||
|
answer = await pc.createAnswer()
|
||||||
|
await pc.setLocalDescription(answer)
|
||||||
|
self.ws.send(json.dumps({
|
||||||
|
'type':'answer',
|
||||||
|
'answer':pc.localDescription,
|
||||||
|
'to':data['from']
|
||||||
|
}))
|
||||||
|
@pc.on("datachannel")
|
||||||
|
def datachannel_handle(channel):
|
||||||
|
@channel.on("message")
|
||||||
|
def recvdata(channel):
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
@pc.on("connectionstatechange")
|
||||||
|
@pc.on("track")
|
||||||
|
"""
|
||||||
|
|
||||||
|
async def accept_answer(self, data):
|
||||||
|
pc = self.get_pc(data)
|
||||||
|
answer = RTCSessionDescription(data.answer);
|
||||||
|
pc.setRemoteDescription(answer)
|
||||||
|
|
||||||
|
async def accept_iceCandidate(self, data):
|
||||||
|
pc = self.get_pc(data)
|
||||||
|
candidate = RTCIceCandidate(data.candidate)
|
||||||
|
# pc.addIceCandidate(RTCIceCandidate.from_string(candidate))
|
||||||
|
await pc.addIceCandidate(candidate)
|
||||||
|
|
||||||
|
async def createPeerConnection(self, peerinfo):
|
||||||
|
opts = {
|
||||||
|
iceServers:self.iceServers
|
||||||
|
}
|
||||||
|
pc = RTCPeerConnection(opts)
|
||||||
|
|
||||||
|
handlers = {
|
||||||
|
'onlineList':save_onlineList,
|
||||||
|
'callRequest':auto_accept_call,
|
||||||
|
'offer':response_offer,
|
||||||
|
'answer':accept_answer,
|
||||||
|
'iceCandidate':accept_iceCandidate,
|
||||||
|
}
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
agent = RTCLLM(ws_url='https://sage.opencomputing.cn/wss/ws/rtc_signaling.ws',
|
||||||
|
iceServers=[{
|
||||||
|
'urls':'stun:stun.opencomputing.cn'},{
|
||||||
|
'urls':'turn:stun.opencomputing.cn',
|
||||||
|
'username':'turn',
|
||||||
|
'credential':'server'
|
||||||
|
}])
|
||||||
|
await agent.run()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user