基于Python打造一個媒體管理播放器
背景
在日常生活中,我們經(jīng)常需要管理和播放大量媒體文件。市面上的音頻播放器可能功能單一,或者界面復(fù)雜。作為一名程序員,我決定使用Python自己打造一個簡單yet強(qiáng)大的媒體管理播放器。
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'
# 創(chuàng)建面板
panel = wx.Panel(self)
# 垂直布局
main_sizer = wx.BoxSizer(wx.VERTICAL)
# 水平布局用于兩個ListBox
list_sizer = wx.BoxSizer(wx.HORIZONTAL)
# 創(chuàng)建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)
# 創(chuàng)建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)
# 進(jìn)度條
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)
# 按鈕區(qū)域
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)
# 音頻播放相關(guān)變量
self.current_track = None
self.track_length = 0
# 定時器用于更新進(jìn)度
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()
# 支持的媒體文件擴(kuò)展名
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
# 設(shè)置進(jìn)度條最大值
self.progress_slider.SetRange(0, int(self.track_length))
# 啟動定時器更新進(jìn)度
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):
# 拖動進(jìn)度條
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):
# 更新進(jìn)度條
if pygame.mixer.music.get_busy():
current_time = pygame.mixer.music.get_pos() / 1000 # 毫秒轉(zhuǎn)秒
self.progress_slider.SetValue(int(current_time))
def main():
app = wx.App()
frame = MediaManagerApp()
frame.Show()
app.MainLoop()
if __name__ == '__main__':
main()
技術(shù)選型
對于這個項(xiàng)目,我選擇了以下Python庫:
wxPython:構(gòu)建跨平臺GUI界面
pygame:音頻播放和控制
mutagen:獲取音頻文件元數(shù)據(jù)
json:配置文件存儲
核心功能設(shè)計
1. 文件瀏覽與收藏
用戶可以輕松地:
- 選擇文件夾
- 瀏覽媒體文件列表
- 快速將文件添加到收藏列表
- 保存和加載收藏列表
2. 音頻播放控制
提供完整的播放體驗(yàn):
- 播放選中的音頻文件
- 停止當(dāng)前播放
- 拖動進(jìn)度條調(diào)節(jié)播放位置
- 實(shí)時顯示播放進(jìn)度
關(guān)鍵代碼解析
文件遍歷
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
# 設(shè)置進(jìn)度條
self.progress_slider.SetRange(0, int(self.track_length))
self.timer.Start(1000)
技術(shù)亮點(diǎn)
跨平臺GUI:使用wxPython確保應(yīng)用在Windows、Mac、Linux上都能運(yùn)行
靈活的文件管理:支持多種音頻格式
配置持久化:使用JSON保存收藏列表
實(shí)時進(jìn)度控制:通過定時器實(shí)現(xiàn)播放進(jìn)度追蹤
安裝與運(yùn)行
# 安裝依賴 pip install wxPython pygame mutagen # 運(yùn)行應(yīng)用 python media_manager.py
使用場景
個人音樂收藏管理
音頻文件快速瀏覽
簡單的本地音樂播放需求
未來改進(jìn)方向
添加播放列表功能
支持更多音頻格式
增加音量控制
實(shí)現(xiàn)歌詞顯示
運(yùn)行結(jié)果

結(jié)語
這個項(xiàng)目證明了Python強(qiáng)大的跨平臺開發(fā)能力。短短200行代碼,我們就實(shí)現(xiàn)了一個功能完善的媒體管理播放器。對于想要定制音頻管理工具的開發(fā)者來說,這是一個很好的起點(diǎn)。
到此這篇關(guān)于基于Python打造一個媒體管理播放器的文章就介紹到這了,更多相關(guān)Python媒體管理播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例
今天小編就為大家分享一篇Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Pygame實(shí)戰(zhàn)練習(xí)之紙牌21點(diǎn)游戲
21點(diǎn)想必是很多人童年時期的經(jīng)典游戲,我們依舊能記得抱個老人機(jī)娛樂的場景,下面這篇文章主要給大家介紹了關(guān)于如何利用python寫一個簡單的21點(diǎn)小游戲的相關(guān)資料,需要的朋友可以參考下2021-09-09
關(guān)于Python字典的底層實(shí)現(xiàn)原理
這篇文章主要介紹了關(guān)于Python字典的底層實(shí)現(xiàn)原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
python清華pip鏡像源報HTTP error 403錯誤解決辦法
這篇文章主要介紹了如何解決在使用pip安裝Python包時遇到的403錯誤,提供了三種解決方法,并強(qiáng)調(diào)了清除緩存以使更改生效的重要性,需要的朋友可以參考下2024-12-12
Python實(shí)現(xiàn)Canny及Hough算法代碼實(shí)例解析
這篇文章主要介紹了Python實(shí)現(xiàn)Canny與Hough算法代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
Python+?Flask實(shí)現(xiàn)Mock?Server詳情
這篇文章主要介紹了Python+?Flask實(shí)現(xiàn)Mock?Server詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
pycharm打包python項(xiàng)目為exe執(zhí)行文件的實(shí)例代碼
這篇文章主要介紹了pycharm打包python項(xiàng)目為exe執(zhí)行文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07

