olivebot/test/test_human_ws_api.py
2024-12-11 15:29:38 +08:00

93 lines
2.4 KiB
Python

import websocket
import datetime
import threading
import requests
import vlc # 使用 VLC 播放音频
import time
import json
import queue
# 配置项
config = {
"enable_auto_get": True, # 设置是否启用主动获取播放项
"url" : "127.0.0.1" #服务端Url
}
audio_queue = queue.Queue()
player = None
def on_message(ws, message):
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
print(f"[{timestamp}] Received message: {message}")
try:
# 解析收到的 JSON 数据
data = json.loads(message)
if "Data" in data and "HttpValue" in data["Data"]:
audio_url = data["Data"]["HttpValue"]
audio_queue.put(audio_url)
process_audio_queue()
except json.JSONDecodeError as e:
print(f"[Error] Failed to parse message as JSON: {e}")
def process_audio_queue():
global player
if not player or player.get_state() == vlc.State.Ended:
if not audio_queue.empty():
audio_url = audio_queue.get()
play_audio(audio_url)
def play_audio(url):
global player
# 使用 VLC 播放音频
player = vlc.MediaPlayer(url)
player.play()
# 启动线程等待音频播放结束
threading.Thread(target=wait_for_audio_end).start()
def wait_for_audio_end():
global player
# 等待音频播放结束
while True:
state = player.get_state()
if state == vlc.State.Ended:
break
time.sleep(0.01)
# 播放结束后处理队列
process_audio_queue()
def on_error(ws, error):
print(f"[Error] {error}")
def on_close(ws, close_status_code, close_msg):
print("### Connection closed ###")
def on_open(ws):
print("### Connection opened ###")
if __name__ == "__main__":
# 启用 WebSocket 调试信息(可选)
# websocket.enableTrace(True)
# 替换为您的 WebSocket 服务器地址
ws_url = f"ws://{config['url']}:10002"
ws = websocket.WebSocketApp(ws_url,
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close)
# 运行 WebSocket 客户端
wst = threading.Thread(target=ws.run_forever)
wst.daemon = True
wst.start()
try:
while True:
pass # 保持主线程运行
except KeyboardInterrupt:
ws.close()
print("Exited")