Python 播放音频

2019-04-30  本文已影响0人  404d67ac8c12

解决 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/80239375https://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 获取音乐播放完成发送的事件类型
上一篇下一篇

猜你喜欢

热点阅读