基于Python打造一个媒体管理播放器

 更新时间:2024年11月03日 09:20:41   作者:winfredzhang  
在日常生活中,我们经常需要管理和播放大量媒体文件,这篇文章主要介绍了如何使用Python自己打造一个简单又强大的媒体管理播放器,希望对大家有所帮助

背景

在日常生活中,我们经常需要管理和播放大量媒体文件。市面上的音频播放器可能功能单一,或者界面复杂。作为一名程序员,我决定使用Python自己打造一个简单yet强大的媒体管理播放器。

C:\pythoncode\new\playsong.py

全部代码

import os
import wx
import json
import pygame
from mutagen.mp3 import MP3
from mutagen.wave import WAVE

class MediaManagerApp(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='媒体文件管理器', size=(800, 600))
        
        # 初始化pygame mixer
        pygame.mixer.init()
        
        # 配置文件路径
        self.config_path = 'favorites.json'
        
        # 创建面板
        panel = wx.Panel(self)
        
        # 垂直布局
        main_sizer = wx.BoxSizer(wx.VERTICAL)
        
        # 水平布局用于两个ListBox
        list_sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        # 创建ListBox1(所有媒体文件)
        wx.StaticText(panel, label='所有媒体文件:')
        self.listbox1 = wx.ListBox(panel, style=wx.LB_MULTIPLE)
        list_sizer.Add(wx.StaticText(panel, label='所有媒体文件:'), 0, wx.ALL, 5)
        list_sizer.Add(self.listbox1, 1, wx.EXPAND | wx.ALL, 5)
        
        # 创建ListBox2(收藏文件)
        wx.StaticText(panel, label='收藏文件:')
        self.listbox2 = wx.ListBox(panel, style=wx.LB_MULTIPLE)
        list_sizer.Add(wx.StaticText(panel, label='收藏文件:'), 0, wx.ALL, 5)
        list_sizer.Add(self.listbox2, 1, wx.EXPAND | wx.ALL, 5)
        
        main_sizer.Add(list_sizer, 1, wx.EXPAND)
        
        # 进度条
        self.progress_slider = wx.Slider(panel, style=wx.SL_HORIZONTAL | wx.SL_LABELS)
        main_sizer.Add(self.progress_slider, 0, wx.EXPAND | wx.ALL, 5)
        
        # 按钮区域
        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        # 选择文件夹按钮
        select_folder_btn = wx.Button(panel, label='选择文件夹')
        select_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_folder)
        btn_sizer.Add(select_folder_btn, 0, wx.ALL, 5)
        
        # 收藏按钮
        collect_btn = wx.Button(panel, label='收藏')
        collect_btn.Bind(wx.EVT_BUTTON, self.on_collect)
        btn_sizer.Add(collect_btn, 0, wx.ALL, 5)
        
        # 保存按钮
        save_btn = wx.Button(panel, label='保存')
        save_btn.Bind(wx.EVT_BUTTON, self.on_save)
        btn_sizer.Add(save_btn, 0, wx.ALL, 5)
        
        # 加载按钮
        load_btn = wx.Button(panel, label='加载')
        load_btn.Bind(wx.EVT_BUTTON, self.on_load)
        btn_sizer.Add(load_btn, 0, wx.ALL, 5)
        
        # 播放按钮
        play_btn = wx.Button(panel, label='播放')
        play_btn.Bind(wx.EVT_BUTTON, self.on_play)
        btn_sizer.Add(play_btn, 0, wx.ALL, 5)
        
        # 停止按钮
        stop_btn = wx.Button(panel, label='停止')
        stop_btn.Bind(wx.EVT_BUTTON, self.on_stop)
        btn_sizer.Add(stop_btn, 0, wx.ALL, 5)
        
        main_sizer.Add(btn_sizer, 0, wx.CENTER)
        
        panel.SetSizer(main_sizer)
        
        # 绑定滑动条事件
        self.progress_slider.Bind(wx.EVT_SLIDER, self.on_slider_change)
        
        # 音频播放相关变量
        self.current_track = None
        self.track_length = 0
        
        # 定时器用于更新进度
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.update_progress, self.timer)
        
    def on_select_folder(self, event):
        # 选择文件夹并列出媒体文件
        with wx.DirDialog(self, "选择包含媒体文件的文件夹") as dirDialog:
            if dirDialog.ShowModal() == wx.ID_OK:
                folder_path = dirDialog.GetPath()
                self.listbox1.Clear()
                
                # 支持的媒体文件扩展名
                media_extensions = ['.mp3', '.wav', '.ogg', '.flac']
                
                # 遍历文件夹
                for filename in os.listdir(folder_path):
                    if os.path.splitext(filename)[1].lower() in media_extensions:
                        full_path = os.path.join(folder_path, filename)
                        self.listbox1.Append(full_path)
    
    def on_collect(self, event):
        # 将选中的文件从listbox1移动到listbox2
        selections = self.listbox1.GetSelections()
        for index in reversed(selections):
            item = self.listbox1.GetString(index)
            self.listbox2.Append(item)
            self.listbox1.Delete(index)
    
    def on_save(self, event):
        # 将收藏的文件保存到配置文件
        favorites = [self.listbox2.GetString(i) for i in range(self.listbox2.GetCount())]
        with open(self.config_path, 'w', encoding='utf-8') as f:
            json.dump(favorites, f)
        wx.MessageBox('收藏已保存', '提示')
    
    def on_load(self, event):
        # 从配置文件加载收藏的文件
        try:
            with open(self.config_path, 'r', encoding='utf-8') as f:
                favorites = json.load(f)
            
            self.listbox2.Clear()
            for filepath in favorites:
                if os.path.exists(filepath):
                    self.listbox2.Append(filepath)
        except FileNotFoundError:
            wx.MessageBox('没有找到收藏文件', '错误')
    
    def on_play(self, event):
        # 播放选中的文件
        selections = self.listbox2.GetSelections()
        if selections:
            filepath = self.listbox2.GetString(selections[0])
            pygame.mixer.music.load(filepath)
            pygame.mixer.music.play()
            
            # 获取音频文件长度
            if filepath.lower().endswith('.mp3'):
                audio = MP3(filepath)
                self.track_length = audio.info.length
            elif filepath.lower().endswith('.wav'):
                audio = WAVE(filepath)
                self.track_length = audio.info.length
            else:
                self.track_length = 0
            
            # 设置进度条最大值
            self.progress_slider.SetRange(0, int(self.track_length))
            
            # 启动定时器更新进度
            self.timer.Start(1000)  # 每秒更新
            
            self.current_track = filepath
    
    def on_stop(self, event):
        # 停止播放
        pygame.mixer.music.stop()
        self.timer.Stop()
        self.progress_slider.SetValue(0)
    
    def on_slider_change(self, event):
        # 拖动进度条
        if self.current_track:
            new_pos = self.progress_slider.GetValue()
            pygame.mixer.music.rewind()
            pygame.mixer.music.set_pos(new_pos)
    
    def update_progress(self, event):
        # 更新进度条
        if pygame.mixer.music.get_busy():
            current_time = pygame.mixer.music.get_pos() / 1000  # 毫秒转秒
            self.progress_slider.SetValue(int(current_time))

