【匠芯创D133CBS】MP3解码与播放
<div class='showpostmsg'> 本帖最后由 没有口袋的哆啦 于 2024-9-12 14:10 编辑<p>大家好,前两章我们学习了WAV音频的播放,今天我们就来学习一下MP3播放,与WAV不同,WAV属于无损格式,它里面的数据流都是未经过压缩的,它的音质比MP3要好且无需解码,但是它有一个缺点,那就是它的体积。他的体积通常是MP3的数倍,这会占用我们大量的存储空间,尤其是对于我们嵌入式设备来说,这非常不友好,于是这个时候就需要采用MP3格式了。</p>
<p> </p>
<p><span style="color:#c0392b;"><strong>MP3简介:</strong></span><br />
MP3全称为MPEG Audio Layer 3,它是一种高效的计算机音频编码方案,它以较大的压缩比将音频文件转换成较小的扩展名为.mp3的文件,基本保持源文件的音质,MP3是ISO/MPEG标准的一部分,</p>
<p>ISO/MPEG标准描述了使用高性能感知编码方案的音频压缩,此标准一直在不断更新以满足“质高量小”的追求,现已形成MPEG Layer1、Layer2、Layer3三种音频编解码方案,分别对应MP1、MP2、MP3 这三种声音文件</p>
<p>MPEG(Moving Picture Expert Group)是ISO下的一个动态图像专家组,它指定的MPEG标准广泛的应用于各种多媒体中,MPEG标准包括视频和音频标准,其中音频标准已制定出MPEG-1、MPEG-2、MPEG-2 ACC、MPEG-4。MPEG-1和MPEG-2标准使用同一个音频编解码族Layer1、2、3,MP3绝大多数使用的是MPEG1标准</p>
<p>MP3音频压缩包含编码和解码两部分,编码是将原始信号转换成电平信号的过程,解码即是逆过程,MP3 采用了感知音频编码(PerceptualAudio Coding)这一失真算法。人耳感受声音的频率范围是20Hz-20kHz,MP3截掉了大量的冗余信号和无关的信号,编码器通过混合滤波器组将原始声音变换到频率域,利用心理声学模型,估算刚好能被察觉到的噪声水平,再经过量化,转换成Huffman编码,形成MP3位流。解码器要简单得多,它的任务是从编码后的谱线成分中,经过反量化和逆变换,提取出声音信号。</p>
<p>MP3文件数据由多个帧组成,帧是MP3文件最小组成单位。每个帧又由帧头、附加信息和声音数据组成。每个帧播放时间是0.026秒,其长度随位率的不同而不等。有些MP3文件末尾有些额外字节存放非声音数据的说明信息(如歌手、专辑、发行年月等)。</p>
<p> </p>
<p>由于MP3是经过编码、压缩的所以我们想要播放的话就得对其进行解码,解码有很多种方法,比如外置解码芯片(例如vs1003)或者使用内置的硬件解码器(大多数嵌入式芯片是没有的),再或者使用软件解码,今天我们使用的就是软件解码。这里匠芯创官方已经帮我们移植并封装好了MAD库,我们就不需要自己动手了,十分方便。</p>
<p> </p>
<p><span style="color:#c0392b;"><strong>MAD简介:</strong></span><br />
MAD(libmad)是一个开源的高精度MPEG音频解码库,支持MPEG-1标准。libmad提供24-bit的PCM输出,完全定点计算,非常适合在没有浮点支持的嵌入式硬件平台上使用。使用libmad提供的一系列API可以实现MP3文件的解码。<br />
源码下载链接:<a href="https://sourceforge.net/projects/mad/" target="_blank">https://sourceforge.net/projects/mad/</a></p>
<p> </p>
<p>我根据匠芯创官方提供的demo进行修改简化了一下得到了user_aduio,首先在menuconfig中打开user_aduio并选择PWM输出方式(TM8211还未移植好)</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">然后来看我修改的user_audio,就这么一些函数</div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
再来看具体使用,由于封装过了,所以使用也是比较简单,第一步创建解码器,第二部设置好音量,第三步传入要解码播放的MP3文件即可</div>
<div style="text-align: center;">
<div style="text-align: center;"></div>
<div style="text-align: center;">然后在mian.c创建一个播放任务并传入需要播放的MP3路径,再编译烧录</div>
<div style="text-align: center;"></div>
<div style="text-align: center;">插上串口,可以看到代码已经成功运行了</div>
<div style="text-align: center;"></div>
<p>接下来就可以慢慢欣赏音乐了<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" /></p>
<p>a1c86524378cbc944f175fbc85e568f4<br />
</p>
</div>
<p>解码部分的代码我就不细讲了,因为网上太多讲解的了,感兴趣的小伙伴可以自行查阅,需要本章全部代码的小伙伴请私信获取,下一章我们来玩LVGL</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>本章全部代码可以直接在本帖按附件形式上传</p>
页:
[1]