pygame播放视频并实现音视频同步
一、前言
在我接触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播放视频并实现音视频同步的更多相关文章
- FFmpeg简易播放器的实现-音视频同步
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- 云-腾讯云-实时音视频:实时音视频(TRTC)
ylbtech-云-腾讯云-实时音视频:实时音视频(TRTC) 支持跨终端.全平台之间互通,从零开始快速搭建实时音视频通信平台 1.返回顶部 1. 腾讯实时音视频(Tencent Real-Time ...
- moviepy音视频剪辑:音视频的加载和输出
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 在本地进行音视频处理时,首先要从视频文件 ...
- [工具]利用EasyRTSPClient工具检查摄像机RTSP流不能播放原因以及排查音视频数据无法播放问题
出现问题 我们在做流媒体开发的过程中,进程会出现摄像机RTSP流莫名其妙无法播放的问题,而我们常用的vlc经常是直接弹出一个无法播放的提示框就完事了,没有说明出错的原因,或者在vlc的消息里面能看到日 ...
- Android硬编码——音频编码、视频编码及音视频混合
视频编解码对许多Android程序员来说都是Android中比较难的一个知识点.在Android 4.1以前,Android并没有提供硬编硬解的API,所以之前基本上都是采用FFMpeg来做视频软件编 ...
- Android音视频之MediaRecorder音视频录制
前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...
- 使用PyQt(Python+Qt)+moviepy开发的视频截取、音视频分离、MP4转GIF动图工具免费下载分享
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在因博文素材需要将软件操作制作成动画时,发现网上相关绿色使用工具都需要 ...
- 直播软件开发之Java音视频解决方案:音视频基础知识
概念 从信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余.音频信号在时域和频域上具有相关性,也即存在数据冗余.将音频作为一个信源,音频编码的实质是减少音频中的冗余. 拟信 ...
- Android 音视频同步机制
一.概述 音视频同步(avsync),是影响多媒体应用体验质量的一个重要因素.而我们在看到音视频同步的时候,最先想到的就是对齐两者的pts,但是实际使用中的各类播放器,其音视频同步机制都比这些复杂的多 ...
- ffplay的音视频同步分析
以前工作中参与了一些音视频程序的开发,不过使用的都是芯片公司的SDK,没有研究到更深入一层,比如说音视频同步是怎么回事.只好自己抽点时间出来分析开源代码了,做音视频编解码的人都知道ffmpeg,他在各 ...
随机推荐
- 利用pytorch准备数据集、构建与训练、保存与加载CNN模型
本文的主要内容是利用pytorch框架与torchvision工具箱,进行准备数据集.构建CNN网络模型.训练模型.保存和加载自定义模型等工作.本文若有疏漏.需更正.改进的地方,望读者予以指正,如果本 ...
- Python怎么通过url下载网络文件到本地
以下代码演示Python怎么从网络下载一个文件至本地并保存在当前文件夹download import os import requests from urllib.parse import urlpa ...
- 【路由器】OpenWrt 简介和安装
目录 简介 来源 介绍 安装 一般安装流程 固件搜索下载 参考资料 简介 来源 2002 年底 Linksys 公司推出 WRT-54G,采用了 Linux 取代了原来的 vXworks 系统.迫于 ...
- 【Ubuntu】Ubuntu 配置记录
目录 系统文件夹改回英文 Ubuntu 镜像 pypi 镜像 临时使用 设为默认 Doxygen + Graphviz 分析代码并画图 Graphviz 安装 Doxygen 安装 配置 运行 系统文 ...
- 详谈 springboot整合shiro
背景: 上文学习了shrio 基本概念后,本章将进一步的落地实践学习,在springboot中如何去整合shrio,整个过程步骤有个清晰的了解. 利用Shiro进行登录认证主要步骤: 1. 添加依赖: ...
- Shell产出01|定时清日志脚本|Shell
需求:每天定时清理空间占有率为x%的文件系统,包括PAMS和PMTS #!/bin/bash : <<EOF @Time:2023/03/22 @Author:Chase 版本:定时任务实 ...
- FastDFS入门
一.系统架构 二.构成部分 1.Tracker Server:跟踪服务器,记录文件信息,可单台或集群部署. 2.Storage Server:存储服务器,文件存储位置,分卷或分组部署. 3.Clien ...
- 我的新书《Flink大数据分析实战》出版啦
- [EasyExcel] 导出合并单元格
前言 使用spring boot 对excel 进行操作在平时项目中要经常使用.常见通过jxl和poi 的方式进行操作.但他们都存在一个严重的问题就是非常的耗内存.这里介绍一种 Easy Excel ...
- JNI动态注册以及JNI签名
一.动态注册和静态注册 注册native方法有两种方式,动态注册和静态注册.静态注册是在编译时进行注册,而且在java中声明的native方法和c/c++中的本地方法的对应关系是恒定的:比如说在com ...