Python实现本地视频/音频播放器

Python实现本地视频/音频播放器

在Python中,有几个库可以用于视频播放,但是没有一个库是完美的,因为它们可能依赖于外部软件或有一些限制。

先看介绍用Python实现本地视频播放器,再介绍用Python实现本地音乐播放器。

Python实现本地视频播放器

与HTML5+JavaScript实现本地视频播放器相比,使用Python实现比较麻烦。我发现网上给出的一些示例,通常有一些小问题,如画面和声音不同步等,或有画面没声音的。下面我给出一个简单而效果较好的例子。

Tkinter 是 Python 的一个内置库,它提供了构建图形用户界面 (GUI) 的工具。Tkinter 基于 Tk GUI 工具包。Tkinter 是 Python 标准库的一部分,因此您不需要安装任何额外的包。

                     

ffpyplayer是一个基于FFmpeg的Python多媒体播放库,它可以播放多种格式的视频和音频文件。相比pygame,ffpyplayer支持更多的媒体格式,包括常见的MP4、AVI、MKV、FLV等视频格式,以及MP3、WAV、FLAC等音频格式。

这是第三方库,需要安装, cmd命令行中,输入如下命令:

pip install ffpyplayer

如果你的电脑上安装了多个Python版本,你可以为特定版本的Python安装模块(库、包),还可以使用国内的镜像加快安装速度。例如我的电脑中安装了多个Python版本,要在Python 3.10版本中安装,并使用清华的镜像,cmd命令行中,输入如下命令:

py -3.10 -m pip install ffpyplayer -i https://pypi.tuna.tsinghua.edu.cn/simple

Pillow库是在PIL库的基础上发展起来的,它继承了PIL库的大部分功能,并进行了许多改进和增强。Pillow库已经成为了Python图像处理领域中使用最广泛的库之一,提供了丰富的图像处理功能,包括图片打开、大小调整、裁剪、旋转、滤镜等操作。PIL库在Python 3之后已经停止维护,取而代之的是Pillow库。

这是第三方库,需要安装, cmd命令行中,输入如下命令:

pip install Pillow

如果你的电脑上安装了多个Python版本,你可以为特定版本的Python安装模块(库、包),还可以使用国内的镜像加快安装速度。例如我的电脑中安装了多个Python版本,要在Python 3.10版本中安装,并使用清华的镜像,cmd命令行中,输入如下命令

py -3.10 -m pip install Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

下面,是Python使用这些库实现的简单的本地视频播放器,给先给出效果图:

源码如下:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
from tkinter.ttk import Style, Progressbar
from ffpyplayer.player import MediaPlayer# 定义视频播放器类
class VideoPlayTk:# 初始化函数def __init__(self, root):self.root = rootself.root.title('视频播放器')  # 设置窗口标题# 创建一个画布用于显示视频帧self.canvas = tk.Canvas(root, bg='black')self.canvas.pack(fill=tk.BOTH, expand=True)# 创建打开文件按钮self.open_button = tk.Button(root, text='打开', command=self.open_file)self.open_button.pack(side=tk.LEFT)# 创建暂停/播放按钮self.pause_button = tk.Button(root, text='暂停/继续', command=self.toggle_pause)self.pause_button.pack(side=tk.LEFT)# 初始化播放器和播放状态标志self.player = Noneself.is_paused = Falseself.is_stopped = False# 打开文件的函数def open_file(self):#file_path = filedialog.askopenfilename()  # 弹出文件选择对话框file_path = filedialog.askopenfilename(filetypes=[("Video files", "*.mp4;*.avi;*.mov;*.wmv;*.mkv;*.flv;*.mpeg;*.3gp")])if file_path:self.is_stopped = Falseself.is_paused = Falseself.start_video(file_path)  # 开始播放选择的视频文件# 开始播放视频的函数def start_video(self, file_path):self.player = MediaPlayer(file_path)  # 创建一个MediaPlayer对象self.play_video()  # 开始播放视频# 播放视频的函数def play_video(self):if self.is_stopped:self.player = None  # 如果停止播放,则释放播放器资源returnframe, val = self.player.get_frame()  # 获取下一帧和帧间隔if val == 'eof':self.player = None  # 如果到达视频末尾,则释放播放器资源returnelif frame is None:self.root.after(10, self.play_video)  # 如果没有帧,则稍后再试return# 将帧图像转换为Tkinter PhotoImage并显示在画布上image, pts = frameimage = Image.frombytes("RGB", image.get_size(), bytes(image.to_bytearray()[0]))photo = ImageTk.PhotoImage(image=image)self.canvas.create_image(0, 0, image=photo, anchor=tk.NW)self.canvas.image = photo  # 保持对PhotoImage的引用,防止被垃圾回收# 如果没有暂停,则继续播放下一帧if not self.is_paused:self.root.after(int(val * 1000), self.play_video)# 切换暂停状态的函数def toggle_pause(self):if self.player:self.is_paused = not self.is_paused  # 切换暂停状态self.player.set_pause(self.is_paused)  # 设置播放器的暂停状态if not self.is_paused:self.play_video()  # 如果继续播放,则播放下一帧# 程序入口点
if __name__ == '__main__':root = tk.Tk()  # 创建Tkinter根窗口app = VideoPlayTk(root)  # 创建视频播放器应用root.mainloop()  # 进入Tkinter事件循环

