对于下面data和linesize的解释(参考下面3.4中的av_samples_alloc_array_and_samples函数说明):

1)data是通道的意思,例如双通道,data[0]代表左声道,data[1]代表右声道。

2)linesize为采样个数的最大大小字节空间

例如aac,64位,双通道,则对于交错模式最大为:linesize = 2 x 1024 x 8 = 16384。此时也是一个音频帧的大小。

对于平面模式最大为:linesize = 1024 x 8 = 8192,平面模式时会有多个平面通道,例data[0],data[1],注意,断点看时参不一定是最大大小字节空间数,此时linesize不代表什么,他只是代表单个通道的所有样本数所占的字节数。

3)额外注意,已经写入的音频文件是交错模式,而FFmpeg库默认是平面模式处理的,所以将音频文件读到内存使用FFmpeg处理时需要转成平面模式;同理FFmpeg写入文件需要转成交错模式再写入。

一 音频通道数、采样率、采样个数(样本数)、采样位数的概念

1 通道数: 个人理解,就是同时有个几个设备在进行音频的采样,这样对上面的公式更好理解,最少为1,一般通道数越多,音质越好。

2 采样频率: 也称为采样速度,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。

3 采样位数(采样格式): 既然采样频率表示每秒采样的个数,那么如何描述每个采样点呢?用什么方法独立每个采样点值的区别呢?也就是如何度量每个采样点,而这正是采样格式出现的意义。通常使用16bit(2字节),也就是2的16次方,共有65536个不同的度量值,这样采样位数越高,音频度量化的就越精细,音质同样也就越高。

简括采样位数就是,例如我1s采样了10个采样点,那么我需要区分这10个采样点,就需要给它一个范围值区分,一般以2字节16位的来保存这个值,所以既然每个采样点占2字节,那么
所有采样点的总字节=采样个数 x 其所占字节数。即10 x 2 = 20。若为双通道采样,那么就是2 x 10 x 2 = 40。

4 采样个数(样本数)(nb_samples):
采样个数就是采样的个数
对于采样频率,采样频率是一秒采样的个数,例如48000HZ,每秒采样个数为48000,44100HZ,每秒采样个数为44100。

而对于一帧音频的采样个数,AAC固定一帧采样1024个,MP3格式则为1152。
至于为何固定,下面会进行解释。

二 计算一帧音频的大小、每秒播放的音频字节大小、一帧音频的播放时长

1 一帧音频的大小(字节) = 通道数 x 采样个数 x 采样位数。例如该音频帧是FLTP格式的PCM数据,那么就是aac,所以一帧中包含1024个采样个数,并且是双声道的话,那么该音频帧包含的数据量是 2 x 1024 x 4 = 8192字节。
若格式改成AV_SAMPLE_FMT,那那么采样位数是64位8字节,数据量为 2 x 1024 x 8 = 16384字节。

2 每秒播放的音频字节大小(字节) = 通道数 x 采样个数 x 采样位数。公式是一样的,但是由于求的是每秒的数据量而不是一帧的数据量,所以我们需要知道它的采样频率。 例如当采样频率为48kHZ时,一秒包含48k个采样个数而不是1024个,同样是双声道,FLTP格式,那么每秒的数据量是 2 x 48000 x 4 = 384000字节。

3 一帧音频的播放时长
以采样率44100HZ来计算,每秒44100个sample,而正常一帧为1024个sample,由于比是相等的,可知每帧播放时间/1024 = 1000ms/44100,得到每帧播放时间=1024*1000/44100 = 23.2ms(更精确的是23.21995464852608)。

或者用另一种方式去理解公式,1s显示的帧数 = 44100 / 1024 = 43.06640625帧。所以每一帧的播放时长 = 1s / 43.06640625 = 1000ms / 43.06640625 = 23.21995464852607ms。和上面的公式一样(浮点数尾部运算存在极小误差是正常)。所以转换一下公式:
一帧播放时间(毫秒) = 1000ms / (44100 / 1024) = 1000ms * 1024 / 44100 = 23.2ms(更精确的是23.21995464852607)。

所以最终都是转化成下面的公式:
一帧播放时间(毫秒) = nb_sample样本数 * 1000 / 采样率 。

播放时长的精度是否可以舍弃呢?
答:不能。

例如当采样频率为44.1kHZ:

1)一帧播放时间(毫秒) = nb_sample样本数 * 1000 / 采样率 = 1024 * 1000 / 44100 = 23.21995464852608ms -> 约等于23.2ms,精确损失了0.011995464852608ms,如果累计10万帧,误差 > 1199毫秒,如果有视频一起的就会出现音视频同步的问题,如果按着23.2msm去计算pts(0 23.2 46.4 …)就会有累积误差
这里播放10万个音频帧大概需要的时长:((23.21995464852608ms x 100000) / 1000)s / 60 = 38.699924min。乘以10万得到ms,除以1000单位变成秒,除以60单位变成分钟。

采样频率为48kHZ时的一帧播放时长:

2)1024 * 1000 / 48000 = 21.33333333333ms。同理,精度不能舍弃。

以上是AAC格式的播放时长。

下面是MP3的一音频帧的播放时长:

解释为何AAC和MP3为何一帧固定采样个数。
从我自己的理解来看,固定AAC为1024,MP3为1152肯定是有道理的,从一帧音频帧的播放时长中就可以看出,范围在21ms,24ms,26ms范围左右,而视频一帧的时长一般是40ms,人体对图片变化的感知也在20-60ms内感知良好,所以个人认为采样数固定,是在考虑人眼,与音视频同步的方便程度,音频压缩的质量等方面因素后,最终确定下来的采样数。

