import cv2
import pygame
import threading
from queue import Queue class VideoPlayer:def __init__(self, video_path):# 初始化视频参数 self.cap = cv2.VideoCapture(video_path)self.fps = self.cap.get(cv2.CAP_PROP_FPS) self.width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)) self.height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # Pygame初始化 pygame.init() self.screen = pygame.display.set_mode((self.width, self.height)) self.clock = pygame.time.Clock() # 线程控制 self.running = True self.frame_queue = Queue(maxsize=30) # 帧缓冲队列 self.audio_queue = Queue()# 启动线程 threading.Thread(target=self.video_thread).start() threading.Thread(target=self.audio_thread).start() self.main_loop() def video_thread(self):"""视频解码线程"""while self.running: ret, frame = self.cap.read() if not ret:break # 转换颜色空间并放入队列 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)self.frame_queue.put(pygame.image.frombuffer(frame.tobytes(), (self.width, self.height), 'RGB'))def audio_thread(self):"""音频播放线程(需要单独提取音频)"""# 此处需要音频处理逻辑(示例代码)pygame.mixer.init() while self.running: # 实际应用中需要从视频中提取音频 # 这里使用静音占位 self.clock.tick(self.fps) def main_loop(self):"""主渲染循环"""while self.running: for event in pygame.event.get(): if event.type == pygame.QUIT:self.running = False if not self.frame_queue.empty(): frame = self.frame_queue.get() self.screen.blit(frame, (0, 0))pygame.display.flip() self.clock.tick(self.fps) # 释放资源 self.cap.release() pygame.quit() if __name__ == "__main__":VideoPlayer("your_video.mp4")