附录

Python使用pillow库(PIL库)的使用介绍 https://blog.csdn.net/cnds123/article/details/126141838

Python简单GUI程序示例(四、视频播放器)https://blog.csdn.net/cnds123/article/details/122903311

Python实现的本地音乐播放器

使用tkinter库来构建用户界面,以及pygame库来处理音频播放。

pygame是一个用于编写游戏和多媒体应用程序的Python模块。它提供了许多功能,包括绘制图形、处理音频、处理输入设备等。功能比较丰富易用

pygame库是第三方库,需要安装, cmd命令行中,输入如下命令:

pip install pygame

如果你的电脑上安装了多个Python版本,你可以为特定版本的Python安装模块(库、包),还可以使用国内的镜像加快安装速度。例如我的电脑中安装了多个Python版本,要在Python 3.10版本中安装,并使用清华的镜像,cmd命令行中,输入如下命令:

py -3.10 -m pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple

给先给出效果图:

有打开“按钮”按钮加载音乐文件,“暂停/继续”按钮用于暂停、继续播放,并能显示当前播放的时间(每秒更新)。

源码如下:

import tkinter as tk
from tkinter import filedialog
import pygame
import timeclass MusicPlayer:def __init__(self, root):self.root = rootself.root.title('Music Player')self.root.geometry('400x150')pygame.init()pygame.mixer.init()self.status = 'stopped'self.current_time = 0self.load_button = tk.Button(self.root, text='加载音乐', width=10, command=self.load_music)self.load_button.pack()self.play_button = tk.Button(self.root, text='播放', width=10, command=self.play_music)self.play_button.pack()self.pause_button = tk.Button(self.root, text='暂停/继续', width=10, command=self.toggle)self.pause_button.pack()self.time_label = tk.Label(self.root, text='00:00')self.time_label.pack()self.update_time()def load_music(self):#self.file_path = filedialog.askopenfilename()self.file_path = filedialog.askopenfilename(filetypes=[("Audio files", "*.mp3; *.wav; *.ogg")]))pygame.mixer.music.load(self.file_path)def play_music(self):if self.status != 'playing':pygame.mixer.music.play()self.status = 'playing'def toggle(self):if self.status == 'paused':pygame.mixer.music.unpause()self.status = 'playing'elif self.status == 'playing':pygame.mixer.music.pause()self.status = 'paused'def update_time(self):if self.status == 'playing':self.current_time = pygame.mixer.music.get_pos() // 1000mins, secs = divmod(self.current_time, 60)timeformat = '{:02d}:{:02d}'.format(mins, secs)self.time_label.config(text=timeformat)self.root.after(1000, self.update_time)if __name__ == "__main__":root = tk.Tk()app = MusicPlayer(root)root.mainloop()

附录

Python中的pygame游戏模块的使用 https://blog.csdn.net/cnds123/article/details/119514520

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【御控物联】Java JSON结构转换(4):对象To对象——规则属性重组

文章目录 一、JSON结构转换是什么?二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

探索异常传播:深入剖析Python中的错误处理机制

文章目录 1. 异常传播的基本原理2. 复杂的异常传播场景3. 再次抛出异常的意义是什么?4. 最佳实践与异常处理策略 理解异常传播(也称为异常冒泡)的过程是至关重要的。这一机制确保当在程序执行中发生错误时,错误能被有效地捕获和处…

【前端Vue】Vue3+Pinia小兔鲜电商项目第6篇:整体认识和路由配置,本资源由 收集整理【附代码文档】

Vue3ElementPlusPinia开发小兔鲜电商项目完整教程(附代码资料)主要内容讲述:认识Vue3,使用create-vue搭建Vue3项目1. Vue3组合式API体验,2. Vue3更多的优势,1. 认识create-vue,2. 使用create-vue创建项目,1. setup选项的写法和执行…

为什么选择TikTok直播专线而不是节点?

TikTok直播已成为许多商家的重要营销手段,而网络质量作为营销直播效果的关键因素,使得商家们开始应用TikTok直播专线。虽然与节点相比,专线的价格稍高,但更多商家都倾向于选择TikTok直播专线。那么,为什么TikTok直播更…

盒子模型之怪异盒模型

这个是标准盒模型 这个是怪异盒模型 box-sizing:content-box;默认是标准盒模型 box-sizing:border-box;是怪异盒模型&#xff0c;会挤压里面的内容&#xff0c;不管怎么设置边框始终都是当初设置的200px <!DOCTYPE html> <html lang"en"> <head>…

分类分析模型

