一、概述
ffmpeg音频参数主要有如下四个:
1、声道数(nb_channels):常见的有单声道,双声道,5.1环绕立体声道。
2、采样频率(nb_samples):每秒钟取得声音样本的次数。如下图所示,把音频文件放大,实际上都是一个一个的点,一秒钟有多少个横坐标的点,就是该音频的采样频率。
3、采样深度 (sample_fmt):比特深度决定了文件的动态分辨率,类似照片分辨率。每个样本所含的比特越多,代表着动态范围越大。这并不意味,比特深度越高,音量越大;而是更高的比特深度听起来会更加真实,因为它们可以尽量减少音频失真度。如上图所示,每个点的纵坐标的刻度到底有多细。纵坐标越粗,音频失真越大。反之越细,音频失真越少。
目前ffmpeg支持的sample_fmt类型如下:
AVSampleFormat枚举 | 数据类型 | 存储方式 | name | 占用bit位 |
AV_SAMPLE_FMT_U8 | unsigned 8 bits | packed | u8 | 8bit |
AV_SAMPLE_FMT_S16 | signed 16 bits | packed | s16 | 16bit |
AV_SAMPLE_FMT_S32 | signed 32 bits | packed | s32 | 32bit |
AV_SAMPLE_FMT_FLT | float | packed | flt | 32bit |
AV_SAMPLE_FMT_DBL | double | packed | dbl | 64bit |
AV_SAMPLE_FMT_U8P | unsigned 8 bits | planar | u8p | 8bit |
AV_SAMPLE_FMT_S16P | signed 16 bits | planar | s16p | 16bit |
AV_SAMPLE_FMT_S32P | signed 32 bits | planar | s32p | 32bit |
AV_SAMPLE_FMT_FLTP | float | planar | fltp | 32bit |
AV_SAMPLE_FMT_DBLP | double | planar | dblp | 64bit |
AV_SAMPLE_FMT_S64 | signed 64 bits | packed | s64 | 64bit |
AV_SAMPLE_FMT_S64P | signed 64 bits | planar | s64p | 64bit |
备注:
1、该数据是参考ffmpeg代码中的static const SampleFmtInfo sample_fmt_info表格。
2、packed和planar含义:
- packed:多个声道数据交错存放,所有声道的数据交错排放在frame.data[0],数据长度为linesize[0](单位:字节)
- planar:每个声道数据单独存放,声道0的起始地址为 frame.data[0],声道1的起始地址为 frame.data[1],以此类推。每个声道的数据长度都为linesize[0](单位:字节)
二、帧率计算
根据上述描述,一帧PCM音频长度计算公式如下:
framesize=通道数*采样频率*采样深度占用bit数。
可参考ffmpeg的av_samples_get_buffer_size函数: