建议收藏 | 音频属性相关:声道、采样率、采样位数、样本格式、比特率

不仅限于FFmpeg, 音频采样所得的PCM都含有三个要素:声道(channel)采样率(sample rate)样本格式(sample format)

声道

当人听到声音时,能对声源进行定位,那么通过在不同的位置设置声源,就可以造就出更好的听觉感受,如果配合影像进行音频位置的调整,则会得到更好的视听效果。

常见的声道有:

  1. 单声道,mono

  2. 双声道,stereo,最常见的类型,包含左声道以及右声道

  3. 2.1声道,在双声道基础上加入一个低音声道

  4. 5.1声道,包含一个正面声道、左前方声道、右前方声道、左环绕声道、右环绕声道、一个低音声道,最早应用于早期的电影院

  5. 7.1声道,在5.1声道的基础上,把左右的环绕声道拆分为左右环绕声道以及左右后置声道,主要应用于BD以及现代的电影院

如下是一个双声道的音频系统:

eeec2a684d72c68503133c9e407ac8ad.png

采样率

音频采样,是把声音从模拟信号转换为数字信号。采样率,就是每秒对声音进行采集的次数,同样也是所得的数字信号的每秒样本数。在对声音进行采样时,常用的采样率有:

  • 8,000 Hz - 电话所用采样率, 对于人的说话已经足够

  • 11,025 Hz - AM调幅广播所用采样率

  • 22,050 Hz和24,000 Hz - FM调频广播所用采样率

  • 32,000 Hz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率

  • 44,100 Hz - 音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD, MP3)所用采样率

  • 47,250 Hz - 商用 PCM 录音机所用采样率

  • 48,000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率

  • 50,000 Hz - 商用数字录音机所用采样率 *96,000 或者 192,000 Hz - DVD-Audio、一些 LPCM DVD 音轨、BD-ROM(蓝光盘)音轨、和 HD-DVD (高清晰度 DVD)音轨所用所用采样率

  • 2.8224 MHz - Direct Stream Digital 的 1 位 sigma-delta modulation 过程所用采样率。

采样越高,声音的还原就越真实越自然,人对频率的识别范围是 20HZ - 20000HZ, 如果每秒钟能对声音做 20000 个采样, 回放时就足可以满足人耳的需求. 所以 22050 的采样频率是常用的, 44100已是CD音质, 超过48000的采样对人耳已经没有意义。这和电影的每秒 24 帧图片的道理差不多。

46d7754f7d950b22f8e34c58b3992c66.png

采样位数

音频在经过采样得到样本后,还需要对该样本执行两个步骤:

  1. 量化。

音频量化的量化位数常用的有:

  • 8bit (也就是1字节) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;

  • 16bit  (也就是2字节) 可以细到 65536 个数, 这已是 CD 标准了;

  • 32bit (也就是4字节) 能把振幅细分到 4294967296 个等级, 实在是没必要了.

量化位数又叫做采样位数位深度分辨率, 它是指声音的连续强度被数字表示后可以分为多少级。N-bit的意思声音的强度被均分为2^N级。16-bit的话,就是65535级。这是一个很大的数了,人可能也分辨不出六万五千五百三十五分之一的音强差别。

也可以说是声卡的分辨率,它的数值越大,分辨率也就越高,所发出声音的能力越强。这里的采样倍数主要针对的是信号的强度特性,采样率针对的是信号的时间(频率)特性这是两个不一样的概念。

  1. 二进制编码。

也就是把量化所得的结果,即单个声道的样本,以二进制的码字进行存放。其中有两种存放方式:

  • 直接以整形来存放量化结果,即Two's complement code;

  • 以浮点类型来存放量化结果,即Floating point encoding code。

大多数格式的PCM样本数据使用整形来存放,而在对一些对精度要求高的应用方面,则使用浮点型来表示PCM 样本数据。

音频在量化得到二进制的码字后,需要进行变换,而变换(MDCT)是以块为单位(block)进行的,一个块由多个(120或128)样本组成。而一帧内会包含一个或者多个块。

帧的常见大小有960、1024、2048、4096等。一帧记录了一个声音单元,它的长度是样本长度和声道数的乘积。

FFmpeg中 AVFrame 结构体中的 nb_samples 代表的就是一帧中单个声道的音频样本数量。

f34ff3369cee2f1aa1fd4bab39dcdf60.png

样本的组合方式

这个主要是针对双声道或多声道音频来说的,对于一个双声道音频来说,它的组合方式可能有以下两种:

  1. 交错(interleaved)。以stereo为例,一个stereo音频的样本是由两个单声道的样本交错地进行存储得到的。

  2. 平面(planar)。各个声道的样本分开进行存储。

a7db48c9b5569b14eeba26498105cb76.png

FFmpeg音频解码后的数据是存放在AVFrame结构中的。

