📜  音频播放器 python (1)

📅  最后修改于: 2023-12-03 15:12:51.785000             🧑  作者: Mango

音频播放器 Python

简介

音频播放器是一种用于播放和管理音频文件的程序,主要用于电脑、手机、MP3等设备上。Python作为一种高级编程语言,可以用于开发音频播放器。

在Python中,可以借助第三方库来实现音频播放器的功能,如Pygame、PyAudio、pyglet等等。这些库可以播放多种音频格式,如MP3、WAV、FLAC、OGG等等。

Pygame实现音频播放器
安装Pygame

在Windows系统下,可以直接使用pip命令安装Pygame:

pip install pygame

在Linux或MacOS系统下,可以使用以下命令安装Pygame:

sudo apt-get install python3-pygame
示例代码

下面是一个使用Pygame实现的简单音频播放器:

import pygame

# 初始化Pygame
pygame.init()

# 加载音频文件
pygame.mixer.music.load("test.mp3")

# 播放音频
pygame.mixer.music.play()

# 等待播放结束
while pygame.mixer.music.get_busy():
    pygame.time.Clock().tick(10)

# 关闭Pygame
pygame.quit()

可以看到,使用Pygame实现音频播放器非常简单。只需要调用pygame.mixer.music.load方法加载音频文件,pygame.mixer.music.play方法播放音频,然后使用while循环等待播放结束即可。

当然,在实际应用中,我们需要添加更多的功能,如暂停、停止、上一首、下一首等等。

PyAudio实现音频播放器
安装PyAudio

在Windows系统下,可以直接使用pip命令安装PyAudio:

pip install pyaudio

在Linux或MacOS系统下,可以使用以下命令安装PyAudio:

sudo apt-get install portaudio19-dev python3-pyaudio
pip install pyaudio
示例代码

下面是一个使用PyAudio实现的音频播放器,具有播放、暂停、停止、上一首、下一首等功能:

import os
import glob
import random
import pygame
import pyaudio
import wave

# 定义音频播放器类
class AudioPlayer:
    # 初始化
    def __init__(self):
        self.file_list = glob.glob("*.mp3") + glob.glob("*.wav") # 获取音频文件列表
        self.cur_file = None # 当前播放的音频文件
        self.paused = False # 是否暂停
        self.volume = 1.0 # 音量大小
        self.pa = pyaudio.PyAudio() # 创建PyAudio对象

    # 播放音频
    def play(self, file_name):
        if not os.path.exists(file_name):
            return
        
        if self.cur_file:
            self.stop()
        
        self.cur_file = file_name

        if self.cur_file.endswith(".mp3"):
            pygame.mixer.init()
            pygame.mixer.music.load(self.cur_file)
            pygame.mixer.music.play()
        else:
            wf = wave.open(self.cur_file, 'rb')
            stream = self.pa.open(format=self.pa.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True)
            data = wf.readframes(1024)
            while data:
                if self.paused:
                    continue
                stream.write(data)
                data = wf.readframes(1024)
            stream.close()

    # 停止播放
    def stop(self):
        if self.cur_file:
            if self.cur_file.endswith(".mp3"):
                pygame.mixer.music.stop()
            else:
                self.paused = False
            self.cur_file = None

    # 暂停/恢复播放    
    def pause_resume(self):
        if self.cur_file:
            if self.cur_file.endswith(".mp3"):
                if self.paused:
                    pygame.mixer.music.unpause()
                    self.paused = False
                else:
                    pygame.mixer.music.pause()
                    self.paused = True
            else:
                self.paused = not self.paused

    # 前一首
    def prev(self):
        index = self.file_list.index(self.cur_file)
        if index > 0:
            self.stop()
            self.play(self.file_list[index-1])
    
    # 下一首
    def next(self):
        index = self.file_list.index(self.cur_file)
        if index < len(self.file_list)-1:
            self.stop()
            self.play(self.file_list[index+1])

    # 设置音量
    def set_volume(self, volume):
        if volume < 0 or volume > 1:
            return
        self.volume = volume
        if self.cur_file:
            if self.cur_file.endswith(".mp3"):
                pygame.mixer.music.set_volume(self.volume)
            else:
                pass

