pygame播放视频并实现音视频同步

news/2024/4/17 17:01:42

一、前言

在我接触pygame时最新的pygame已经不支持movie模块,这就导致在pygame播放视频变成一个问题,网上搜了下解决方案有两个:

一是使用opencv播放视频,再结合pygame.mixer来播放音频

二是使用moviepy播放视频,再结合pygame.mixer播放音频

上述两个方案其实都是先将mp4的视频分离成“画面帧”和“mp3音频”,所谓的播放实际上是不停地在切换“画面帧”,同时播放音频,最终实现音视频的同时播放。

但上述两个方案都存在“音画同步”的问题,因为无论是opencv还是moviepy都只负责将视频切片成帧,播放则是pygame自己在执行一个while循环来不停切换界面上展示出来的图片帧,这也就导致while循环很快就将帧播放完毕,而音频则还按着原有节奏缓慢播放。

解决是在while循环中加入合适的延时同时根据当前视频播放进度来设置音频的播放起点以实现同步,但这个方案据我实践在加入延时后就实现了较好的音画同步效果不知道为啥还要去设置音频的播放起点,另外在设置音频播放起点时一直提示错误也不知道为何,所以我这里提供两个方案:

方案一:在while循环中加入延时,短视频测试效果还行

方案二:根据音频的播放节奏来决定视频帧的播放节奏,这样音画肯定是同步的

我选择使用moviepy来做,因为moviepy从mp4中分离mp3比较简单。

二、方案一

在项目的目录下新建videos目录,并放入一个测试使用的mp4文件test.mp4

上述代码实际上是将整个游戏的帧率设置成与视频一致,这样可能存在一些隐患(直觉)。

三、方案二

代码如下:

上述代码的逻辑如下:

1、通过“pygame.mixer.music.get_pos()”获取当前音频的播放进度

2、通过音频播放进度除以视频的总时长,得到音频播放的百分比进度(音画同步的话,音频百分比进度就应该跟视频百分比进度一致)

3、百分比进度乘以视频总帧数可得到当前应当播放哪一个视频帧

4、再判断一下当前实际播放的帧是否已超过了理论应该播放的视频帧(是的话就跳过当前帧的播放)

注意音频播放结束或视频帧播放结束都要结束视频的播放。

四、总结

本篇提供了pygame播放视频的两个方案,第一个方案是网上找的现成的,第二个方案则是参考了opencv(主流方案)自己逆向思维做的,还未经过实际验证。


https://www.xjx100.cn/news/3092694.html

相关文章

正则笔记(持续更新)

1. java 正则替换 指定字符及其之前的字符 System.out.println("em_4b6add2cfb415db2".replaceFirst("\\.*._",""));//结果 -> e4b6add2cfb415db22. java 正则替换 指定字符及其之后的字符 String name "name.keyword^1.0" ; St…

sqlmap的使用笔记及示例

sqlmap的使用笔记 文章目录 sqlmap的使用笔记1. 目标2. 脱库2.1. 脱库(补充) 3. 其他3.1. 其他(补充) 1. 目标 操作作用必要示例-u指定URL,检测注入点sqlmap -u http://example.com/?id1-m指定txt,里面有…

【secureCRT连接Virtual Box里安装的Utuntu】

先说一下为什么要写这篇文章及一些背景问题介绍,楼主第一次使用secureCRT及securtFX这两个软件,在windows系统下访问虚拟机里面的ubuntu系统。看了网上的不少帖子,没有让我清晰明白地知道怎么使用secureCRT。连接不通,不知道是虚拟…

Deep Learning for Monocular Depth Estimation: A Review.基于深度学习的深度估计

传统的深度估计方法通常是使用双目相机,计算两个2D图像的视差,然后通过立体匹配和三角剖分得到深度图。然而,双目深度估计方法至少需要两个固定的摄像机,当场景的纹理较少或者没有纹理的时候,很难从图像中捕捉足够的特…

XDAG同步节点部署

系统环境要求 JDK : v17 Maven : v3.9.1-v3.9.5 MySQL : v8.0系列 1、MySQL8.0安装 1)docker-compose安装详情 MySQL安装 2)配置数据库账号密码及键表 # docker exec -it mysql8 /bin/bash # root0286a1fd60e6:/# mysql -uroot -p Enter password:…

【gpts】学算法题[缺失的第一个正数](https://leetcode.cn/problems/first-missing-positive/)

给出你的题解 (https://leetcode.cn/problems/first-missing-positive/) public class Solution { public int firstMissingPositive(int[] nums) {int len nums.length;for (int i 0; i < len; i) {while (nums[i] > 0 && nums[i] < len && nums…

c++ ,python监控 进程 状态 fork

【精选】操作系统实验二 观察Linux进程状态_linux什 么时候出现运行状态、暂停状态、可中断阻塞状 态、不可中断阻塞状态、僵_Ace2NoU的博客-CSDN博客 Linux C/C 监控进程变化_mob649e81583204的技术博客_51CTO博客 #include <sys/types.h> #include <sys/wait.h>…

2023年G3锅炉水处理证考试题库及G3锅炉水处理试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年G3锅炉水处理证考试题库及G3锅炉水处理试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机…