播放音频文件
无数的音乐播放器可以对音频文件进行播放,这些播放器如何操作不在本文讨论之列。本文只是从python工具箱的角度来看,如何在python代码中播放音频文件,主要是mp3文件。特别神奇的一点是在python的世界里,真的是没有特别好的播放器!笔者试验了多个第三方库,发现能用的底层基本是都是pygame这个游戏库,演示代码如下所示。
import time
import pygame
from pydub import AudioSegment
from pydub.playback import play
from pydub.utils import mediainfo
def playmp3(mp3filename):
"""
播放MP3文件
Args:
mp3filename (string): 要播放的MP3文件名
"""
song = AudioSegment.from_mp3(mp3filename)
play(song)
def playmp3_sleep(mp3filename):
"""
播放MP3文件
Args:
mp3filename (string): 要播放的MP3文件名
"""
song = mediainfo(mp3filename)
dur = song['duration']
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(mp3filename)
pygame.mixer.music.set_volume(60)
pygame.mixer.music.play()
time.sleep(round(float(dur)))
def playmp3_event(mp3filename):
"""
播放MP3文件
Args:
mp3filename (string): 要播放的MP3文件名
"""
pygame.init()
MUSIC_END = pygame.USEREVENT + 1
# 设置当前音乐播放完成后,发送自定义的消息
pygame.mixer.music.set_endevent(MUSIC_END)
# 延时0.2秒打开声音,避过爆破音
pygame.time.delay(200)
pygame.mixer.init() # 初始化
pygame.mixer.music.load(mp3filename) # 加载音乐文件
pygame.mixer.music.set_volume(60)
pygame.mixer.music.play() # 开始播放音乐流
# 定义一个退出程序标志
requireQuit = False
while not requireQuit:
# 循环接受各种事件
for event in pygame.event.get():
# 如果是自定义的播放完成消息
if event.type == MUSIC_END:
print("end event")
requireQuit = True # 退出
pygame.mixer.music.fadeout(60000)
pygame.mixer.stop()
break
time.sleep(1)
print("done")
def test_player():
mp3file = r'D:\test\Delicate.mp3'
playmp3(mp3file)
playmp3_sleep(mp3file)
playmp3_event(mp3file)
由于上述代码的底层是pygame,必须进行安装。
pip install pyaudio
pip install pydub
pip install pygame
在上面的代码中,使用了三种播放MP3的方法。
•
playmp3_event函数建立了pygame完整的循环架构。当音乐播放完成后会释放用户自定义的事件,从而结束播放。这个函数还可以进一步扩充,以响应键盘的输入,从而可以快进/快退等
•
playmp3_sleep函数则简单一些,不使用完成的循环架构,直接从mp3文件中拿到音乐的时长,开始播放后,使用sleep进行等待。等睡眠结束时,音乐正好播放完然后一起退出
•
playmp3没有使用pygame,而直接使用pydub库进行播放,写法简洁明快,但运行后能够看到,底层仍然是调用pygame库