解决 Python 播放的方案很多,而且各个看上去好像都很有效。找一个合适你用的,还真有点难。mp3play、pymedia、pyaudio、pyglet、pygame,有些直接报错,有些只支持 Windows,最让我吐槽的是 pygame。
选择 pygame
经过各种测试,唯一让我还算满意的是 pygame,使用简单。但网上的例子就没一个完整的,导致播放音频时语速不正确 (让我各种抓狂)。音频语速不正确的原因是 pygame.mixer.init()
初始化使用了默认值,按照 mixer.init 参数说明 需要传入第一个参数 frequency (采样频率)值后解决问题,根据说明剩下三个参数采用默认就好。实例中使用了 music 模块 详情查看 mixter.music 说明文档。
import pygame, time
pygame.mixer.init(8640) # 初始化初混音器模块参数
pygame.mixer.music.load("test.wav") # 加载音频
pygame.mixer.music.play() # 播放
time.sleep(5) # 等待音频播放完成
pygame.mixer.music.stop() # 播放完成
一个最简单音频播放就完成了。
获取采用频率和播放时长
我使用的是 wav 格式的音频,所以我选择了 wave 库对音频文件进行解析,使用 pip install wave
进行安装,使用其它格式需要自己挑选解析库。
import wave
# 打开需要进行的文件
fhandle = wave.open(test.wav, "rb")
# 读取格式信息
params = fhandle.getparams()
# nchannels, sampwidth, framerate, nframes, comptype, compname
# 声道数, 采样宽度, 采样频率, 采样点数, 压缩类型, 压缩类型的描述。
# wave模块只支持非压缩的数据,因此可以忽略最后两个信息。
nchannels, sampwidth, framerate, nframes = params[:4]
print(nchannels, sampwidth, framerate, nframes)
playTime = nframes / float(framerate) # 播放时长
fhandle.close()
上述代码完成了对采样频率和播放时间等信息的获取。可参考 https://blog.csdn.net/sinat_33588424/article/details/80239375 和 https://docs.python.org/3/library/wave.html 了解 wave 的详细使用。
完整的音频播放实例
import pygame
import wave
import time
fhandle = wave.open("test.wav", "rb")
params = fhandle.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
fhandle.close()
pygame.mixer.init(framerate)
pygame.mixer.music.load("test.wav")
pygame.mixer.music.play()
playTime = nframes/float(framerate)
time.sleep(playTime)
pygame.mixer.music.stop()
再也不用担心 wav 播放语速不正常的问题。
Music 模块方法简要说明
方法 | 说明 |
---|---|
pygame.mixer.music.load | 加载音乐文件 |
pygame.mixer.music.play | 播放加载完成的音乐文件 |
pygame.mixer.music.rewind | 重新播放音频 |
pygame.mixer.music.stop | 停止播放 |
pygame.mixer.music.pause | 暂停播放 |
pygame.mixer.music.unpause | 回复播放 |
pygame.mixer.music.fadeout | 淡出 |
pygame.mixer.music.set_volume | 设置音量 |
pygame.mixer.music.get_volume | 获取音量 |
pygame.mixer.music.get_busy | 检查音乐是否正在播放 |
pygame.mixer.music.set_pos | 设置开始播放的位置 |
pygame.mixer.music.get_pos | 获取音乐已经播放的时间 |
pygame.mixer.music.queue | 将音乐文件放入待循环列表 |
pygame.mixer.music.set_endevent | 音乐播放完成时发送事件 |
pygame.mixer.music.get_endevent | 获取音乐播放完成发送的事件类型 |
网友评论