admin管理员组文章数量:1583694
音频播放是许多应用程序中的基础功能之一。在 Python 中,PyAudio 是一个强大且易于使用的库,能够处理音频流。本文将介绍如何使用 PyAudio 结合其他一些 Python 库,构建一个简易的音乐播放器,支持播放 WAV 文件和 MP3 文件。
🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:
gylzbk
)
💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
pyaudio:基于pyaudio和pydub 实现一个简易音乐播放器播放wav、mp3等格式音乐
- 简介
- 环境准备
- 安装必要的库
- 安装 FFmpeg
- Windows
- macOS
- Linux
- 实现音乐播放器
- 完整代码实现
- 界面展示和使用方法
- 步骤2:详解每个操作
- 打开文件
- 播放音乐
- 播放 WAV 文件
- 播放 MP3 文件
- 暂停和停止音乐
- 结论
简介
音频播放是许多应用程序中的基础功能之一。在 Python 中,PyAudio 是一个强大且易于使用的库,能够处理音频流。本文将介绍如何使用 PyAudio 结合其他一些 Python 库,构建一个简易的音乐播放器,支持播放 WAV 文件和 MP3 文件。
环境准备
安装必要的库
首先,我们需要安装一些必要的库。PyAudio、pydub(用于处理和转换音频文件)以及 tkinter(用于创建图形用户界面)。
pip install pyaudio pydub tkinter
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RBiu3Wk-1720231572303)(https://i-blog.csdnimg/direct/2cfa77d00a754818aa3e557a3cbf2825.png)]
如果安装pyaudio过程中遇到上述错误,可以到PyAudio 预编译二进制文件下载whl文件安装。
pip intall PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
安装 FFmpeg
pydub
库依赖于 FFmpeg 进行 MP3 等格式的音频解码,在安装 pyaudio 和 pydub 之前,请确保你的系统已经安装了 FFmpeg。
Windows
- 下载 ffmpeg。
- 解压缩下载的文件,并将包含
bin
文件夹的路径添加到系统环境变量PATH
。
macOS
使用 Homebrew 安装:
brew install ffmpeg
Linux
使用包管理器安装:
sudo apt-get install ffmpeg
实现音乐播放器
接下来,我们将构建一个简易的音乐播放器,支持基础的播放、暂停和停止功能。
完整代码实现
首先,创建一个 Python 文件并导入所需的库。
import pyaudio
import wave
import threading
import time
from pydub import AudioSegment
from tkinter import Tk, filedialog, Button, Label
class MusicPlayer:
def __init__(self, root):
self.root = root
self.root.title("Music Player")
self.paused = False
self.stop_flag = False
# 初始化 PyAudio
self.p = pyaudio.PyAudio()
# 创建 GUI
self.label = Label(root, text="No file selected")
self.label.pack(pady=10)
self.play_button = Button(root, text="Play", command=self.play_music)
self.play_button.pack(pady=10)
self.pause_button = Button(root, text="Pause", command=self.pause_music)
self.pause_button.pack(pady=10)
self.stop_button = Button(root, text="Stop", command=self.stop_music)
self.stop_button.pack(pady=10)
self.open_button = Button(root, text="Open File", command=self.open_file)
self.open_button.pack(pady=10)
def open_file(self):
self.filename = filedialog.askopenfilename(filetypes=[("Audio Files", "*.wav;*.mp3")])
if self.filename:
self.label.config(text=self.filename.split("/")[-1])
def play_music(self):
self.stop_flag = False
if hasattr(self, 'filename'):
self.thread = threading.Thread(target=self.play_audio)
self.thread.start()
def play_audio(self):
extension = self.filename.split('.')[-1].lower()
if extension == 'wav':
self.play_wav()
elif extension == 'mp3':
self.play_mp3()
def play_wav(self):
# 打开 WAV 文件
wf = wave.open(self.filename, 'rb')
# 打开音频流
stream = self.p.open(format=self.p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
chunk = 1024
data = wf.readframes(chunk)
while data and not self.stop_flag:
if not self.paused:
stream.write(data)
data = wf.readframes(chunk)
else:
time.sleep(0.1)
stream.stop_stream()
stream.close()
wf.close()
def play_mp3(self):
# 加载 MP3 文件
audio = AudioSegment.from_mp3(self.filename)
# 打开音频流
stream = self.p.open(format=self.p.get_format_from_width(2),
channels=audio.channels,
rate=audio.frame_rate,
output=True)
chunk_length_ms = 20 # 每块20ms
chunks = [audio[i:i + chunk_length_ms] for i in range(0, len(audio), chunk_length_ms)]
for chunk in chunks:
if self.stop_flag:
break
if not self.paused:
stream.write(chunk._data)
else:
time.sleep(0.1)
stream.stop_stream()
stream.close()
def pause_music(self):
self.paused = not self.paused
if self.paused:
self.pause_button.config(text="Resume")
else:
self.pause_button.config(text="Pause")
def stop_music(self):
self.stop_flag = True
self.paused = False
self.pause_button.config(text="Pause")
if __name__ == "__main__":
root = Tk()
player = MusicPlayer(root)
root.mainloop()
界面展示和使用方法
如下图所示,先点击Open File
按钮选择一个音乐文件,然后点击Play
按钮即可播放,点击Pause
按钮即可暂停播放,点击Stop
按钮即可停止播放。
步骤2:详解每个操作
打开文件
用户可以点击 “Open File” 按钮选择一个音频文件。支持的文件格式包括 WAV 和 MP3。
def open_file(self):
self.filename = filedialog.askopenfilename(filetypes=[("Audio Files", "*.wav;*.mp3")])
if self.filename:
self.label.config(text=self.filename.split("/")[-1])
播放音乐
点击 “Play” 按钮后,将根据文件扩展名选择适当的函数进行播放。播放过程在一个独立线程中进行,保证 GUI 的流畅性。
def play_music(self):
self.stop_flag = False
if hasattr(self, 'filename'):
self.thread = threading.Thread(target=self.play_audio)
self.thread.start()
播放 WAV 文件
使用 PyAudio 播放 WAV 文件:
def play_wav(self):
# 打开 WAV 文件
wf = wave.open(self.filename, 'rb')
# 打开音频流
stream = self.p.open(format=self.p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
chunk = 1024
data = wf.readframes(chunk)
while data and not self.stop_flag:
if not self.paused:
stream.write(data)
data = wf.readframes(chunk)
else:
time.sleep(0.1)
stream.stop_stream()
stream.close()
wf.close()
播放 MP3 文件
使用 pydub 播放 MP3 文件:
def play_mp3(self):
# 加载 MP3 文件
audio = AudioSegment.from_mp3(self.filename)
# 打开音频流
stream = self.p.open(format=self.p.get_format_from_width(2),
channels=audio.channels,
rate=audio.frame_rate,
output=True)
chunk_length_ms = 20 # 每块20ms
chunks = [audio[i:i + chunk_length_ms] for i in range(0, len(audio), chunk_length_ms)]
for chunk in chunks:
if self.stop_flag:
break
if not self.paused:
stream.write(chunk._data)
else:
time.sleep(0.1)
stream.stop_stream()
stream.close()
暂停和停止音乐
提供暂停和继续播放功能,以及完全停止播放的功能:
def pause_music(self):
self.paused = not self.paused
if self.paused:
self.pause_button.config(text="Resume")
else:
self.pause_button.config(text="Pause")
def stop_music(self):
self.stop_flag = True
self.paused = False
self.pause_button.config(text="Pause")
结论
通过本文的介绍,我们使用 PyAudio 和 pydub 库实现了一个简易的音乐播放器,并使用 tkinter 创建了一个图形用户界面。这个简易的音乐播放器支持基础的操作,如播放、暂停和停止音频文件。希望这篇文章能够帮助你更好地理解 PyAudio 的使用,并鼓励你尝试扩展和改进这个音乐播放器。
版权声明:本文标题:【Python三方库】pyaudio:基于pyaudio和pydub 实现一个简易音乐播放器播放wav、mp3等格式音乐 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727920976a1138195.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论