2332|4

47

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【平头哥RVB2601创意应用开发】第四篇 声音直方图 [复制链接]

 

本篇测评实验的内容是将声音播放和显示结合起来,播放声音的同时屏幕同时显示声音强度的直方图。

 

先上视频,再解释实现方法。

 

视频

4-1

 

本实验代码是基于Offline版本的musicplay例程开发的。

该例程是将嵌入程序的mp3声音数据(以数组形式保存)播放出来。

例如实验中使用的welcome_mp3声音数据就保存在include/welcome_mp3.h中。

 数组里的数据完全是按照mp3文件格式排布的。比如前四个字节表示声音数据段的帧头。感兴趣的朋友可以自己研究一下mp3文件格式,对理解这个声音播放demo还是很有帮助的。

MP3声音数据是压缩过的数据,需要先解码成PCM后才能播放。Demomp3数据解码是使用pvmp3dec开源的mp3解码库来实现的。

 

解码后的数据,送到AV_AO_ALSA PCM输出驱动进行音频输出。

在花了N多小时的研究后,终于定位到了音频解码后数据所在。

Player.c文件中_ptask()任务函数中,调用ad_decode()mp3数据进行解码。解码后数据存放在dframe数组中。

 rc = ad_decode(ad, dframe, &got_frame, &pkt);

 

接下来对音频数据进行处理,提取出声音的强度。下面的处理只是简单的对PCM幅度值进行平均处理。

if(dframe->linesize[0] > 1024){

tempmaxvalue = 0;

for(uint8_t j=0;j<16;j++){

blocknumtemp[j] = 0;

temptotal = 0;

for(uint8_t i=0;i<32;i++){

temp = *(dframe->data[0]+1+j*64+i*2);

temp = temp << 8;

temp += *(dframe->data[0]+j*64+i*2);

temptotal += temp;

}

blocknumtemp[j] = temptotal;

if(blocknumtemp[j] > tempmaxvalue){

tempmaxvalue = blocknumtemp[j];

}

}

 

if(tempmaxvalue >0){

for(uint8_t j=0;j<16;j++){

blocknum[j] = (blocknumtemp[j] * 8)/tempmaxvalue;

}

}

}

 

下面是把这些代表声音强度的数据在在屏幕以直方图形式显示出来。

void draw_block(uint8_t x, uint8_t y)

{

for(uint8_t i = x; i >= x-4; i--){

for(uint8_t j=y; j<= y+7; j++){

buf[j] = 1;

}

}

for(uint8_t j=y; j<= y+7; j++){

buf[x-4][j] = 0;

}

 

for(uint8_t i = x; i >= x-3; i--){

buf[y] = 0;

buf[y+7] = 0;

}

 

}

void draw_blocks()

{

 

uint8_t block_row, block_col, blockrownum,x,y;

 

for(uint8_t i=0;i<64;i++){

for(uint8_t j=0;j<128;j++){

buf[j] = 0;

}

}

 

 

for(block_col=1;block_col<= BLOCKCOLNUM;block_col++){

for(block_row=1;block_row<= blocknum[block_col-1];block_row++){

x = 63 - (block_row -1)*5;

y = (block_col - 1)*8;

 

draw_block(x, y);

 

}

 

}

 

 

}

最新回复

明白了,感谢   详情 回复 发表于 2022-5-15 10:46
点赞 关注
 
 

回复
举报

5260

帖子

239

TA的资源

管理员

沙发
 

想到了我的mp4,哈哈

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

板凳
 

请教一下,数组里的音频数据是怎么生成的?
比如我有一段mp3音频,怎么生成对应的数据?

点评

就是把mp3文件数据转换成U16数组;可以使用“DataToHex”工具,这个工具可以把文件生成数组保存到.h文件中。  详情 回复 发表于 2022-5-15 10:01
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(中级)

4
 
xinmeng_wit 发表于 2022-5-15 08:29 请教一下,数组里的音频数据是怎么生成的?比如我有一段mp3音频,怎么生成对应的数据?

就是把mp3文件数据转换成U16数组;可以使用“DataToHex”工具,这个工具可以把文件生成数组保存到.h文件中。

点评

明白了,感谢  详情 回复 发表于 2022-5-15 10:46
 
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

5
 
oxygen_sh 发表于 2022-5-15 10:01 就是把mp3文件数据转换成U16数组;可以使用“DataToHex”工具,这个工具可以把文件生成数组保 ...

明白了,感谢

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表