本系列文章会陆续更新与ffmpeg相关的知识点。
一、环境信息
1、ffmpeg版本:4.4
2、linux
二、通过libavutil/samplefmt.h中查看该版本中支持以下音频格式。
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
};
采样格式主要针对的是每次采样时采用的方式:
1、位深:单次音频采样的bit数,一般有8、16、32;
2、存储方式:目前ffmpeg的音频和视频都支持两种存储方式,一种为packed(打包方式),另一种为(planner);
a、packed: 即不同声道的数据时交织在一起的,如某个audio有2个声道,采用packed方式时,先取第一个通道的一个位深(8、16、32),再取第二个通道的一个位深(8、16、32),如此交织在一起行成一帧音频数据。
b、planar:即不同的声道是像平面一样展开,仍然以2通道的声音举例,即一帧数据采用先存储第一个通道的所有数据,然后紧接着存储第二个通道的所有数据,如此形成一帧音频数据。
3、有无符号:单次采样值是有符号还是无符号整数或者float。
4、整数、浮点数、双精度:与第三点类似。
上述信息我们可以通过上述枚举的类型命名中洞察一二,如US分别代表无符号、有符号;
FLT、DBL代表float和双精度数值,也同时隐含说明了该采用值的位深,如同命名中的8、16、32;后续的P代表planar模式,默认不带p的为packed模式,如S32P、FLTP中最后的字母“P”就代表了planar模式。
【注意】:由于是一边学习,一边总结,难免有错漏之处,也请各位专家不吝指教,感谢。