目录 1.目的 2.内容 2.1决策树分类模型 2.2K近邻分类模型 3.代码实现 3.1分类分析模型 3.2K近邻分类模型 1.目的 掌握利用Python语言及相关库编写决策树分类分析模型的方法&#xff0c;所构建的决策树能够对给定的数据集进行分类。掌握利用Python语言及相关库编写K近邻分…

Android多线程:Handler runOnUiThread 异步消息处理机制

目录 一&#xff0c;Android中的多线程问题 1.模拟耗时工作 2.Android开启子线程 二&#xff0c;在子线程中更新UI 1.异步消息处理机制 Handler 2.使用runOnUiThread更新UI 一&#xff0c;Android中的多线程问题 Android用户界面是与用户交互的接口&#xff0c;对于用户的…

免费ssl通配符证书申请教程

在互联网安全日益受到重视的今天&#xff0c;启用HTTPS已经成为网站运营的基本要求。它不仅保障用户数据传输的安全&#xff0c;提升搜索引擎排名&#xff0c;还能增强用户对网站的信任。通配符证书是一种SSL/TLS证书&#xff0c;用于同时保护一个域名及其所有下一级子域名的安…

CSS基础:display的3个常见属性值详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具…

Flutter第九弹 构建列表元素间距

目标&#xff1a; 1&#xff09;Flutter Widget组件之间间距怎么表示&#xff1f; 2&#xff09;列表怎么定义子项之间间距&#xff1f; 一、间距的表示组件 列表组件的间距一般采用固定间距&#xff0c;间距占据可见的空间。 已经使用的表示间距的组件 Spacer&#xff1a…

MATLAB实现遗传算法优化公铁水联运

公铁水联运是运输行业的经典问题, 常用智能算法进行优化,比如遗传算法. 公铁水多式联运优化的数学模型如下&#xff1a; 1.模型简介 公铁水多式联运优化问题可以抽象为一个网络流问题&#xff0c;其中节点代表不同的运输方式转换点&#xff08;如公路、铁路、水运的交汇点&a…

x264编码器 MV 预测

H264 编码标准中MV预测的目的 每个分割 MV 的编码需要相当数目的比特,特别是使用小分割尺寸时。为减少传输比特数,可利用邻近分割的 MV 较强的相关性,MV 可由邻近已编码分割的 MV 预测而得。预测矢量 MVp 基于已计算 MV 和 MVD(预测与当前的差异)并被编码和传送。MVp 则取决…

【C++航海王:追寻罗杰的编程之路】C++11(上)

目录 1 -> C11简介 2 -> 统一的列表初始化 2.1 -> {}初始化 2.2 -> std::initializer_list 3 -> 声明 3.1 -> auto 3.2 -> decltype 3.3 -> nullptr 1 -> C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C…

解决跨域和https不能访问的问题。

本地安装了项目,是一键安装的,安装之后还是apache的web服务器,有个视频服务用的是https的服务,要对这个项目进行二次开发,本地调用没问题,可是别人已调用就跨域。只能本地访问。 现在有两个问题:1.解决跨域问题 2.还要解决https访问的问题。 解决思路,用nginx 的ssl证…

网络编程套接字(三)之TCP服务器简单实现

目录 一、服务端TcpServer 1、tcp_server.hpp 2、tcp_server.cc 二、客户端TcpClient tcp_client.cc 三、服务器和客户端进行通信 四、完整代码 一、服务端TcpServer 首先我们需要对服务端进行封装。我们需要的成员变量有IP地址&#xff0c;端口号port&#xff0c;以及监…

CentOS7下安装mysql8或者mysql5.7

mysql8 1、下载 访问mysql官网下载mysql8软件包 https://dev.mysql.com/downloads/mysql/ 选择相应的版本如&#xff1a;RPM Bundle mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar RPM Bundle 8.0.33 下载地址&#xff1a;https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.…

Android的一些总结

先打开自定义的app显示欢迎->消失 打开桌面应用程序->在桌面应用程序中也要能一键启动打开视频播放的app 桌面应用程序广播接收者进行监听&#xff0c;然后打开服务/activity是可行的。 ########################## 日志&#xff0c;调试&#xff1a; Usb 无线 串口…

Vue3从入门到实战:深度了解相关API

shallowRef 作用&#xff1a;创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。 用法&#xff1a; let myVar shallowRef(initialValue); 特点&#xff1a;只跟踪引用值的变化&#xff0c;不关心值内部的属性变化。 shallowReactive 作用&#xff1a;创建一个…

【MySQL】表的基本约束

文章目录 1、约束类型1.1NOT NULL约束1.2UNIQUE&#xff1a;唯一约束1.3DEFAULT&#xff1a;默认值约束1.4PRIMARY KEY&#xff1a;主键约束1.5FOREIGN KEY&#xff1a;外键约束 2、表的设计2.1一对一2.2一对多2.3多对多 1、约束类型 关键字解释NOT NULL指示某列不能存储NULL值…

在线编辑器 CodeMirror

如何优雅的在网页显示代码 如果开发在线编辑器 引入资源&#xff1a; <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.60.0/codemirror.min.css"><script src"https://cdnjs.cloudflare.com/ajax/libs/c…