基于Python打造一個(gè)媒體管理播放器
背景
在日常生活中,我們經(jīng)常需要管理和播放大量媒體文件。市面上的音頻播放器可能功能單一,或者界面復(fù)雜。作為一名程序員,我決定使用Python自己打造一個(gè)簡(jiǎn)單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) # 水平布局用于兩個(gè)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) # 綁定滑動(dòng)條事件 self.progress_slider.Bind(wx.EVT_SLIDER, self.on_slider_change) # 音頻播放相關(guān)變量 self.current_track = None self.track_length = 0 # 定時(shí)器用于更新進(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移動(dòng)到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('沒(méi)有找到收藏文件', '錯(cuò)誤') 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() # 獲取音頻文件長(zhǎng)度 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)) # 啟動(dòng)定時(shí)器更新進(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): # 拖動(dòng)進(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ù)選型
對(duì)于這個(gè)項(xiàng)目,我選擇了以下Python庫(kù):
wxPython:構(gòu)建跨平臺(tái)GUI界面
pygame:音頻播放和控制
mutagen:獲取音頻文件元數(shù)據(jù)
json:配置文件存儲(chǔ)
核心功能設(shè)計(jì)
1. 文件瀏覽與收藏
用戶可以輕松地:
- 選擇文件夾
- 瀏覽媒體文件列表
- 快速將文件添加到收藏列表
- 保存和加載收藏列表
2. 音頻播放控制
提供完整的播放體驗(yàn):
- 播放選中的音頻文件
- 停止當(dāng)前播放
- 拖動(dòng)進(jìn)度條調(diào)節(jié)播放位置
- 實(shí)時(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() # 獲取音頻文件長(zhǎng)度 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)
跨平臺(tái)GUI:使用wxPython確保應(yīng)用在Windows、Mac、Linux上都能運(yùn)行
靈活的文件管理:支持多種音頻格式
配置持久化:使用JSON保存收藏列表
實(shí)時(shí)進(jìn)度控制:通過(guò)定時(shí)器實(shí)現(xiàn)播放進(jìn)度追蹤
安裝與運(yùn)行
# 安裝依賴 pip install wxPython pygame mutagen # 運(yùn)行應(yīng)用 python media_manager.py
使用場(chǎng)景
個(gè)人音樂(lè)收藏管理
音頻文件快速瀏覽
簡(jiǎn)單的本地音樂(lè)播放需求
未來(lái)改進(jìn)方向
添加播放列表功能
支持更多音頻格式
增加音量控制
實(shí)現(xiàn)歌詞顯示
運(yùn)行結(jié)果
結(jié)語(yǔ)
這個(gè)項(xiàng)目證明了Python強(qiáng)大的跨平臺(tái)開(kāi)發(fā)能力。短短200行代碼,我們就實(shí)現(xiàn)了一個(gè)功能完善的媒體管理播放器。對(duì)于想要定制音頻管理工具的開(kāi)發(fā)者來(lái)說(shuō),這是一個(gè)很好的起點(diǎn)。
到此這篇關(guān)于基于Python打造一個(gè)媒體管理播放器的文章就介紹到這了,更多相關(guān)Python媒體管理播放器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例
今天小編就為大家分享一篇Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Pygame實(shí)戰(zhàn)練習(xí)之紙牌21點(diǎn)游戲
21點(diǎn)想必是很多人童年時(shí)期的經(jīng)典游戲,我們依舊能記得抱個(gè)老人機(jī)娛樂(lè)的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于如何利用python寫一個(gè)簡(jiǎn)單的21點(diǎn)小游戲的相關(guān)資料,需要的朋友可以參考下2021-09-09關(guān)于Python字典的底層實(shí)現(xiàn)原理
這篇文章主要介紹了關(guān)于Python字典的底層實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02python清華pip鏡像源報(bào)HTTP error 403錯(cuò)誤解決辦法
這篇文章主要介紹了如何解決在使用pip安裝Python包時(shí)遇到的403錯(cuò)誤,提供了三種解決方法,并強(qiáng)調(diào)了清除緩存以使更改生效的重要性,需要的朋友可以參考下2024-12-12Python實(shí)現(xiàn)Canny及Hough算法代碼實(shí)例解析
這篇文章主要介紹了Python實(shí)現(xiàn)Canny與Hough算法代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Python+?Flask實(shí)現(xiàn)Mock?Server詳情
這篇文章主要介紹了Python+?Flask實(shí)現(xiàn)Mock?Server詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09pycharm打包python項(xiàng)目為exe執(zhí)行文件的實(shí)例代碼
這篇文章主要介紹了pycharm打包python項(xiàng)目為exe執(zhí)行文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07