0 前言
python是一个我们常谈的编程语言,它具有以下优点
- 简单易用
- 扩展性强
- 当然 社区强大
不过我在这里不会过多阐述关于它的优缺点,这篇文章我将python的用途往开发日常性应用考虑
1 开始
今天是音频 python原生的库对于音频的支持不多 winsound库只限windows系统 倒是还有一个audioop库 不过这个以后再谈
1.1 有什么第三方库?
从功能上看 有这么几类
从输入输出讲起吧
2 输出
2.1 pyaudio
这个库17年好像就停止开发了 不过没有奇怪的bug 现在还有人不断跟进 为windows用户提供最新的预构建包
看来是真的好用…?
要使用pyaudio 你应该先初始化PyAudio类
> import pyaudio
> p = pyaudio.PyAudio()
为了打开一个音频流 你需要使用PyAudio类的open函数
你至少需要提供format,channels,rate和input或output参数
format
这个参数告知流你的音频输出格式,可以提供以下的值
- pyaudio.paUInt8 -> int
- pyaudio.paInt8 -> int
- pyaudio.paInt16 -> int
- pyaudio.paInt24 -> int
- pyaudio.paInt32 -> int
- pyaudio.paFolat32 -> int
即音频数据的bit数和数据类型
channels
不必多说 指音频的声道数 不过只能使用 1 , 2 , 4 其他是不支持的
rate
音频的采样频率
input和output
这两个参数只能同时提供其中的一个 默认值为False
若input为True 那么这个流是录制流 这里我不讨论
如output为True 那么这个流是输出流
打开一个输出流的实例:
> stream = p.open(format=pyaudio.paInt16,channels=2,rate=44100,output=True)
这里打开了一个16bit 2声道 采样率为44100的输出流
然后将音频数据写入流 注意 类型为bytes
> stream.write(data)
该函数是阻塞的 写入的数据播放完毕后返回 没有返回值
下面是一个配合python自带wave库来播放wav文件的实例
import wave
import pyaudio
CHUNK = 1024
wf = wave.open("test.wav")
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),#open方法实际上需要的是paXXXXX常量值 如paInt16 所以需要这样的转换
channels=wf.getnchannels(),
rate=wav.getframerate(),
output=True)
while True:
data = wf.readframes(CHUNK)
stream.write(data)
这个简单的例子通过python的wave库读取参数 打开流 并流式读取文件播放的功能
但pyaudio本身已经长时间未维护了 因为portaudio本身没有更新 但随着python版本的迭代 可能不再适用高版本python
比如pyaudio依赖全局解释器锁GIL 但目前GIL移除的计划已经提上日程 最新的3.13已经有实验性的无全局解释器锁的编译版本