3.12. sample_audio 使用说明

3.12.1. 功能概述

sample_audio 是一个用于音频录制和播放的命令行程序。它支持通过命令参数配置多种采样率、位深和声道,并且能够将录制的音频保存为 WAV 格式文件。用户可以通过命令行参数自定义配置,或者在通过命令加参数的形式进行交互控制。它适用于验证项目的音频基本环境,也可以作为音频项目的参考实现。

注意: EVB 没有板端 Audio Codec,所以使用本 sample 需要搭配外接声卡,可以参考硬件环境搭建章节。

3.12.1.1. 软件架构说明

程序主要由以下模块构成:

sample_audio 程序基于 ALSA( Advanced Linux Sound Architecture)库开发,使用 C 语言编写。程序主要分为以下几个部分:

  • 设置音频设备配置和参数

  • 录制音频功能,负责从输入设备获取音频数据。

  • 播放音频功能,从目标文件中读取音频数据并通过输出设备播放。

  • 处理用户交互命令,负责获取用户输入的信息,提供详细参考。

  • 查询硬件支持格式、采样率和声道数

软件架构图:在获取到用户的 command 之后,根据不同的业务,调用 libsound.so 的接口,实现录制、播放、检查硬件支持参数的业务。

software_architecture_diagram.png

3.12.1.2. 代码位置及目录结构

.
├── Makefile
└── sample_audio.c
  • Makefile:用于编译程序的 Makefile 文件。

  • sample_audio.c:程序的主要源代码文件。

3.12.1.3. 工具位置及目录结构

/app/platform_samples/sample_audio

该目录下包含编译后的可执行文件以及程序运行时候输出的音频文件。

3.12.1.4. 背景知识

  • ALSA 库: Linux 系统中用于音频处理的标准库,提供了丰富的音频处理接口。

  • WAV 文件格式:一种无损音频文件格式,被广泛支持和使用。

3.12.1.5. API 流程说明

程序主要使用以下 ALSA 库的 API 流程( record_audio 和 play_audio 基本一致):

  • snd_pcm_open:打开 PCM 设备。

  • snd_pcm_hw_params_any:设置硬件参数。

  • snd_pcm_hw_params_set_access:设置数据访问方式。

  • snd_pcm_hw_params_set_format:设置音频格式。

  • snd_pcm_hw_params_set_rate:设置采样率。

  • snd_pcm_hw_params_set_channels:设置声道数。

  • snd_pcm_hw_params:应用硬件参数。

  • snd_pcm_readi 和 snd_pcm_writei:用于音频数据的读取和写入。

api_process.png

3.12.2. 编译部署

3.12.2.1. 编译

使用 Makefile 编译程序:

make

比如在该示例代码目录下直接执行:

root@ubuntu:/app/multimedia_samples/sample_audio# make

将在当前目录下生成 sample_audio 可执行文件。

3.12.2.2. 硬件环境搭建

可以参考开发板使用指南中的 40PIN 接口章节中的接口举例说明:

3.12.2.3. 程序部署

编译后可执行文件一般在 /app/multimedia_samples/sample_audio 目录下。

.
├── Makefile
├── sample_audio
├── sample_audio.c
└── sample_audio.o

本 sample 的可执行文件位于板端 /app/multimedia_samples/sample_audio/sample_audio

3.12.3. 运行

3.12.3.1. 程序运行方法

直接运行可执行文件:

./sample_audio

或者使用命令行参数指定配置:

./sample_audio -r 16000 -b 16 -c 2 -d 5 -f record_test.wav

3.12.3.2. 程序参数选项说明

-r <Sampling rate>            Specify sample rate for record or playback    ( 指定采样率 )
-b <Bit depth>                Specify bit depth for record or playback      ( 指定位深 )
-c <Number of channels>       Specify channels for record or playback       ( 指定声道数 )
-d <Duration>                 Specify duration for record or playback       ( 指定录制时长 )
-f <File name>                Specify file for record or playback           ( 指定文件名 )
-h                            Show this help message                        ( 显示帮助信息 )

3.12.3.3. 运行效果

程序将根据用户指定的参数录制音频,并在录制结束后播放音频,或者根据用户命令进行播放。

直接执行的效果:

root@ubuntu:/app/multimedia_samples/sample_audio# ./sample_audio
Audio Recording and Playback Program
Settings:
  Capture Device        : hw:0,0
  Playback Device       : hw:0,0
  Sampling Rate         : 48000 Hz
  Bit Depth             : 16 bit
  Channels              : 2
  Duration              : 5 seconds
  File Name             : record_test.wav

***************  Command Lists  ***************
 q  -- Quit
 r  -- Start recording
 p  -- Playback
 c  -- Check hardware support
 h  -- Print help message

Command:

使用命令行参数指定配置的效果:

root@ubuntu:/app/multimedia_samples/sample_audio# ./sample_audio -r 16000 -b 16 -c 2 -d 5 -f record_test.wav
Audio Recording and Playback Program
Settings:
  Capture Device        : hw:0,0
  Playback Device       : hw:0,0
  Sampling Rate         : 16000 Hz
  Bit Depth             : 16 bit
  Channels              : 2
  Duration              : 5 seconds
  File Name             : record_test.wav

