一、前言

在我接触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(主流方案)自己逆向思维做的,还未经过实际验证。

pygame播放视频并实现音视频同步的更多相关文章

  1. FFmpeg简易播放器的实现-音视频同步

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  2. 云-腾讯云-实时音视频:实时音视频(TRTC)

    ylbtech-云-腾讯云-实时音视频:实时音视频(TRTC) 支持跨终端.全平台之间互通,从零开始快速搭建实时音视频通信平台 1.返回顶部 1. 腾讯实时音视频(Tencent Real-Time ...

  3. moviepy音视频剪辑:音视频的加载和输出

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在本地进行音视频处理时,首先要从视频文件 ...

  4. [工具]利用EasyRTSPClient工具检查摄像机RTSP流不能播放原因以及排查音视频数据无法播放问题

    出现问题 我们在做流媒体开发的过程中,进程会出现摄像机RTSP流莫名其妙无法播放的问题,而我们常用的vlc经常是直接弹出一个无法播放的提示框就完事了,没有说明出错的原因,或者在vlc的消息里面能看到日 ...

  5. Android硬编码——音频编码、视频编码及音视频混合

    视频编解码对许多Android程序员来说都是Android中比较难的一个知识点.在Android 4.1以前,Android并没有提供硬编硬解的API,所以之前基本上都是采用FFMpeg来做视频软件编 ...

  6. Android音视频之MediaRecorder音视频录制

    前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...

  7. 使用PyQt(Python+Qt)+moviepy开发的视频截取、音视频分离、MP4转GIF动图工具免费下载分享

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在因博文素材需要将软件操作制作成动画时,发现网上相关绿色使用工具都需要 ...

  8. 直播软件开发之Java音视频解决方案:音视频基础知识

    概念 从信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余.音频信号在时域和频域上具有相关性,也即存在数据冗余.将音频作为一个信源,音频编码的实质是减少音频中的冗余. 拟信 ...

  9. Android 音视频同步机制

    一.概述 音视频同步(avsync),是影响多媒体应用体验质量的一个重要因素.而我们在看到音视频同步的时候,最先想到的就是对齐两者的pts,但是实际使用中的各类播放器,其音视频同步机制都比这些复杂的多 ...

  10. ffplay的音视频同步分析

    以前工作中参与了一些音视频程序的开发,不过使用的都是芯片公司的SDK,没有研究到更深入一层,比如说音视频同步是怎么回事.只好自己抽点时间出来分析开源代码了,做音视频编解码的人都知道ffmpeg,他在各 ...

随机推荐

  1. Python操纵数据库:peewee

    模块名:peewee 安装方法: pip install peewee 官方教程:http://docs.peewee-orm.com/en/latest/

  2. 园子的商业化努力-阿里云开发者社区合作:RDS MySQL Serverless 免费试用活动

    阿里云开发者社区这个月组织了一个针对"云数据库 RDS MySQL Serverless 版"免费试用用户的做任务活动,上周找园子合作,希望能在园子里推广一下这个活动. 由于时间太 ...

  3. 因为此网站发送了 Google Chrome 无法处理的杂乱凭据

    原文地址 thisisunsafe this is unsafe 这是不安全的,呵呵~ 具体描述 在chrome该页面上,直接键盘敲入这11个字符:thisisunsafe (鼠标点击当前页面任意位置 ...

  4. Jmeter使用jp@gc-stepping thread group做性能测试

    扩展插件 下载地址:http://jmeter-plugins.org/downloads/all 将JMeterPlugins-Standard.jar复制到jmeter的lib目录下的ext目录下 ...

  5. openlayers学习笔记

    https://www.cnblogs.com/suRimn/p/10649816.html

  6. 【动画进阶】神奇的 3D 磨砂玻璃透视效果

    最近,群友分享了一个很有意思的效果: 原效果的网址:frosted-glass.该效果的几个核心点: 毛玻璃磨砂效果 卡片的 3D 旋转跟随效果 整体透明度和磨砂感.以及卡片的 3D 形态会随着用户移 ...

  7. FastJson不成想还有个版本2啊:序列化大字符串报错

    背景 发现陷入了一个怪圈,写文章的话,感觉只有大bug或比较值得写的内容才会写,每次一写就是几千字,争取写得透彻一些,但这样,我也挺费时间,读者也未必有这么多时间看. 我想着,日常遇到的小bug.平时 ...

  8. 你能看到这个汉字么“  ” ?关于Unicode的私人使用区(PUA) 和浏览器端显示处理

    如果你现在使用的是chrome查看那么你是看不到我标题中的汉字的,显示为一个小方框,但是你使用edge查看的话,这个字就能正常的显示出来,不信你试试! 本故事源于我在做数据过程中遇到Unicode编码 ...

  9. API数据接口的应用步骤

    API(Application Programming Interface)是现代软件应用程序开发中的一项重要技术,它允许不同的应用程序之间进行通信和数据交换.API接口通过提供统一的访问点,使得应用 ...

  10. Leetcode刷题笔记——二分法

    二分法是搜索算法中极其典型的方法,其要求输入序列有序并可随机访问.算法思想为 输入:有序数组nums,目的数值target 要求输出:如果target存在在数组中,则输出其index,否则输出-1 将 ...