# 测试代码
if __name__ == "__main__":
    ap = AudioPlayer()
    ap.play(random.choice(ap.file_list)) # 随机播放一首音乐
    while True:
        cmd = input("请输入指令(p: 暂停/恢复, s: 停止, n: 下一首, b: 前一首, v: 设置音量, q: 退出):")
        if cmd == "p":
            ap.pause_resume()
        elif cmd == "s":
            ap.stop()
        elif cmd == "n":
            ap.next()
        elif cmd == "b":
            ap.prev()
        elif cmd == "v":
            volume = float(input("请输入音量大小(0-1):"))
            ap.set_volume(volume)
        elif cmd == "q":
            ap.stop()
            break

可以看到,在PyAudio实现的音频播放器中,我们利用了Pygame库来播放MP3文件,利用PyAudio库来播放WAV文件。同时,我们实现了播放、暂停/恢复、停止、上一首、下一首等功能,可以通过命令行输入相应指令来控制播放器。

pyglet实现音频播放器
安装pyglet

使用pip命令安装pyglet:

pip install pyglet
示例代码

下面是一个使用pyglet实现的音频播放器:

import os
import glob
import random
import pyglet

# 定义音频播放器类
class AudioPlayer:
    # 初始化
    def __init__(self):
        self.file_list = glob.glob("*.mp3") + glob.glob("*.wav") # 获取音频文件列表
        self.cur_file = None # 当前播放的音频文件
        self.paused = False # 是否暂停
        self.volume = 1.0 # 音量大小
        self.player = None # pyglet.media.Player对象

    # 播放音频
    def play(self, file_name):
        if not os.path.exists(file_name):
            return
        
        if self.cur_file:
            self.stop()
        
        self.cur_file = file_name

        if self.cur_file.endswith(".mp3"):
            self.player = pyglet.media.Player()
            source = pyglet.media.load(self.cur_file)
            self.player.queue(source)
            self.player.play()
        else:
            source = pyglet.media.load(self.cur_file)
            self.player = pyglet.media.Player()
            self.player.queue(source)
            self.player.play()

    # 停止播放
    def stop(self):
        if self.player:
            self.player.pause()
            self.player = None
            self.cur_file = None

    # 暂停/恢复播放    
    def pause_resume(self):
        if self.player:
            if self.paused:
                self.player.play()
                self.paused = False
            else:
                self.player.pause()
                self.paused = True

    # 前一首
    def prev(self):
        index = self.file_list.index(self.cur_file)
        if index > 0:
            self.stop()
            self.play(self.file_list[index-1])
    
    # 下一首
    def next(self):
        index = self.file_list.index(self.cur_file)
        if index < len(self.file_list)-1:
            self.stop()
            self.play(self.file_list[index+1])

    # 设置音量
    def set_volume(self, volume):
        if volume < 0 or volume > 1:
            return
        self.volume = volume
        if self.player:
            self.player.volume = self.volume

# 测试代码
if __name__ == "__main__":
    ap = AudioPlayer()
    ap.play(random.choice(ap.file_list)) # 随机播放一首音乐
    while True:
        cmd = input("请输入指令(p: 暂停/恢复, s: 停止, n: 下一首, b: 前一首, v: 设置音量, q: 退出):")
        if cmd == "p":
            ap.pause_resume()
        elif cmd == "s":
            ap.stop()
        elif cmd == "n":
            ap.next()
        elif cmd == "b":
            ap.prev()
        elif cmd == "v":
            volume = float(input("请输入音量大小(0-1):"))
            ap.set_volume(volume)
        elif cmd == "q":
            ap.stop()
            break

可以看到,利用pyglet实现的音频播放器基本上和PyAudio实现的类似,只是具体的实现方式有些不同。同样地,我们实现了播放、暂停/恢复、停止、上一首、下一首等功能,并且只需要在命令行中输入相应指令即可控制播放器。