本文讨论SD卡作为存储器,I2S播放音频的解决方案
SD卡数据的读取虽然很快,即使在最理想的状态下,播放一秒钟的数据,需要大约%4的时间消耗
8(bit)x2(ch)x2(byte)x48000(hz)/36(MHz)=0.042s
使用单流程模式,这部分损耗是无法忽略的,只能考虑使用DMA模式读取SD卡数据
如果考虑主程序需要承担诸如音量控制,数据监察的功能,I2S也使用DMA模式播放音频
音乐数据的制作
为了简化流程,音乐数据选择完全无编码PCM音频数据格式,将数据直接送往I2S即可播放
I2S设置为16位双声道,每个采样为4字节
可以使用ffmpeg转换mp3或wav及其它音频格式生成纯PCM格式
ffmpeg -i input.mp3 -acodec pcm_s16le -ar 48000 -ac 2 -f s16le output.pcm
在Linux环境中可以使用cat或dd命令写入SD读卡器
文件可以顺序灌入,最后写入'MUSICEND'标识使主程序可实现循环播放控制
结束标识要写入两次为防止跨页
#!/bin/sh
files=""
muend="MUSICEND"
echo -ne "$muend$muend" > music_end
for fff in pcm/*pcm; do
files="$files $fff"
done
cat $files music_end | dd of=/dev/sde