原理

视频信息:  帧率(秒/帧)    视频时长= 总帧数/帧率音频播放流程:
1.使用opencv来播放视频画面(毫秒/张)
2.使用moviepy来进行视频音频提取
3.使用playsound2来进行播放音频音频同步过程:
1.利用threading开启视频播放的子线程和音频播放的子线程,利用多任务并发操作实现音画一起播放
2.音画时间同步优化
由于当前程序执行的时间和声音是同步的,但是视频却是不同步的,只需要对视频进行控制即可。sleepTime = zhen/rate - time.time() + startTime当前总帧数/帧率 = 视频播放时间视频播放时间-当前程序执行时间 + 程序开始读取的时间 =  视频延迟

一. 使用OpenCV + 视频库 + 音频库 + 多线程

获取帧率

import cv2cap = cv2.VideoCapture("视频.mp4")
# 获取视频基本信息fps = int(cap.get(cv2.CAP_PROP_FPS))      # 帧率(秒/帧)
cfps = cap.get(cv2.CAP_PROP_FRAME_COUNT)  # 总帧数
# fps = cap.get(5)
print(f"视频帧率 = {fps},视频总帧数 = {cfps}")

音频提取

from moviepy.editor import VideoFileClipvoide = VideoFileClip("视频.mp4")
voide.audio.write_audiofile("视频.mp3")

多线程实现音频,视频同步播放

import cv2
import threading
import time
from playsound2 import playsound# 先播放一秒,如果当前时间对不上,视频就等一下,等音频跟上再继续播放
def video():cap = cv2.VideoCapture("视频.mp4")rate = cap.get(5)  # 读取视频帧率startTime = time.time()while cap.isOpened():ret, frame = cap.read()if ret:zhen = cap.get(1)   # 获取当前帧数frame = cv2.resize(frame, (1080, 640))cv2.imshow('frame', frame)cv2.waitKey(1)  # 等待1毫秒 (1秒=1000毫秒)sleepTime = zhen/rate - time.time() + startTimeif sleepTime > 0:  # 播放时间快了就等一下time.sleep(sleepTime)def music():playsound("视频.mp3")vd = threading.Thread(target=video)
mc = threading.Thread(target=music)
vd.start()
mc.start()

二. 使用flask实现视频播放

1.使用pycharm创建flask项目

2在static文件夹下存放 视频.mp4 文件

3.templates文件夹下,创建 movie.html 文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>电影</title><style>body{background-color: black;}.box{margin: auto;width: auto;height: auto;align-content: center;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);}</style>
</head>
<body>
<div class="box"><video src="./static/{{ movie }}" controls="controls" autoplay="autoplay" width="1200px" height="900px" >视频无法播放时显示的内容</video></div>
</body>
</html>

4.app.py文件

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def hello_world():return render_template("movie.html", movie="视频.mp4")if __name__ == '__main__':app.run()#   启动该文件即可
将在控制台看见该网址:   http://127.0.0.1:5000  浏览器访问即可

三. 使用Pyside6

1.  使用pyside6创建窗体
2.  使用多媒体组件
3.  利用多媒体组件播放视频和音频即可

核心代码如下

#   注意请先去学习pyqt5player = QMediaPlayer(self)  # 创建多媒体播放对象(窗口为自己)
audioOutput = QAudioOutput()  # 创建音频播放对象# 视频播放部分 --将开启一个进程进行视频播放
player.setSource(r"{}".format(filename))
player.setVideoOutput(self.ui.videowidget)  # 链接窗体对象
# 音频部分播放 --将开启一个进程进行音频播放
setAudioOutput(self.audioOutput)  # 链接窗体对象
setSource(r"{}".format(filename))
audioOutput.setVolume(10)  # 音量
player.start()

