sdk-hwV1.3/lichee/xr806/appos/project/example/audio_play/readme.md

250 lines
8.5 KiB
Markdown
Raw Normal View History

2024-05-07 10:09:20 +00:00
# audio play 示例工程
> audio play 示例工程展示了XRadio SDK中进行音频播放的代码实现方法。
>
> 本工程中提供以下播放方式的示例:
> 1. 播放虚拟文件系统vfs的音频文件
> 2. 播放存于Flash的音频文件
> 3. 以数据流的形式播放虚拟文件系统vfs的音频文件
> 4. 播放pcm音频文件
---
## 适用平台
> 本工程适用以下芯片类型:
>
> 1. XR806系列芯片
> 本工程适用以下评估板类型:
> 1. 底板XR806_EVB
> 2. 模组XR806_MD01
> 本工程在基于"XR806_MD01"的“XR806_EVB”板上测试通过。
> 若需要在其他适用芯片和评估板上运行本工程请根据快速指南《XRadio_Quick_Start_Guide-CN》的提示进行相关配置修改。
> XRadio Wireless MCU芯片和评估板的更多信息可在以下地址获取
> https://docs.xradiotech.com
## 工程配置
> defconfig
> * CONFIG_XPLAYER必选项配置使用音频播放功能
>
> Makefile
> * N/A
>
> board_config.h
> * N/A
>
> board_config.c
> * N/A
>
> prj_config.h
> * PRJCONF_INTERNAL_SOUNDCARD_EN必选项配置使用内置声卡
> * PRJCONF_NET_EN可选项配置使用网络功能
## 模块依赖
> 必选项
> 1. libcedarx.a音频播放核心模块
> 2. libreverb.a音频混响核心模块
> 可选项
> 1. libmp3.a播放mp3歌曲需要的解码库
> 2. libamr.a播放amr歌曲需要的解码库
> 3. libaac.a播放aac/m4a歌曲需要的解码库
> 4. libwav.a播放wav歌曲需要的解码库
> 5. liblwip.a播放网络歌曲需要依赖的库
> 6. libmbedtls.a播放https歌曲需要依赖的库
> 7. wlan模块播放网络歌曲需要依赖的库
> 8. fatfs、mmc模块播放sd/tf卡歌曲需要的模块
> 音频的数据流、解码格式可根据需求选择,选择说明可在以下地址获取:
> https://docs.xradiotech.com
---
## 工程说明
> 本工程的实现为循环进行file、flash和fifo三种数据来源的音频播放。
### 操作说明
> 1. 创建一个“music”的文件夹并在里面添加音频文件“1.mp3”和“16000_1.pcm”其中“16000_1.pcm”为采样率16000单声道的pcm音频文件。通过文件系统工具将该文件夹打包烧写到flash对应的地址。文件系统工具的使用方式请参考《XR806_文件系统工具_使用指南》
> 2. 编译工程,烧录镜像,启动即可
> 3. 系统启动后即会自动播放“1.mp3”以及该工程自带的一个flash音频“image/xr872/1.amr”以及“16000_1.pcm”
> XRadio SDK的编译、烧写等操作方式的说明可在以下地址获取
> https://docs.xradiotech.com
### 控制命令
> N/A
### 代码结构
```
#本工程
.
├── gcc
│ ├── defconfig # 本工程的配置选项,主要用于覆盖默认全局配置
│ └── Makefile # 本工程的编译规则如ld文件、image.cfg、board_config.h等文件指定可覆盖默认配置
├── image
│ └── xr806
│ ├── 1.amr # 本工程用于flash播放示例的amr音频文件
│ └── image.cfg # 本工程的镜像布局配置
├── main.c # 本工程的入口,完成平台初始化和播放器线程初始化
├── audio_play.c # 本工程的示例代码实现
├── audiofifo.c # 本工程对音频数据流播放的调用接口封装
├── audiofifo.h
├── kfifoqueue.c # 本工程音频数据流播放的队列实现
├── kfifoqueue.h
├── kfifo.c # 本工程使用kfifo实现队列
├── kfifo.h
├── prj_config.h # 本工程的配置选项,主要用于功能的选择。
└── readme.md # 本工程的说明文档
#本程用到XRadio SDK的其他配置文件
.
└── project
   └── common
      └── board
         └── xr806_dig_ver #在project/Kconfig默认指定使用xr806_dig_ver的板级配置
            ├── board_config.h #本工程的板级配置
            └── board_config.c #本工程的板级pin mux的配置。
#音频播放使用到的相关文件
.
└── project
   └── common
      └── apps
         ├── player_app.h #对cedarx接口的调用接口封装
         └── player_app.c #对cedarx接口的调用接口封装实现
```
### 代码流程
> 1. main()入口调用audio_play_start()创建播放线程。
> 2. 播放线程函数入口play_task()
> 3. play_task()函数流程:
> A完成音频播放准备工作如sd卡初始化
> B完成播放器创建即player_create()
> C循环调用play_file_music()、play_flash_music()、play_fifo_music()、play_pcm_music()
>
> 更详细的开发指南请参考《CedarX_Developer_Guide-CN.doc》
---
## 性能资源
> 同一歌曲其播放地址不同时需要占用的cpu资源差别不大其中一个测试数据如下
| 音频地址 | 音频类型 | cpu占用率 | 备注说明 |
| --------- | -------- | --------- | -------- |
| 本地file | mp3 | 4% |- |
| 本地flash | mp3 | 4% |- |
| 网络http | mp3 | 7% |- |
> 不同类型、不同质量的音频播放时需要占用的cpu资源差别较大具体数据如下
| 音频地址 | 音频类型 | cpu占用率 | 备注说明 |
| -------- | -------- | --------- | -------- |
| 本地file | mp3 | 4%~10% |- |
| 本地file | amr | 4% |- |
| 本地file | wav | 1% |- |
| 本地file | aac/m4a | 6%~20% |- |
> 不同类型的音频,播放时需要的内存资源差别较大,具体数据如下:
| 音频地址 | 音频类型 | 内存占用 | 备注说明 |
| -------- | -------- | -------- | -------- |
| 本地file | aac | 128k |- |
| 本地file | mp3 | 65k |- |
| 本地file | mp2 | 67k |- |
| 本地file | amr(nb) | 37k |- |
| 本地file | m4a | 132k |- |
| 网络http | m4a | 142k |- |
| 网络http | mp3 | 75k |- |
## 常见问题
> 无法播放m4awav或m3u8歌曲
1.首先确认函数platform_cedarx_init()里是否已经选择支持相应的音频类型;
2.如果是m3u8歌曲请下载m3u8歌曲文件下来确认一下里面的格式是否正确以及里面的子url音频是否支持
> 无法播放某个http或https歌曲
1.首先确认函数platform_cedarx_init()里是否已经选择支持http/tcp/https/ssl音频来源
2.确认该url是否有效可以在电脑上下载该url的音频下来放到sd卡进行播放如果存放到sd卡也无法播放请确认该音频的类型是否是支持播放的音频类型
3.如果是https url请将include/net/mbedtls-2.16.0/mbedlts/configs/config-xr-mini-cliserv.h或include/net/mbedtls-2.2.0/mbedlts/configs/config-xr-mini-cliserv.h里的MBEDTLS_SSL_MAX_CONTENT_LEN增大到16k
## 音频说明
> platform_cedarx_init()用于选择支持的音频来源/音频类型,其相关函数的说明,请在以下地址获取
> https://docs.xradiotech.com
```
__weak void platform_cedarx_init(void)
{
/* for media player */
CedarxStreamListInit();
#if PRJCONF_NET_EN
CedarxStreamRegisterHttps();
CedarxStreamRegisterSsl();
CedarxThreadStackSizeSet(DEMUX_THREAD, 8 * 1024);
CedarxStreamRegisterHttp();
CedarxStreamRegisterTcp();
#endif
CedarxStreamRegisterFlash();
CedarxStreamRegisterFile();
CedarxStreamRegisterFifo();
CedarxStreamRegisterCustomer();
CedarxParserListInit();
CedarxParserRegisterM3U();
CedarxParserRegisterM4A();
CedarxParserRegisterAAC();
CedarxParserRegisterAMR();
CedarxParserRegisterMP3();
CedarxParserRegisterWAV();
CedarxDecoderListInit();
CedarxDecoderRegisterAAC();
CedarxDecoderRegisterAMR();
CedarxDecoderRegisterMP3();
CedarxDecoderRegisterWAV();
SoundStreamListInit();
SoundStreamRegisterCard();
SoundStreamRegisterReverb();
/* for media recorder */
CedarxWriterListInit();
CedarxWriterRegisterFile();
CedarxWriterRegisterCallback();
CedarxWriterRegisterCustomer();
CedarxMuxerListInit();
CedarxMuxerRegisterAmr();
CedarxMuxerRegisterPcm();
CedarxEncoderListInit();
CedarxEncoderRegisterAmr();
CedarxEncoderRegisterPcm();
}
```
## 参考文档
> 文档资源
1. 《CedarX_Developer_Guide-CN.doc》
> WiKi资源
1. https://docs.xradiotech.com