Opus 示例

源码路径:example/multimedia/audio/opus

支持的平台

  • eh-lb525

概述

本示例演示如何使用 Opus 音频编解码库进行录音、编码、解码和播放,包含:

  • 通过mic录音,从麦克风录制 16kHz 采样率的 PCM 音频数据

  • 编码:使用 Opus 编码器将 PCM 数据压缩(10ms 帧长,约 16kbps 比特率)

  • 解码:使用 Opus 解码器解压缩音频数据

  • 播放:将解码后的音频数据通过扬声器播放

例程的使用

硬件需求

运行该例程前,需要准备:

例程说明

​ 如果opus_test()函数中有opus_encoder_ctl(encoder, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY));

则定义OPUS_STACK_SIZE为20k。

​ 如果opus_test()函数没有opus_encoder_ctl(encoder, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY));

则定义OPUS_STACK_SIZE为200k。

录音实现说明

  • 录音时长由 RECORD_SECONDS 控制(默认 10 s),按采样帧计数停止:1000 帧 × 320 字节/帧(10 ms)= 320,000 字节 = 10.000 s;

  • 录音回调把数据 memcpy 到 PSRAM 缓冲(rec_pcm_buf),录音期间不做 flash 操作,避免音频 pipe 溢出丢帧,以及写 flash 时 SysTick 丢失导致的计时偏差;

  • 录音结束后再把整块缓冲一次性写入 /mic16k.pcm;flash 擦写较慢(320 KB 约需数秒),因此日志中 record stop 与 record end 之间有几秒间隔,属正常现象,不影响录音内容。真实录音耗时看record start 与 record stop: xx bytes (xx ms) 的时间间隔。

编译和烧录

切换到例程project目录,运行scons命令执行编译:

scons –board=eh-lb525 -j32

切换到例程project/build_xx目录,运行uart_download.bat,按提示选择端口即可进行下载:

./uart_download.bat

Uart Download

please input the serial port num:5

关于编译、下载的详细步骤,请参考快速上手的相关介绍。

例程的预期结果

例程启动后: 自动运行:程序启动后自动录音 10 秒,随后先回放一次原始录音(playing start ~ playing end),再播放编码解码后的音频(opus runing ... ~ ---opus test exit---)。因此正常会听到两遍声音,第二遍才是 Opus 编解码链路的结果。

预期日志:

record start
record stop: 320000 bytes (10000 ms)
record end        ← 与上一行相隔数秒,是写 flash 的耗时
playing start
playing end       ← 第一次:原始 PCM 回放
opus runing ...
---opus test exit---   ← 第二次:编码解码后播放

手动命令:

  • opus : 录音10秒到 /mic16k.pcm,先回放原始录音,再编码解码后播放

  • opus /mic16k.pcm : 从指定文件读取 PCM 数据,编码解码后播放

  • opus xxxxx : 如果文件不存在,实时录音并回环播放10s(边录边播,喇叭和麦隔离下,不然有啸叫,可以把喇叭扣到耳朵上捂住)

异常诊断

参考文档

更新记录

版本

日期

发布说明

0.0.1

12/2025

初始版本

0.0.2

10/2026

录音改为 PSRAM 缓冲 + 按采样帧数计时,修复录音时长偏差与丢帧