基于RK3399OpenHarmony富设备软件音频解码方案 原创 精华
1.音频编解码原理
数字音频是由 PCM(Pulse Code Modulation,脉冲编码调制)技术将模拟信号,主要经过抽样、量化、编码三个处理过程产生的,其中的编码就是按照一定的格式记录采样和量化后的数字数据,比如顺序存储或压缩存储。不经过编码的源音频数据量太大,所以编码最主要的工作就是压缩,即压缩掉冗余信号(指不能被人耳感知到的信号)。播放数字音频时需要进行解码,简单地说解码就是对应不同格式编码的逆向处理过程。音频解码分为硬件解码与软件解码2种方式:
硬件解码是通过声卡等设备专用的DSP芯片解码,功耗更低,解码质量、效率更高。
软件解码就是通过特定的软件解码,即使用CPU解码,由于要妥协解码设备的通用性,所以算法上对效率、质量有所折扣。
因当前基于扬帆的主板中没有相应的DSP芯片,我们将采用软件解码方式。
1.1.音频编码格式介绍
1.1.1.WAV(Waveform Audio File Format)
WAV是一款最接近无损的音频文件编码格式。由于WAV内部编码即PCM,并未对文件进行压缩,所以文件大小相对也比较大,理论上该文件格式可以在各种播放平台顺利编解码。
WAV编码就是在PCM数据格式的前面加上44字节,分别用来描述PCM的采样率、声道数、数据格式等信息。
特点:音质通透,支持软件广泛。
适用场合:多媒体开发的中间文件、保存音乐和音效素材。
1.1.2.MP3( Moving Picture Experts Group Audio Layer Ⅲ)
MP3是目前最流行的有损压缩音频编码格式。它设计用来大幅度地降低音频数据量,将音乐以1:10甚至1:12的压缩率,压缩成容量较小的文件。MP3文件大体分为三部分:TAG_V2(ID3V2)、音频数据、TAG_V1(ID3V1)。
特点:音质在128Kbit/s以上表现均衡,压缩比高,支持大量软件和硬件,兼容性好。
适用场合:高比特率下对兼容性有要求的音乐欣赏。
1.1.3.AAC(Advanced Audio Coding)
AAC是新一代的音频有损压缩技术,也是一种专为声音数据设计的文件压缩格式。与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的性价比。
特点:相对于MP3,AAC格式的音质更佳,文件更小。
适用场合:128Kbit/s以下的音频编码,多用于视频中音频轨的编码。
1.1.4.Ogg(OggVorbis)
Ogg是一种完全免费的且非常有潜力的音频多通道有损压缩编码技术。Ogg有着非常出色的算法,可以用更小的码率达到更好的音质。
特点:可以用比MP3更小的码率实现比MP3更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。
适用场合:语音聊天的音频消息场景。
1.2.MP3解码流程
同步及差错检查包括了头解码模块,在主控模块开始运行后,主控模块将比特流的数据缓冲区交给同步及差错检查模块,此模块包含两个功能,即头信息解码及帧边信息解码,根据它们的信息进行尺度因子解码及哈夫曼解码,得出的结果经过逆量化,立体声解码,混淆缩减,IMDCT,频率反转,合成多相滤波这几个模块之后,得出左右声道的PCM码流,再由主控模块将其放入输出缓冲区输出到声音播放设备。
MP3解码分同步方式和异步方式两种,所谓同步方式是指解码函数在解码完一帧后才返回并带回出错信息,异步方式是指解码函数在调用后立即返回,通过消息传递解码状态信息。
2.MP3软件解码数据结构与算法
2.1.MP3软件解码数据结构分析
2.1.1.struct UndecodeStream
此数据结构存放解码前的位流数据。
2.1.2.struct SynthStream
此数据结构存放解码合成滤波后的PCM数据。
PcmStream定义了音频的采样率、声道个数和PCM 采样数据, 用这里面的信息来初始化音频设备。以帧(frame)为单位对MP3进行解码的,当正确的解码完一帧数据可以得到(每声道)1152个PCM 数据。一帧数据量可以用下面的公式来计算:
frameSize = (((mpegVersion == MPEG1 ? 144 : 72) * bitRate) / samplingRate) + paddingBit
例如: bitRate = 128000, a samplingRate =44100, andpaddingBit = 1
frameSize = (144 * 128000) / 44100 + 1 = 417 bytes
也就是说,想解码一个比特率为128K,采样率为44.1K 的MP3 文件,最少一次读入内存417 bytes 以准备解码,通常需要读入的字节数要比一帧的数据量多一些,比如16K。
2.1.3.struct FrameDecodeStream
此数据结构存放MPEG帧解码后PCM 数据。
在layer 域中得到音频数据所采的层,在mode域中得到音频数据的声道个数,在birRate和sampleRate中得到音频数据的位率(128kbps、384kbps 等等)和采样率(22KHz、44.1KHz、48KHz等)。
2.1.4.struct AudioDecoder
此数据结构存放音频解码器功能数据。
2.2.MP3软件解码功能函数分析
2.2.1.MP3解码(Mp3Decode)
2.2.2.解码器初始化(DecoderInit)
2.2.3.解码器运行(DecoderRun)
2.2.4.解码器结束处理(DecoderFinish)
2.2.5.解码器消息处理(DecoderMsg)
2.2.6.解码器功能操作函数集(DecoderOps)
该组函数在初始化解码器时自定义、实现与传入。
-
HeaderFunc
-
FilterFunc
-
OutputFunc
2.3.HAL层实现软件解码设计
将解码代码放在drivers/audio/hal/decoder目录中,构建为audio_decode.so。在播放流程(audio_render)中的调用解码函数(同步方式),循环传入MP3流数据,输出PCM流(每次16K数据)。
学习到了,感谢老师分享。
感谢大家支持
目前扬帆开发板有活动哦
支持支持
很棒👍🏻