python实现视频音频同步相关推荐

  1. 同步锁 php,python线程中同步锁详解

    这篇文章主要为大家详细介绍了python线程中同步锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十 ...

  2. python线程死锁的原因,浅谈Python线程的同步互斥与死锁

    线程间通信方法 1. 通信方法 线程间使用全局变量进行通信 2. 共享资源争夺 共享资源:多个进程或者线程都可以操作的资源称为共享资源.对共享资源的操作代码段称为临界区. 影响 : 对共享资源的无序操 ...

  3. 孤荷凌寒自学python第四十一天python的线程同步之Event对象

    孤荷凌寒自学python第四十一天python的线程同步之Event对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 鉴于Lock锁与RLock锁均宣告没有完全完成同步文件操作的问题,于是 ...

  4. pymy 监控mysql_用Python对MySQL同步状态进行监控_MySQL

    用Python对MySQL同步状态进行监控 使用Python对MySQL数据库服务器是否可访问,及主从同步是否中断进行监控,是一件非常简单的事情.感谢Python给我们带来了如此简单,强大,快捷的开发 ...

  5. python同步锁和互斥锁的区别_浅谈Python线程的同步互斥与死锁

    这篇文章主要介绍了浅谈Python线程的同步互斥与死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 线程间通信方法 1. 通信 ...

  6. 浅谈python异步IO,同步IO,线程与进程~

    主线程下的线程之间是可以通信的,但是父进程下的子进程之间不能主动通信,但是子进程想要实现通信也是可以的,可以选择折中的方法来实现,比如multiprocessing.Queue,用法与线程中的queu ...

  7. python多线程实现同步的方式_深入解析Python中的线程同步方法

    同步访问共享资源 在使用线程的时候,一个很重要的问题是要避免多个线程对同一变量或其它资源的访问冲突.一旦你稍不留神,重叠访问.在多个线程中修改(共享资源)等这些操作会导致各种各样的问题:更严重的是,这 ...

  8. python文件实时同步_python文件自动同步备份v1.2【运维必备】2020/12/31

    本帖最后由 We. 于 2021-1-4 08:18 编辑 v1版本打包在这里了,感兴趣的自己下来看: 同步备份v1.rar (1.6 KB, 下载次数: 8) 2020-12-30 16:12 上传 ...

  9. Python线程编程—同步队列

    我们经常会采用生产者/消费者关系的两个线程来处理一个共享缓冲区的数据.例如一个生产者线程接受用户数据放入一个共享缓冲区里,等待一个消费者线程对数据取出处理.但是如果缓冲区的太小而生产者和消费者两个异步 ...

最新文章

  1. 英特尔紧急召回SB主板,Intel 6系列芯片组设计缺陷
  2. 如何使用应用日志(Application Log)
  3. wxWidgets:容器类
  4. UVA 10603 - Fill(dijkstra + 状态图)
  5. 【C/C++】实型变量
  6. Redis中的可用性保证之Sentinel 原理
  7. struts2+jquery 实现ajax登陆
  8. python递归函数查询表_python---------------递归函数
  9. Building Roads(POJ-3625)
  10. typeorm 表名_typeORM 多对多关系不同情况的处理
  11. 利用计算机打字教学设计,《争当打字小能手》教学设计方案
  12. python内存的回收机制_python的内存管理和垃圾回收机制详解
  13. 前端怎么自我介绍_未雨绸缪,小米前端实习面经
  14. 士兵杀敌 三 --- O( 1 ) 的时间复杂度 .
  15. 给定一个无重复元素的数组 candidates 和一个目标数 target .
  16. WordPress | QQ互联授权登录
  17. 2018秋招面经有感
  18. 二次函数回归方程_高三||【高三专题】三角函数提优专题卷
  19. 编写SQL语句,从Customers中检索所有的顾客名称(cust_name),并按从Z到A的顺序显示结果
  20. ContestHunter #26 B 玩骰子

热门文章

  1. 全新的MySQL 8.0行锁观测方式
  2. 初始脚本一键搞定虚拟机
  3. 2023年还在问前端怎么学?一份前端学习指南
  4. python中columns是什么意思_Python Pandas DataFrame.columns用法及代码示例
  5. Linux下批量修改文件名(rename)
  6. jdjjsjsjhfshafhiehf
  7. WordPress优化教程大全
  8. 信息系统安全等级保护相关法规及重要国家标准汇总目录
  9. C#,图像二值化(13)——全局阈值的双峰平均值算法(Bimodal Thresholding)与源程序
  10. 三款EPUB阅读软件对比