def main():
    app = wx.App()
    frame = MediaManagerApp()
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

技术选型

对于这个项目,我选择了以下Python库:

wxPython:构建跨平台GUI界面

pygame:音频播放和控制

mutagen:获取音频文件元数据

json:配置文件存储

核心功能设计

1. 文件浏览与收藏

用户可以轻松地:

  • 选择文件夹
  • 浏览媒体文件列表
  • 快速将文件添加到收藏列表
  • 保存和加载收藏列表

2. 音频播放控制

提供完整的播放体验:

  • 播放选中的音频文件
  • 停止当前播放
  • 拖动进度条调节播放位置
  • 实时显示播放进度

关键代码解析

文件遍历

def on_select_folder(self, event):
    with wx.DirDialog(self, "选择包含媒体文件的文件夹") as dirDialog:
        if dirDialog.ShowModal() == wx.ID_OK:
            folder_path = dirDialog.GetPath()
            # 遍历支持的媒体文件
            media_extensions = ['.mp3', '.wav', '.ogg', '.flac']
            for filename in os.listdir(folder_path):
                if os.path.splitext(filename)[1].lower() in media_extensions:
                    full_path = os.path.join(folder_path, filename)
                    self.listbox1.Append(full_path)

音频播放控制

def on_play(self, event):
    selections = self.listbox2.GetSelections()
    if selections:
        filepath = self.listbox2.GetString(selections[0])
        pygame.mixer.music.load(filepath)
        pygame.mixer.music.play()
        
        # 获取音频文件长度
        audio = MP3(filepath) if filepath.lower().endswith('.mp3') else WAVE(filepath)
        self.track_length = audio.info.length
        
        # 设置进度条
        self.progress_slider.SetRange(0, int(self.track_length))
        self.timer.Start(1000)

