音视频与ffmpeg入门(一) 声音与声音采样

声音与采样

0x01 /声音在设备中的传递 我们知道,自然界中的声音是由震动产生的,声音会随着介质传输,直到被我们所听到。我们的电脑也有「听」声音的能力。 一个声音产生之后,就被麦克风所捕获,这些信号是连续的,我们会对它进行采样,进而生成离散的数字信号。数字信号我们可以进一步进行分析、方便它的存储,然后存储为最基础的PCM数据,封装或者编码成WAV/AAC等等的音频格式,然后存储在文件系统当中。 在我们需要的时候,就可以使用音响等输出设备对声音进行播放。

​我们可以听到环境中会有各种各样不同的音效,人声、噪声等等,但是声音是会叠加的,即某一个时刻内,声音A和声音B进行叠加,产生了声音C,我们听到声音C时,将前后多个时刻的声音联系起来,大脑才能解析出A和B同时发出了不同的声音,而且声音的叠加是波的叠加,而不是简单的分贝相加,例如通常情况下,10个30分贝的声音不会叠加成300分贝的声音,声音的大小是比最大的声音略高。

所以,我们要知道,麦克风等输入设备进行采样时,是对环境中叠加后的声音进行的采样,采样得到的数字信号是所有声音叠加过后的。 所以,在一些场景下,我们可能需要一些算法对一些特殊的声音进行增强、放大等处理,例如市面上一些主动降噪的降噪耳机所做的,就是发出一个反向的低频声音,将低频噪声抵消掉,而高频率的人声得以保留,所以即使你戴了降噪耳机,对人声的降噪效果并不是特别的明显,而对环境噪声的效果是特别显著的。

0x02 /声音的几个重要属性 我们有必要知道声音相关的几个重要的属性: 我们可以使用ffplay out.aac播放一个音频文件,此时的Shell中就会打印音频相关的信息:

➜ ffplay out.pcm Input #0, aac, from 'out.aac':   Duration: 00:04:15.59, bitrate: 117 kb/s     Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 117 kb/s    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等等)、通道数、采样率、采样深度等等,在文件头之后,才是具体的音频数据。

【CSDN后台私信,免费分享】资料包括《Andoird音视频开发必备手册+音视频学习视频+学习文档资料包+大厂面试真题+2022最新学习路线图》等C/C++/Linux/FFmpeg/webRTC/rtmp/hls/rtsp/ffplay/srs 

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的文件结构,大致上可以分为:

  1. ID3V2

  2. 音频数据:由一系列的数据帧构成

  3. ID3V1 其中,ID3V1版本会将作曲、专辑等等信息记录在文件尾(固定128B),而ID3V2版本将ID3V1可存储的内容进行扩展,记录在了文件头,并且它是不定长的。 音频数据本身是由一个个的帧构成的,帧又划分为:

  4. 帧头

  5. CRC

  6. 通道信息

  7. 声音数据

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个字节组成。

格式中的位于含义如下:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • 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 #0, wav, from 'out.wav':
  Metadata:
    encoder         : Lavf58.20.100
  Duration: 00:03:50.32, bitrate: 130 kb/s
    Stream #0:0: Audio: aac (LC) ([255][0][0][0] / 0x00FF), 44100 Hz, stereo, fltp, 135 kb/s
   1.25 M-A:  0.000 fd=   0 aq=   20KB vq=    0KB sq=    0B f=0/0 

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/125824393