📅  最后修改于: 2023-12-03 15:12:51.785000             🧑  作者: Mango
音频播放器是一种用于播放和管理音频文件的程序,主要用于电脑、手机、MP3等设备上。Python作为一种高级编程语言,可以用于开发音频播放器。
在Python中,可以借助第三方库来实现音频播放器的功能,如Pygame、PyAudio、pyglet等等。这些库可以播放多种音频格式,如MP3、WAV、FLAC、OGG等等。
在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循环等待播放结束即可。
当然,在实际应用中,我们需要添加更多的功能,如暂停、停止、上一首、下一首等等。
在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文件。同时,我们实现了播放、暂停/恢复、停止、上一首、下一首等功能,可以通过命令行输入相应指令来控制播放器。
使用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实现的类似,只是具体的实现方式有些不同。同样地,我们实现了播放、暂停/恢复、停止、上一首、下一首等功能,并且只需要在命令行中输入相应指令即可控制播放器。