技术亮点

跨平台GUI:使用wxPython确保应用在Windows、Mac、Linux上都能运行

灵活的文件管理:支持多种音频格式

配置持久化:使用JSON保存收藏列表

实时进度控制:通过定时器实现播放进度追踪

安装与运行

# 安装依赖
pip install wxPython pygame mutagen

# 运行应用
python media_manager.py

使用场景

个人音乐收藏管理

音频文件快速浏览

简单的本地音乐播放需求

未来改进方向

添加播放列表功能

支持更多音频格式

增加音量控制

实现歌词显示

运行结果

结语

这个项目证明了Python强大的跨平台开发能力。短短200行代码,我们就实现了一个功能完善的媒体管理播放器。对于想要定制音频管理工具的开发者来说,这是一个很好的起点。

到此这篇关于基于Python打造一个媒体管理播放器的文章就介绍到这了,更多相关Python媒体管理播放器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Tensorflow获取张量Tensor的具体维数实例

    Tensorflow获取张量Tensor的具体维数实例

    今天小编就为大家分享一篇Tensorflow获取张量Tensor的具体维数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Pygame实战练习之纸牌21点游戏

    Pygame实战练习之纸牌21点游戏

    21点想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,下面这篇文章主要给大家介绍了关于如何利用python写一个简单的21点小游戏的相关资料,需要的朋友可以参考下
    2021-09-09
  • Python中的类属性与实例属性区别详解

    Python中的类属性与实例属性区别详解

    这篇文章主要介绍了Python中的类属性与实例属性区别详解,类属性是在类中定义的属性,它是和这个类所绑定的,这个类中的所有对象都可以访问,实例属性是与类的实例相关联的数据值,是这个实例私有的,需要的朋友可以参考下
    2023-08-08
  • 关于Python字典的底层实现原理

    关于Python字典的底层实现原理

    这篇文章主要介绍了关于Python字典的底层实现原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • python清华pip镜像源报HTTP error 403错误解决办法

    python清华pip镜像源报HTTP error 403错误解决办法

    这篇文章主要介绍了如何解决在使用pip安装Python包时遇到的403错误,提供了三种解决方法,并强调了清除缓存以使更改生效的重要性,需要的朋友可以参考下
    2024-12-12
  • python 模块导入问题汇总

    python 模块导入问题汇总

    在本篇文章里小编给大家整理的是一篇关于python 模块导入问题汇总内容,有需要的朋友们可以学习参考下。
    2021-02-02
  • Python实现Canny及Hough算法代码实例解析

    Python实现Canny及Hough算法代码实例解析

    这篇文章主要介绍了Python实现Canny与Hough算法代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python+ Flask实现Mock Server详情

    Python+ Flask实现Mock Server详情

    这篇文章主要介绍了Python+ Flask实现Mock Server详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • pycharm打包python项目为exe执行文件的实例代码

    pycharm打包python项目为exe执行文件的实例代码

    这篇文章主要介绍了pycharm打包python项目为exe执行文件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Python中Get()函数用法举例介绍

    Python中Get()函数用法举例介绍

    这篇文章主要给大家介绍了关于Python中Get()函数用法的相关资料,Python get()函数是一个非常重要的函数,它可以帮助我们从字典中获取对应键的值,避免了因为键不存在而发生错误的情况,需要的朋友可以参考下
    2023-10-10

最新评论