跳转至

麦克风

类: Mic_Class(来自 M5Unified)
访问: M5Cardputer.Mic

麦克风支持基于 I2S 的音频录音,可配置采样率和位深度。


生命周期

bool begin();       // 初始化 I2S 并启动后台录音任务
void end();         // 停止并释放 I2S
bool isRunning();   // 后台任务是否正在运行
bool isEnabled();   // 麦克风引脚是否已配置

录音

8 位无符号

bool record(uint8_t* rec_data, size_t array_len);
bool record(uint8_t* rec_data, size_t array_len, uint32_t sample_rate, bool stereo = false);

16 位有符号

bool record(int16_t* rec_data, size_t array_len);
bool record(int16_t* rec_data, size_t array_len, uint32_t sample_rate, bool stereo = false);
参数 类型 默认值 说明
rec_data uint8_t*int16_t* 接收音频采样的缓冲区
array_len size_t 要录制的采样数
sample_rate uint32_t 来自配置 采样率 (Hz,默认: 16000)
stereo bool false 立体声模式

录音请求成功加入队列则返回 true


配置

void setSampleRate(uint32_t sample_rate);   // 更改录音采样率 (Hz)

采样率也可通过 m5::Mic_Class::config_tbegin() 期间设置,但 setSampleRate() 是在调用 record() 前调整的最简单方式。


录音状态

size_t isRecording() const;   // 0=空闲, 1=录音中(队列有空间), 2=录音中(队列满)

快速示例

// 以 8kHz 录制 4096 个采样
const int samples = 4096;
uint8_t buffer[samples];

M5Cardputer.Mic.setSampleRate(8000);
M5Cardputer.Mic.record(buffer, samples);

// 等待录音完成
while (M5Cardputer.Mic.isRecording()) {
    M5Cardputer.update();
    delay(1);
}

// 处理录制的采样数据
for (int i = 0; i < samples; i++) {
    // buffer[i] 包含 0–255 的音频幅值
    int32_t y = map(buffer[i], 0, 255, 240, 0);  // 映射到屏幕坐标
    M5Cardputer.Display.drawPixel(i / 4, y, TFT_GREEN);
}

非阻塞

record() 是非阻塞的——它将请求排队到后台 I2S 任务。使用 isRecording() 轮询完成状态。

录制 WAV 到 SD 卡

参见 mic_wav_record 示例获取完整的 WAV 录音流程(含 SD 卡支持)。