python中cv2 播放视频,并同步播放音频

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") 

posted @ 2025-03-13 16:37  lambertlt  阅读(141)  评论(0)    收藏  举报