***************  Command Lists  ***************
 q  -- Quit
 r  -- Start recording
 p  -- Playback
 c  -- Check hardware support
 h  -- Print help message

Command:

录制时候的效果:

Command: r
Recording...
Start recording...
Recording finished, WAV file saved as:record_test.wav

播放时候的效果:

Command: p
Playing...
playing...
play end.

Command:

检查硬件支持的效果(实际情况会根据硬件支持有所变化):

Command: c
capture_device:
Supported formats:
Format                        Support                                           Description
----------------------------------------------------------------------------------------------
S8                            Signed 8 bit                                      Not Supported
U8                            Unsigned 8 bit                                    Not Supported
S16_LE                        Signed 16 bit Little Endian                       Supported
S16_BE                        Signed 16 bit Big Endian                          Not Supported
U16_LE                        Unsigned 16 bit Little Endian                     Not Supported
U16_BE                        Unsigned 16 bit Big Endian                        Not Supported
S24_LE                        Signed 24 bit Little Endian                       Supported
S24_BE                        Signed 24 bit Big Endian                          Not Supported
U24_LE                        Unsigned 24 bit Little Endian                     Not Supported
U24_BE                        Unsigned 24 bit Big Endian                        Not Supported
S32_LE                        Signed 32 bit Little Endian                       Not Supported
S32_BE                        Signed 32 bit Big Endian                          Not Supported
U32_LE                        Unsigned 32 bit Little Endian                     Not Supported
U32_BE                        Unsigned 32 bit Big Endian                        Not Supported
IEC958_SUBFRAME_LE            IEC-958 Little Endian                             Not Supported
IEC958_SUBFRAME_BE            IEC-958 Big Endian                                Not Supported
MU_LAW                        Mu-Law                                            Not Supported
A_LAW                         A-Law                                             Not Supported
IMA_ADPCM                     Ima-ADPCM                                         Not Supported
MPEG                          MPEG                                              Not Supported
GSM                           GSM                                               Not Supported

Channels                      SupportNum
--------------------------------------------------------
Max                              2
Min                              2

Sampling Rate (Hz)            Support
--------------------------------------------------------
8000                           Supported
16000                          Supported
22050                          Supported
44100                          Supported
48000                          Supported
96000                          Not Supported
192000                         Not Supported
playback_device:
Supported formats:
Format                        Support                                           Description
----------------------------------------------------------------------------------------------
S8                            Signed 8 bit                                      Not Supported
U8                            Unsigned 8 bit                                    Not Supported
S16_LE                        Signed 16 bit Little Endian                       Supported
S16_BE                        Signed 16 bit Big Endian                          Not Supported
U16_LE                        Unsigned 16 bit Little Endian                     Not Supported
U16_BE                        Unsigned 16 bit Big Endian                        Not Supported
S24_LE                        Signed 24 bit Little Endian                       Supported
S24_BE                        Signed 24 bit Big Endian                          Not Supported
U24_LE                        Unsigned 24 bit Little Endian                     Not Supported
U24_BE                        Unsigned 24 bit Big Endian                        Not Supported
S32_LE                        Signed 32 bit Little Endian                       Not Supported
S32_BE                        Signed 32 bit Big Endian                          Not Supported
U32_LE                        Unsigned 32 bit Little Endian                     Not Supported
U32_BE                        Unsigned 32 bit Big Endian                        Not Supported
IEC958_SUBFRAME_LE            IEC-958 Little Endian                             Not Supported
IEC958_SUBFRAME_BE            IEC-958 Big Endian                                Not Supported
MU_LAW                        Mu-Law                                            Not Supported
A_LAW                         A-Law                                             Not Supported
IMA_ADPCM                     Ima-ADPCM                                         Not Supported
MPEG                          MPEG                                              Not Supported
GSM                           GSM                                               Not Supported

Channels                      SupportNum
--------------------------------------------------------
Max                              2
Min                              2

Sampling Rate (Hz)            Support
--------------------------------------------------------
8000                           Supported
16000                          Supported
22050                          Supported
44100                          Supported
48000                          Supported
96000                          Not Supported
192000                         Not Supported

***************  Command Lists  ***************
 q  -- Quit
 r  -- Start recording
 p  -- Playback
 c  -- Check hardware support
 h  -- Print help message

Command:

退出程序时候的效果:

Command: q
Quit

Command: root@ubuntu:/app/multimedia_samples/sample_audio#

3.12.4. 常见问题

程序无法打开音频设备:

  • 确保 ALSA 库已正确安装,并且音频设备驱动正常工作。

录制的音频文件无法播放:

  • 确保音频文件格式正确,使用 wav 文件。

程序运行时出现缓冲区溢出错误:

  • 这可能是由于硬件参数设置不当或设备驱动问题,尝试调整参数或检查驱动。