Packed格式,frame.data[0]或frame.extended_data[0]包含所有的音频数据中。

Planar格式,frame.data[i]或者frame.extended_data[i]表示第i个声道的数据(假设声道0是第一个), AVFrame.data数组大小固定为8,如果声道数超过8,需要从frame.extended_data获取声道数据。

样本格式

FFmpeg中的样本格式主要有:

enum AVSampleFormat {
    AV_SAMPLE_FMT_NONE = -1,
    AV_SAMPLE_FMT_U8,          ///< unsigned 8 bits
    AV_SAMPLE_FMT_S16,         ///< signed 16 bits
    AV_SAMPLE_FMT_S32,         ///< signed 32 bits
    AV_SAMPLE_FMT_FLT,         ///< float
    AV_SAMPLE_FMT_DBL,         ///< double
 
    AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar
    AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar
    AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar
    AV_SAMPLE_FMT_FLTP,        ///< float, planar
    AV_SAMPLE_FMT_DBLP,        ///< double, planar
    AV_SAMPLE_FMT_S64,         ///< signed 64 bits
    AV_SAMPLE_FMT_S64P,        ///< signed 64 bits, planar
 
    AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if 
};

说明:

1.U8(无符号整型8bit)、S16(整型16bit)、S32(整型32bit)、FLT(单精度浮点类型)、DBL(双精度浮点类型)、S64(整型64bit),不以P为结尾的都是interleaved结构,以P为结尾的是planar结构。

2.Planar模式是FFmpeg内部存储模式,我们实际使用的音频文件都是Packed模式的。

3.FFmpeg解码不同格式的音频输出的音频采样格式不是一样。测试发现,其中AAC解码输出的数据为浮点型的  AV_SAMPLE_FMT_FLTP  格式,MP3解码输出的数据为  AV_SAMPLE_FMT_S16P  格式(使用的mp3文件为16位深)。

具体采样格式可以查看解码后的AVFrame中的 format 成员或解码器的AVCodecContext中的 sample_fmt 成员。

比特率

每秒的传输速率(位速, 也叫比特率)。如705.6kbps 或 705600bps, 其中的 b 是 bit, ps 是每秒(per second)的意思,表示每秒705600bit的容量。

压缩的音频文件常常用倍速来表示,譬如达到CD音质的MP3是128kbps/44100HZ。注意这里的单位是bit而不是Byte,一个Byte等于8个bit(位),bit是最小的单位,一般用于网络速度的描述和各种通信速度,Byte则用于计算硬盘,内存的大小。

  • Mbps 即:Milionbit per second(百万位每秒);

  • Kbps 即:Kilobit per second(千位每秒);

  • bps 即:bit per second (位每秒),

相应的换算关系为:

1Milionbit=1000Kilobit=1000000bit;1Mbps = 1000 000bps;  再次强调这里是速度单位,指每秒传输的二进制位数,数据传输速率的衡量单位K是十进制含义,但数据存储的K是二进制含义。

例如:

通常描述的1M带宽就是1Mbps = 1000 000 bps =  1000 000 / 8 / 1000 = 125; 所以1M带宽的下载速率一般不超过125KB/s

100M宽带也就是100 000 000bps = 100 000 000 / 8 / 1000 / 1000 = 12.5, 所以100M带宽的下载速率最大可达到12.5MB/s

当然了,以上只是理论速率,实际上最大的下载速率可能还达不到那么多,主要还会受到各种损耗的影响,一般100MB宽带下载速率能达到10MB就算不错了。

采样率、采样位数、比特率三者之间的关系

例:根据一个文件的大小推算出文件时长

譬如 "Windows XP 启动.wav" 的文件长度是 424,644 字节, 它是 "22050HZ / 16bit / 立体声" 格式(这可以从其 "属性->摘要" 里看到)。

那么它的每秒的传输速率(位速, 也叫比特率、取样率)是 22050162 = 705600(bit/s), 换算成字节单位就是 705600/8 = 88200(字节/秒),播放时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。

但是这还不够精确, 包装标准的 PCM 格式的 WAVE 文件(*.wav)中至少带有 42 个字节的头信息, 在计算播放时间时应该将其去掉。

所以就有:(424644-42) / (22050162/8) ≈ 4.8140816(秒). 这样就比较精确了。也就是:

(文件总大小 - 头信息)/ (采样率 * 采样位数 * 通道数 / 8) [也就是比特率] ≈ 文件时长。

来源:https://www.cnblogs.com/yongdaimi/p/10722355.html

8abbe624c1ae7ed10b3b237d43b8ccc2.png

技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

6f2cc3373486442d488aa2c6c5d1a984.png

私信领取相关资料

推荐阅读:

音视频开发工作经验分享 || 视频版

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

NDK 学习进阶免费视频来了

你想要的音视频开发资料库来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

b52e53d011e1c747d69bc1b7ea5ee96d.gif

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值