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

这篇具有很好参考价值的文章主要介绍了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使用这些库实现的简单的本地视频播放器,给先给出效果图:

Python实现本地视频/音频播放器,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 = root
        self.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 = None
        self.is_paused = False
        self.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 = False
            self.is_paused = False
            self.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  # 如果停止播放,则释放播放器资源
            return

        frame, val = self.player.get_frame()  # 获取下一帧和帧间隔
        if val == 'eof':
            self.player = None  # 如果到达视频末尾,则释放播放器资源
            return
        elif frame is None:
            self.root.after(10, self.play_video)  # 如果没有帧,则稍后再试
            return

        # 将帧图像转换为Tkinter PhotoImage并显示在画布上
        image, pts = frame
        image = 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实现本地视频/音频播放器,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 = root
        self.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)

        # 创建时间轴,时间轴指示的时间可能不准确,注意to 值的设置
        self.timeline = tk.Scale(root, from_=0, to=250, orient=tk.HORIZONTAL)
        self.timeline.pack(fill=tk.X)

        # 初始化播放器和播放状态标志
        self.player = None
        self.is_paused = False
        self.is_stopped = False
        self.video_duration = 0

    def open_file(self):
        file_path = filedialog.askopenfilename(filetypes=[("Video files", "*.mp4;*.avi;*.mov;*.wmv;*.mkv;*.flv;*.mpeg;*.3gp")])
        if file_path:
            self.is_stopped = False
            self.is_paused = False
            self.start_video(file_path) # 开始播放选择的视频文件

    def start_video(self, file_path):
        self.player = MediaPlayer(file_path)
        self.video_duration = self.player.get_metadata()['duration']
        self.timeline.config(to=self.video_duration)
        self.play_video() # 开始播放视频 

    def play_video(self):
        if self.is_stopped:
            self.player = None
            return

        frame, val = self.player.get_frame() # 获取下一帧和帧间隔
        if val == 'eof':
            self.player = None
            return
        elif frame is None:
            self.root.after(10, self.play_video) # 如果没有帧,则稍后再试
            return

        # 将帧图像转换为Tkinter PhotoImage并显示在画布上
        image, pts = frame
        image = 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

        self.timeline.set(pts)  # Update the timeline value(更新时间轴值)

        # 如果没有暂停,则继续播放下一帧
        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()
    app = VideoPlayTk(root)
    root.mainloop()


提示,时间轴指示的时间可能不准确。待找到处理方法时更新。

附录

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

给先给出效果图:

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

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

源码如下:

import tkinter as tk
from tkinter import filedialog
import pygame
import time

