audio - 音频采集输出例程

audio - 音频采集输出例程#

本示例程序用于对 CanMV 开发板进行一个音频采集和输出的功能展示。

from media.pyaudio import * #导入pyaudio模块,用于采集和播放音频
import media.wave as wave   #导入wav模块,用于保存和加载wav音频文件
from media.media import *   #导入media模块,用于初始化vb buffer

def record_audio(filename, duration):
    CHUNK = int(44100/25)  #设置音频chunk值
    FORMAT = paInt16       #设置采样精度
    CHANNELS = 2           #设置声道数
    RATE = 44100           #设置采样率

    p = PyAudio()
    p.initialize(CHUNK)    #初始化PyAudio对象
    ret = media.buffer_init() #vb buffer初始化
    if ret:
        print("record_audio, buffer_init failed")

    #创建音频输入流
    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

    frames = []
    #采集音频数据并存入列表
    for i in range(0, int(RATE / CHUNK * duration)):
        data = stream.read()
        frames.append(data)


    stream.stop_stream() #停止采集音频数据
    stream.close()#关闭音频输入流
    p.terminate()#释放音频对象

    #将列表中的数据保存到wav文件中
    wf = wave.open(filename, 'wb') #创建wav 文件
    wf.set_channels(CHANNELS) #设置wav 声道数
    wf.set_sampwidth(p.get_sample_size(FORMAT))  #设置wav 采样精度
    wf.set_framerate(RATE)  #设置wav 采样率
    wf.write_frames(b''.join(frames)) #存储wav音频数据
    wf.close() #关闭wav文件

    media.buffer_deinit() #释放vb buffer

def play_audio(filename):

    wf = wave.open(filename, 'rb')#打开wav文件
    CHUNK = int(wf.get_framerate()/25)#设置音频chunk值

    p = PyAudio()
    p.initialize(CHUNK) #初始化PyAudio对象
    ret = media.buffer_init()#vb buffer初始化
    if ret:
        print("play_audio, buffer_init failed")

    #创建音频输出流,设置的音频参数均为wave中获取到的参数
    stream = p.open(format=p.get_format_from_width(wf.get_sampwidth()),
                channels=wf.get_channels(),
                rate=wf.get_framerate(),
                output=True,frames_per_buffer=CHUNK)

    data = wf.read_frames(CHUNK)#从wav文件中读取数一帧数据

    while data:
        stream.write(data)  #将帧数据写入到音频输出流中
        data = wf.read_frames(CHUNK) #从wav文件中读取数一帧数据

    stream.stop_stream() #停止音频输出流
    stream.close()#关闭音频输出流
    p.terminate()#释放音频对象
    wf.close()#关闭wav文件

    media.buffer_deinit()#释放vb buffer


def loop_audio(duration):
    CHUNK = int(44100/25)#设置音频chunck
    FORMAT = paInt16 #设置音频采样精度
    CHANNELS = 2 #设置音频声道数
    RATE = 44100 #设置音频采样率

    p = PyAudio()
    p.initialize(CHUNK)#初始化PyAudio对象
    ret = media.buffer_init() #初始化vb buffer
    if ret:
        print("loop_audio, buffer_init failed")

    #创建音频输入流
    input_stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

    #创建音频输出流
    output_stream = p.open(format=FORMAT,
                     channels=CHANNELS,
                     rate=RATE,
                     output=True,frames_per_buffer=CHUNK)

    #从音频输入流中获取数据写入到音频输出流中
    for i in range(0, int(RATE / CHUNK * duration)):
        output_stream.write(input_stream.read())


    input_stream.stop_stream()#停止音频输入流
    output_stream.stop_stream()#停止音频输出流
    input_stream.close() #关闭音频输入流
    output_stream.close() #关闭音频输出流
    p.terminate() #释放音频对象

    media.buffer_deinit() #释放vb buffer

#play_audio('/sdcard/app/input.wav') #播放wav文件
#record_audio('/sdcard/app/output.wav', 15)  #录制wav文件
loop_audio(15) #采集音频并输出
print("audio sample done")

具体接口定义请参考 audio