""" ALVR串流处理器 负责与ALVR服务器通信和视频流传输 支持Quest等VR头显的无线串流 """ import socket import struct import threading import json import time import subprocess import psutil from direct.showbase.DirectObject import DirectObject from panda3d.core import Texture, PNMImage class ALVRStreamer(DirectObject): """ALVR串流处理器""" def __init__(self, world, vr_manager): super().__init__() self.world = world self.vr_manager = vr_manager # ALVR服务器配置 self.alvr_server_ip = "127.0.0.1" self.alvr_server_port = 9943 self.alvr_streaming_port = 9944 # 连接状态 self.connected = False self.streaming = False self.server_socket = None self.streaming_socket = None # 流媒体配置 self.stream_width = 2880 # Quest 2 推荐分辨率 self.stream_height = 1700 self.stream_fps = 72 self.bitrate = 150 # Mbps self.codec = "h264" # 线程管理 self.connection_thread = None self.streaming_thread = None self.running = False # 性能统计 self.frame_count = 0 self.last_fps_time = time.time() self.current_fps = 0 self.latency = 0 print("✓ ALVR串流处理器初始化完成") def initialize(self): """初始化ALVR串流""" try: # 检查ALVR服务器是否运行 if not self._check_alvr_server(): print("ALVR服务器未运行,尝试启动...") if not self._start_alvr_server(): print("无法启动ALVR服务器") return False # 连接到ALVR服务器 if not self._connect_to_server(): print("无法连接到ALVR服务器") return False # 配置流媒体设置 self._configure_streaming() # 启动串流线程 self._start_streaming_threads() print("✓ ALVR串流初始化成功") return True except Exception as e: print(f"ALVR初始化错误: {str(e)}") return False def _check_alvr_server(self): """检查ALVR服务器是否运行""" try: # 检查进程 for proc in psutil.process_iter(['pid', 'name', 'cmdline']): if 'alvr' in proc.info['name'].lower(): return True # 尝试连接端口 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) result = sock.connect_ex((self.alvr_server_ip, self.alvr_server_port)) sock.close() return result == 0 except Exception as e: print(f"检查ALVR服务器错误: {str(e)}") return False def _start_alvr_server(self): """启动ALVR服务器""" try: # 尝试启动ALVR服务器 # 这里需要根据实际的ALVR安装路径调整 alvr_paths = [ "/usr/local/bin/alvr_server", "/usr/bin/alvr_server", "C:/Program Files/ALVR/alvr_server.exe", "C:/ALVR/alvr_server.exe" ] for path in alvr_paths: try: subprocess.Popen([path], shell=True) time.sleep(3) # 等待服务器启动 if self._check_alvr_server(): return True except FileNotFoundError: continue return False except Exception as e: print(f"启动ALVR服务器错误: {str(e)}") return False def _connect_to_server(self): """连接到ALVR服务器""" try: # 创建TCP连接 self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.settimeout(5) self.server_socket.connect((self.alvr_server_ip, self.alvr_server_port)) # 发送握手消息 handshake_data = { "type": "handshake", "client_name": "Panda3D_VR_Engine", "version": "1.0", "capabilities": { "video": True, "audio": True, "tracking": True, "haptics": True } } self._send_message(handshake_data) # 接收响应 response = self._receive_message() if response and response.get("type") == "handshake_response": self.connected = True print("✓ 已连接到ALVR服务器") return True return False except Exception as e: print(f"连接ALVR服务器错误: {str(e)}") return False def _send_message(self, data): """发送消息到ALVR服务器""" try: message = json.dumps(data).encode('utf-8') length = struct.pack('= 1.0: self.current_fps = self.frame_count self.frame_count = 0 self.last_fps_time = current_time def start_streaming(self): """开始串流""" if not self.connected: print("未连接到ALVR服务器") return False start_message = {"type": "start_streaming"} self._send_message(start_message) return True def stop_streaming(self): """停止串流""" if not self.connected: return stop_message = {"type": "stop_streaming"} self._send_message(stop_message) self.streaming = False def send_haptic_feedback(self, controller_id, duration, intensity): """发送触觉反馈""" if not self.connected: return haptic_message = { "type": "haptic_feedback", "controller_id": controller_id, "duration": duration, "intensity": intensity } self._send_message(haptic_message) def get_streaming_status(self): """获取串流状态""" return { "connected": self.connected, "streaming": self.streaming, "fps": self.current_fps, "latency": self.latency, "resolution": f"{self.stream_width}x{self.stream_height}", "bitrate": self.bitrate } def set_stream_quality(self, width, height, fps, bitrate): """设置串流质量""" self.stream_width = width self.stream_height = height self.stream_fps = fps self.bitrate = bitrate # 如果正在串流,重新配置 if self.streaming: self._configure_streaming() def shutdown(self): """关闭串流""" print("关闭ALVR串流...") self.running = False self.streaming = False # 发送断开消息 if self.connected: disconnect_message = {"type": "disconnect"} self._send_message(disconnect_message) # 关闭连接 if self.server_socket: self.server_socket.close() if self.streaming_socket: self.streaming_socket.close() # 等待线程结束 if self.connection_thread: self.connection_thread.join(timeout=2) if self.streaming_thread: self.streaming_thread.join(timeout=2) self.connected = False print("✓ ALVR串流已关闭") def is_connected(self): """检查是否连接""" return self.connected def is_streaming(self): """检查是否在串流""" return self.streaming