LOADING

加载过慢请开启缓存 浏览器默认开启

关于python日常应用的尝试--音频篇

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,rateinputoutput参数

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

音频的采样频率

inputoutput

这两个参数只能同时提供其中的一个 默认值为False

inputTrue 那么这个流是录制流 这里我不讨论
outputTrue 那么这个流是输出流

打开一个输出流的实例:


> 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已经有实验性的无全局解释器锁的编译版本