一、概述

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音频长度计算公式如下:若单帧是20ms持续时长
framesize=通道数*20ms对应采样点数*采样深度占用bit数。
同理,码率=通道数*1秒对应采样点数*采样深度占用bit数
例如PCMA数据,通道数为单声道,采样率为8000HZ,采样深度为8bit。当10ms一帧时,
单帧的长度为:通道数1*(采样率8000/1000ms)*10ms*8bit=640bit=80字节
码率为:通道数1*采样率8000*8bit=64kbps
可参考ffmpeg的av_samples_get_buffer_size函数:

本文详细介绍了ffmpeg音频处理中至关重要的三个参数:声道数、采样频率和采样深度。讲解了它们的概念、影响和ffmpeg支持的不同格式。同时,涵盖了码率计算实例和数据结构示例。
2490

被折叠的 条评论
为什么被折叠?