三 音频重采样

3.1 什么是重采样
将音频三元组(采样率,采样大小和通道数)其中任意一个值发生改变就称为重采样, 例如48000/32/2 转成 44100/16/2。

3.2 为什么要重采样

3.3 重采样的步骤

3.4 几个重要的API

3.5 重采样时,输出的样本数怎么求
进行重采样时,输入和输出时间是需要相等的。所以我们可以根据上面的公式去求出输出的样本数即采样点。

根据上面一帧音频的播放时长公式有,输入输出都去掉1000,有下面的公式:

可以看到,上面公式的规律:

//AV_ROUND_UP代表向上取整
dst_nb_samples = av_rescale_rnd(src_nb_samples, dst_rate, src_rate, AV_ROUND_UP);

音频通道数、采样频率、采样位数、采样个数(样本数)的概念及计算一帧音频的大小、每秒播放的音频字节大小、一帧的播放时长、音频重采样相关推荐

  1. C语言(CED)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。

    )输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出. [输入] 第一行包含一个整数n,表示数组的大小. 第二行包含n个整数,表示数组的元素,整数之间以一个 ...

  2. 音视频基础(四)音频文件格式转换(支持重采样采样位数为24位)

    ffmpeg将音频文件重采样为8位.16位.32位的命令比较容易查找,但是重采样为24位却非常非常的少. ffmpeg -i 32.wav -vn -ac 2 -ar 44100 -acodec pc ...

  3. 音频属性相关:声道、采样率、采样位数、样本格式、比特率

    不仅限于FFmpeg, 音频采样所得的PCM都含有三个要素:声道(channel).采样率(sample rate).样本格式(sample rate). 声道 当人听到声音时,能对声源进行定位,那么 ...

  4. [信号基础] 信号频率,采样率,采样点(快拍数)等

    参考: <2>信号频率.采样频率.采样点数 - 简书 <3>2.3 信号采样与采样定理 - 物联网前沿实践 <4>语音信号处理--常识与基本概念 - 凌逆战 - 博 ...

  5. 【Android 高性能音频】AAudio 音频流 样本缓冲 相关配置 ( 通道数 | 样本格式 | 帧缓冲 | 采样率 | 每帧样本数 == 通道数 )

    文章目录 I . AAudio 音频流创建流程 II . AAudio 音频流构建器 设置 通道数 AAudioStreamBuilder_setChannelCount III . AAudio 音 ...

  6. wav文件的采样位数从16位转换到8位的C语言实现

    目录 前言 程序解析及源码 函数学习 malloc与free函数 memcpy函数 feof函数 源码解析 前言 今天来对自己找到的一份网上的有关将wav文件的采样位数从16位转化成8位的程序进行解析 ...

  7. 【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )

    文章目录 I . AAudio 音频流 采样 缓冲 播放 的连续机制 II . AAudio 音频流 数据回调函数 函数指针类型定义 III . AAudio 音频流 数据回调函数 实现 IV . A ...

  8. * 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数? * 把这些数都输出出来,并且输出总共的个数。

    package Day03;import java.util.ArrayList;/*** 第五题:* 有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?* 把这些数都输出出来,并且 ...

  9. 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。

    已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位 ...

最新文章

  1. Hbase搭建-基于hadoop3--并且解决了hbase error: KeeperErrorCode = NoNode for /hbase/master错误
  2. 新入行程序员须知的8件事
  3. python删除txt文件第三行_真香!Python十大常用文件操作,轻松办公
  4. ASP.NET MVC 3 Validation - 正则表达式验证RegularExpressionAttribute之日期验证
  5. 大数据分析,利用向外扩展技术深入挖掘商业价值
  6. python3字符串操作_python3字符串常用方法
  7. matlab计算星期,在matlab中计算周数
  8. 【Pyecharts50例】GEO使用外国地图/使用美国地图
  9. mysql一条sql是一个事物么_mysql 事物浅析
  10. js动态添加修改删除元素
  11. fastjson使用toJSONString时null值不序列化问题
  12. ROOT/RStringView.hxx:32:37: error: ‘experimental’ in namespace ‘std’ does not name a type
  13. linux服务器系统安装
  14. vue 环信im 接收语音
  15. 举个栗子!Tableau技巧(60):轻松搞定 关系网 图表
  16. unity材质球发光_Unity利用材质自发光实现物体闪烁
  17. 逆水寒服务器紫荆之巅有关消息,#紫荆之巅#这是我平江府的开会内容【逆水寒ol吧】_百度贴吧...
  18. C++11 boost::spirit::qi简单的XML解析器示例
  19. 2016 期末兼年终总结
  20. 好文章也是要色香味俱全的!——CVPR2010最有趣文章

热门文章

  1. 机器学习深度学习加强学习_加强强化学习背后的科学
  2. SDL Trados 2019 和 2021 十月更新
  3. 硬盘被格式化后数据如何恢复(在mac电脑上抹掉了)
  4. [Android] 单独编译生成boot.img时mkbootfs: No such file or directory解决方法
  5. 518抽奖软件:极简主义设计的践行者
  6. 使用magic-api ,让你的开发效率蹭蹭提升
  7. 大数据白皮书(2019) 中国信通院
  8. 图像处理软件设计 基于Qt5/openCV3(未完成)
  9. informix-onbar
  10. 信息系统项目管理师---第十七章 战略管理 第十八章 组织级项目管理 第十九章 流程管理