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")
有什么不同见解可以在评论区共同讨论

浙公网安备 33010602011771号