audio(音频)

抽象的音频对象,该对象可以被当做参数传入也可以直接使用其方法来播放音频

模块函数

构造函数

构造 Audio 对象

audio.Audio(array=None, path=None, points=1024)

参数

该接口能传入一个参数,每个参数会决定不同的音频类型

  • array: bytearray类型的数据,可以将该数据转换为音频对象, 默认 None

  • path: 打开的音频文件路径,目前仅支持 wav 格式, 默认 None, 注意需要标明关键字pathaudio.Audio("/sd/1.wav")这样是错的!! audio.Audio(path = "/sd/1.wav") 才是正确的

  • points: 开辟有 points 个采样点数的音频缓冲,一个采样点大小为 32bit。为0的情况下将不开辟缓冲, 默认 1024

返回值

返回一个 Audio 对象

to_bytes: bytes转换函数

将音频对象中的音频数据转换为 bytearray 类型的对象

audio_data = test_audio.to_bytes()

参数

返回值

返回的音频数据 bytearray 对象

play_process: 播放预处理函数

用于预处理音频对象,在播放之前需要对音频文件进行解析,所以需要预处理。这里需要传入一个播放用的 I2S 设备

wav_info = test_audio.play_process(i2s_dev)

参数

  • i2s_dev: 用于播放的i2s设备

返回值

该 wav 文件的头部信息 ,list类型,分别是numchannels(声道数), samplerate(采样率), byterate(每秒数据字节数=samplerate * numchannels * bitspersample / 8), blockalign(每个采样所需的字节数 = numchannels * bitspersample / 8), bitspersample(每个采样存储的bit数,8:8bit,16:16bit,32:32bit), datasize(音频数据长度)

play: 播放函数

读取音频文件并且解析播放,一般配合循环来使用

参数

返回值

  • None: 格式不支持播放
  • 0: 播放结束
  • 1: 正在播放

finish: 音频后处理函数

完成音频播放,该函数必须在播放完毕后调用,回收底层分配的资源

参数

返回值

例程

播放 wav 音频

from fpioa_manager import *
from Maix import I2S, GPIO
import audio

# disable wifi
fm.register(8, fm.fpioa.GPIO0)
wifi_en=GPIO(GPIO.GPIO0,GPIO.OUT)
wifi_en.value(0)

# register i2s(i2s0) pin
fm.register(34,fm.fpioa.I2S0_OUT_D1)
fm.register(35,fm.fpioa.I2S0_SCLK)
fm.register(33,fm.fpioa.I2S0_WS)

# init i2s(i2s0)
wav_dev = I2S(I2S.DEVICE_0)

# init audio
player = audio.Audio(path = "/sd/6.wav")
player.volume(40)

# read audio info
wav_info = player.play_process(wav_dev)
print("wav file head information: ", wav_info)

# config i2s according to audio info
wav_dev.channel_config(wav_dev.CHANNEL_1, I2S.TRANSMITTER,resolution = I2S.RESOLUTION_16_BIT ,cycles = I2S.SCLK_CYCLES_32, align_mode = I2S.RIGHT_JUSTIFYING_MODE)
wav_dev.set_sample_rate(wav_info[1])

# loop to play audio
while True:
    ret = player.play()
    if ret == None:
        print("format error")
        break
    elif ret==0:
        print("end")
        break
player.finish()