【Python三方库】pyaudio:基于pyaudio和pydub 实现一个简易音乐播放器播放wav、mp3等格式音乐

音频播放是许多应用程序中的基础功能之一。在 Python 中,PyAudio 是一个强大且易于使用的库,能够处理音频流。本文将介绍如何使用 PyAudio 结合其他一些 Python 库,构建一个简易的音乐播放器,支持播放 WAV 文件和 MP3 文件。

在这里插入图片描述


🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk

💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

在这里插入图片描述

简介

音频播放是许多应用程序中的基础功能之一。在 Python 中,PyAudio 是一个强大且易于使用的库,能够处理音频流。本文将介绍如何使用 PyAudio 结合其他一些 Python 库,构建一个简易的音乐播放器,支持播放 WAV 文件和 MP3 文件。

环境准备

安装必要的库

首先,我们需要安装一些必要的库。PyAudio、pydub(用于处理和转换音频文件)以及 tkinter(用于创建图形用户界面)。

pip install pyaudio pydub tkinter

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RBiu3Wk-1720231572303)(https://i-blog.csdnimg.cn/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

  1. 下载 ffmpeg
  2. 解压缩下载的文件,并将包含 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 的使用,并鼓励你尝试扩展和改进这个音乐播放器。

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I'mAlex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值