class MusicPlayer:
    def __init__(self, root):
        self.root = root
        self.root.title('Music Player')
        self.root.geometry('400x200')

        pygame.init()
        pygame.mixer.init()

        self.status = 'stopped'
        self.current_time = 0
        self.total_time = 0

        self.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 / 00:00')
        self.time_label.pack()

        self.file_label = tk.Label(self.root, text='加载的音乐文件: ')
        self.file_label.pack()

        self.update_time()

    def load_music(self):
        self.file_path = filedialog.askopenfilename(filetypes=[("Audio files", "*.mp3; *.wav; *.ogg")])
        pygame.mixer.music.load(self.file_path)
        self.total_time = pygame.mixer.Sound(self.file_path).get_length()
        self.file_label.config(text='加载的音乐文件: ' + 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() // 1000
            mins, secs = divmod(self.current_time, 60)
            timeformat = '{:02d}:{:02d}'.format(mins, secs)
            total_mins, total_secs = divmod(int(self.total_time), 60)
            total_timeformat = '{:02d}:{:02d}'.format(total_mins, total_secs)
            self.time_label.config(text='{} / {}'.format(timeformat, total_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文章来源地址https://www.toymoban.com/news/detail-859049.html

到了这里,关于Python实现本地视频/音频播放器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 浏览器网页内嵌Qt-C++音视频播放器的实现,支持软硬解码,支持音频,支持录像截图,支持多路播放等,提供源码工程下载

    浏览器网页内嵌Qt-C++音视频播放器的实现,支持软硬解码,支持音频,支持录像截图,支持多路播放等,提供源码工程下载

        在浏览器中实现播放RTSP实时视频流,⼤体上有如下⼏个⽅案: ⽅案一:浏览器插件⽅案 ActiveX、NPAPI、PPAPI     ActiveX插件适用于IE浏览器,NPAPI与PPAPI插件适用于谷歌浏览器,不过这些插件都已经不被浏览器所支持。 ⽅案二:先转码再转流⽅案     ⼯作原理是架设一

    2024年01月17日
    浏览(51)
  • Vue 3 + ffmpeg + wasm 实现前端视频剪辑、音频剪辑、音波展示、视频抽帧、gif抽帧、帧播放器、字幕、贴图、时间轴、素材轨道

    预览 www.bilibili.com/video/BV1YT411Y7YJ 技术栈: 💪 Vue 3、Vue-Router 4、Vite、pnpm、esbuild、TypeScript ☀️ Pinia 状态管理 🌪 Tailwind 原子css集成 💥 ffmpeg、wasm 底层音视频处理集成 功能 多轨道时间轴,支持帧缩放,时间缩放 支持多种类型轨道的添加删除 多功能轨道调节,支持音视频轨

    2024年02月11日
    浏览(17)
  • 基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频

    基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    2024年02月13日
    浏览(71)
  • 用Python编写一个通用视频播放器:让您观看任何类型的正经视频!

    用Python编写一个通用视频播放器:让您观看任何类型的正经视频! 在这篇文章中,我将向您展示如何使用Python编写一个简单但功能强大的视频播放器。这个播放器将能够处理各种视频文件格式,并提供基本的播放、暂停、停止和进度控制功能。让我们开始吧! 首先,我们需

    2024年02月03日
    浏览(13)
  • Python轻松实现音乐播放器

    Python轻松实现音乐播放器

    来个新玩意就是教大家如何用python来制作一个音乐播放器 希望对大家有所帮助哈哈 你们也可以尝试自己做做 先给你们展示展示最简单的,只需要九行代码 知识点和所需模块 python基础知识 requests库 time pygame tkinter 线程 环境 windows pycharm 2021.2 python 3.8 ok,直接说上完整代码 !

    2024年02月11日
    浏览(16)
  • Audio API 实现音频播放器

    Audio API 实现音频播放器

    市面上实现音频播放器的库有很多,比如wavesurfer.js、howler.js等等,但是都不支持大音频文件处理,100多M的文件就有可能导致程序崩溃。总之和我目前的需求不太符合,所以打算自己实现一个音频播放器,这样不管什么需求 在技术上都可控。下面我们简单介绍下 wavesurferJs 、

    2024年02月10日
    浏览(10)
  • Vue实现自定义音频播放器组件

    Vue实现自定义音频播放器组件

    template javascript less 文档参考 关于 Audio 自定义样式 H5 audio 音频标签自定义样式修改以及添加播放控制事件

    2024年02月12日
    浏览(8)
  • Python实现多功能音乐播放器

    Python实现多功能音乐播放器

    就是用Python做一个简易的音乐播放器,废话不多说,咱们直接开干 当然,今天做这个肯定不是最简单的,最简单的音乐播放器,9行代码足以 知识点和所需模块 1.python基础知识 2.requests库 3.time 4.pygame 5.tkinter 6.线程 环境 windows pycharm 2021.2 python 3.8 简易版的 还有个半成品的,目

    2024年02月11日
    浏览(15)
  • 6款良心本地视频播放器,功能强大还完全免费

    6款良心本地视频播放器,功能强大还完全免费

    虽然现在很多人更习惯直接在线看视频,但相信一定还有很多和我一样更喜欢找质量更优质的资源下载到本地观看。在本地上看,就需要一个播放器才可以。 而系统自带的播放功能实在太拉胯了(支持的格式少,有些甚至需要付费才可以使用),所以这种情况我们就很有必要

    2024年02月02日
    浏览(15)
  • 用Qt开发的ffmpeg流媒体播放器,支持截图、录像,支持音视频播放,支持本地文件播放、网络流播放

    用Qt开发的ffmpeg流媒体播放器,支持截图、录像,支持音视频播放,支持本地文件播放、网络流播放

    本工程qt用的版本是5.8-32位,ffmpeg用的版本是较新的5.1版本。它支持TCP或UDP方式拉取实时流,实时流我采用的是监控摄像头的RTSP流。音频播放采用的是QAudioOutput,视频经ffmpeg解码并由YUV转RGB后是在QOpenGLWidget下进行渲染显示。本工程的代码有注释,可以通过本博客查看代码或者

    2024年02月03日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包