admin管理员组

文章数量:1583558

音频播放是许多应用程序中的基础功能之一。在 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

  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 的使用,并鼓励你尝试扩展和改进这个音乐播放器。

本文标签: 播放器音乐三方简易格式