93 lines
2.4 KiB
Python
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" : "192.168.1.111" #服务端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") |