博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌入式音频软件的架构【转】
阅读量:5162 次
发布时间:2019-06-13

本文共 921 字,大约阅读时间需要 3 分钟。

本文转载自:

转载—–>

嵌入式产品中语音通信和音乐播放的软件架构是有差别的,这里还是把这两种case分开来讲。

1, 语音通信 

语音通信的软件架构通常如下: 
这里写图片描述

语音发送时由codec芯片采集到语音的模拟信号转换成PCM数据然后通过I2S总线发送给CPU(这是音频驱动负责的,不同的OS会有不同的驱动架构,会在后面音频采集和播放中详细讲,重点讲linux的)。CPU收到PCM数据后首先做前处理,主要包括回音消除(AEC)/噪声抑制(ANS)/自动增益控制(AGC)/VAD等,然后把PCM数据根据指定的codec编码成码流,再打上RTP包头,根据需要还有可能做FEC/重传语音的RTP包等以补偿网络的丢包。最后把生成的RTP包通过UDP socket发到网络中。

语音接收时首先通过UDP socket收RTP包,根据指定看是否需要做FEC等,然后把RTP包或者RTP包的payload(不同的方案有不同的做法)放进jitter buffer中等待取走。 

从jitter buffer取时取走的是payload,也就是码流。然后对码流解码得到PCM数据,还要看是否需要做PLC/CNG等。最后把PCM数据通过I2S总线送给codec芯片再转换成模拟信号播放出来。这样双方就可以通话了。

2,音乐播放 

音乐播放分播放本地音乐和播放云端音乐。播放本地音乐相对简单。播放云端音乐通常是边下载边播放,一般用DLNA或者Apple的Airplay等协议实现下载,其他的就跟播放本地音乐一样了。播放本地音乐的软件架构通常如下: 
这里写图片描述

首先要解析音频文件头得到相关信息,有codec类型,采样率,通道数等。然后根据这些对每一帧音频数据进行解码得到PCM数据,如果有需要的话还要做后处理,比如均衡器,使音乐更美妙动听。处理完后把PCM数据放进ring buffer中。播放线程会定时的从ring buffer中取走需要的PCM通过I2S总线送给codec芯片,codec芯片把PCM数据转换成模拟信号然后播放出来,这样就可以听到动听的音乐了。


 

转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/10815613.html

你可能感兴趣的文章
用数据管理过程(3)——可预测级别的量化管理(麦当劳的管理方式)
查看>>
DataGridView的Validating事件注册后删除操作的处理
查看>>
我的IOS学习历程-第七天
查看>>
json的两种表示结构(对象和数组).。
查看>>
iOS Undefined symbols for architecture xxx问题的总结
查看>>
bzoj 3685: 普通van Emde Boas树
查看>>
关于线程池,那些你还不知道的事
查看>>
二分类问题F-score评判指标(转载)
查看>>
JAVA基础之字符串和面向对象
查看>>
大数据R语言简析
查看>>
Ant自己主动编译打包&公布 android项目
查看>>
vc6编译stlport及常见问题
查看>>
week_one-python格式化输出
查看>>
Webservice 从客户端中检测到有潜在危险的 request.form值[解决方法]
查看>>
LNMP详细介绍
查看>>
素数判定算法
查看>>
那些文章
查看>>
AR增强现实席卷而来
查看>>
word记录
查看>>
Hibernate中ManyToMany的第三张表添加其他字段
查看>>