音频数据格式:
基本格式内容:声道数channels、采样率sample_rate(采样设备每秒抽取样本的次数)
采样数据类型(量化精度)sample_fmt
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 linking dynamically
};
带planar的数据是按各个声道分组排列的,以双声道为例,左声道数据存储在data[0],右声道数据存储在data[1],每个声道所占用的字节数为linesize[0]和linesize[1],播放之前必须先转换为非planar形式。
不带P(packed)的音频数据在存储时,是按照LRLRLR…的格式交替存储在data[0]中,linesize[0]表示总的数据量。
channel_layout
声道分布FFmpeg\libavutil\channel_layout.h中有定义,常用的有以下几种:
#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER)//单通道
#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT) //双声道
#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER) //三声道
音频帧的数据量计算:
一帧音频的数据量=channel数 * nb_samples样本数 * 每个样本占用的字节数
av_samples_get_buffer_size