➜ ffplay out.pcm
Input
Duration: 00:04:15.59, bitrate: 117 kb/s
Stream
2.19 M-A: 0.000 fd= 0 aq= 20KB vq= 0KB sq= 0B f=0/0
2.1 采样率
即采样的频率,指的是单位时间内每秒钟进行采样的次数,频率越高,离散的数据和连续的模拟信号的拟合就越接近,声音的质量也就越高,占的存储也就越大。
通常情况下,支持的采样率有22KHz/44KHz/48KHz等等。
2.2 采样位数
用来衡量采样值的指标,从图上来看,就是采样的波动幅度,它的数值越大,就说明在一个三角函数的图像之上,最大值和最小值的差距越大。
通常采样位数会被分为8bit和16bit,对应的二进制数值分别是:256和65536,即纵坐标的划分精细到256或者是65536等等的程度。
2.3 通道数
单声道、双声道、立体声等等,实际上我们可以指定单个通道发声,也可以指定两个通道发相同的声音,多扬声器环境下 + 立体声能够感受到更立体的音频。
0x03 一些音频格式、编码
3.1 PCM脉冲编码调制
PCM,脉冲编码调制。关于PCM最重要的一点,就是PCM是未经过任何编码、处理的原汁原味的声音脉冲数据,可以对采样后的音频数据做到完全无损的还原,但是我们也要注意,PCM一般不作为一种单独的格式,而是作为一种没有压缩的编码方式。
这里的无损的还原指的是还原成数字信号,而不是还原成输入的模拟信号。
当然,我们也能将PCM数据保存到一个.pcm文件中,但是文件中通常没有描述上述的数据(采样率、通道数等等)的内容,会导致无法正常播放,例如使用FFplay播放时,我们要手动指定PCM文件的Channel、Rate等等数据
3.2 WAV格式
WAV是一种比较常见的音频文件格式,它是一个容器格式,它的构成实际上是:WAV文件头 + 音频流编码,即WAV中可以支持类似于PCM、MP3等等其它的音频格式。
如果WAV的音频编码是采用的PCM,那么它就能做到对采集的数据进行无损的还原,如果采用的是MP3,那么它的播放可能就会因为MP3本身的编码产生一些损失,所以,只要你有对应的解码器,你的WAV文件就可以进行播放。
WAV的文件头中包含的数据包括本身的二进制文件头、音频码流的格式(PCM等等)、通道数、采样率、采样深度等等,在文件头之后,才是具体的音频数据。
3.3 MP3编码 - (Moving Picture Experts Group Audio Layer III)
MP3播放器在世纪初前可谓是风靡全球,其根本的原因,是其背后的MP3格式。
MP3能够大幅度地降低音频数据量。利用 MPEG Audio Layer 3 的技术,将音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的文件,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降,这使得MP3格式在存储空间寸土寸金和网络不佳的过去是非常受欢迎的,也是MP3播放器畅销的根本原因之一。
对于MP3,通常就是以MP3文件格式存在的,其文件头用于描述MP3格式信息,而文件内容,则是以MP3编码进行编码的音频数据。
而MP3的文件结构,大致上可以分为:
ID3V2
音频数据:由一系列的数据帧构成
ID3V1
其中,ID3V1版本会将作曲、专辑等等信息记录在文件尾(固定128B),而ID3V2版本将ID3V1可存储的内容进行扩展,记录在了文件头,并且它是不定长的。
音频数据本身是由一个个的帧构成的,帧又划分为:
具体的内容可以查看这篇文章
3.4 AAC编码
由Fraunhofer IIS、杜比实验室、AT&T、索尼等公司共同开发,目的是取代MP3格式。
MPEG-4标准出现之后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC,仍然采用了编码和压缩,是一种有损压缩格式。
AAC家族如下:
其中的红色部分,就是AAC-LC,作为一个最为基础的部分,他会和SBR共同构成AAC HE的第一个版本,即V1。
AAC-LC 低复杂度规格,码流是128K,音质好。
AAC-HE V1,其核心的思想,是按照频谱分别保存,低频编码保存其主要成分,高频单独放大编码保存音质,码流在64k左右。
AAC-HE V2,该版本认为,双声道中的声音存在某种相似性,只需要存储一个声道的全部信息,然后花很少的字节来描述另一个声道与它不同的地方(差异化存储)。
SBR : Spectral Band Replication 即频段复制
PS: Parametric Stereo:参数立体声
3.5 FLAC无损音频压缩编码
FLAC与MP3不同,MP3是有损音频压缩编码,但FLAC是无损压缩,也就是说音频以FLAC编码压缩后不会丢失任何信息,将FLAC文件还原为WAV文件后,与压缩前的WAV文件内容相同。这种压缩与ZIP的方式类似,但FLAC的压缩率大于ZIP和RAR,因为FLAC是专门针对PCM音频的特点设计的压缩方式。
3.5 OPUS格式
Opus编解码器的设计目的是处理广泛的交互式音频应用程序,包括IP语音,视频,游戏内聊天,甚至远程现场音乐表演。
细心的小伙伴可以会发现,OPUS的一个很大的应用场景就是人声,在WebRTC即时通信技术中,就采用的是OPUS音频编码。
比较详细的介绍可以看这里
0x04 /AAC的两种文件封装格式
针对网络传输和本地存储两种使用场景,AAC有两种封装格式:
4.1 ADIF 格式(Audio Data Interchange Format)
这种格式的特征,是可以确定地找到这个音频数据的开始,只能从头开始解码,不能在音频数据流中间开始解码,这种格式常用在磁盘文件中。
4.2 ADTS格式(Audio Data Transport Stream)
这种格式的特征是每一帧都有一个同步字,所以可以在音频流的任何位置开始解码,这样一来ADTS会比ADIF更大,因为它会用更多的数据空间来描述每一帧的信息,但是它更适合在网络流中进行传输。(英文缩写也应该能看出来,ADIF是一种交换格式Format,而ADTS是一种传输流Stream的格式)
ADTS通常会由7~9个字节组成。
格式中的位于含义如下:
0~11 位:同步字,当读取到0xFFF时,即代表一个ADTS头
第12位,MPEG规范,0代表MPEG4,1代表MPEG2
13~14位,Layer,总是0
第15位,Protection Absent,如果设置为1则没有CRC,而设置位0则采用CRC进行校验。
16~17,AAC的版本,HE或者LC
18~21,采样率
我们可以将对应的位输入到:www.p23.nl/projects/aa…
0x05 /从FFplay理解PCM和WAV的区别
上面描述了PCM和WAV这两种文件的详细内容,我们可以从ffplay的播放指令来理解二者的文件差异。
如果我们希望播放一个PCM文件,由于文件中没有对通道数、采样率等信息的描述,所以我们直接调用ffplay播放,那么是会出错的:
➜ ffplay out.pcm
out.pcm: Invalid data found when processing input
我们要手动指定PCM的声音数据,才能正常地进行播放。
➜ ffplay -ar 44100 -ac 2 -f s16le out.pcm
-ar
表示指定采样率是44100
-ac
表示指定通道数是2
-f
表示存储的数据格式,由于PCM存储的就是01数据,这里的格式就是01的存储方式,其中:S(signed)代表有符号,LE(little endian)为小端存储(先存低字节,再存高字节),s16le表示的就是以小端存储的有符号数。
而如果我们想要播放WAV,那我们只要:ffplay out.wav
即可,由于WAV格式中有记录信息,所以我们可以不用再去额外地指定格式。
➜ Music ffplay out.wav
Input
Metadata:
encoder : Lavf58.20.100
Duration: 00:03:50.32, bitrate: 130 kb/s
Stream
1.25 M-A: 0.000 fd= 0 aq= 20KB vq= 0KB sq= 0B f=0/0
复制代码
- 346
-
superZidan
JavaScript
React.js
音视频开发
- 3940
-
一只修仙的猿
Android
音视频开发
- 153
-
关键帧Keyframe
Android
音视频开发
- 1432
-
关键帧Keyframe
Android
音视频开发
- 1537
-
Android Jetpack
Kotlin
- 6156
-
关键帧Keyframe
Android
音视频开发
- 1416
-
关键帧Keyframe
Android
音视频开发