ffmpeg:音频样本的字节顺序
ffmpeg: Endianness of audio samples
我使用 ffmpeg 的 avcodec 从我的 c++ 应用程序中的音乐文件中检索原始音频样本。对于我测试过的文件,这些文件样本的字节顺序似乎是小端字节序,但我想知道对于我尝试解码的所有文件来说,这是否总是正确的(即来自 ffmpeg 的实现或至少它的架构-具体因为我的计算机的体系结构使用小端)。如果不是,我认为这将取决于特定文件的编码格式。在那种情况下,我如何检查我正在解码的每个文件适用于哪种字节顺序?我在文档中找不到任何相关信息。
在内部 ffmpeg 始终对音频样本使用本机字节序,因为它可以更轻松地对数据执行各种操作(有关此问题的一些文档,请参阅 libavutil/samplefmt.h
文件);编解码器的任务是根据文件格式将 to/from 转换为适当的字节顺序。作为一个简单的例子:有一个用于 reading/writing 原始样本的简单音频编解码器系列,称为 pcm_*
;例如有 pcm_s16le
和 pcm_s16be
。在小端架构上 pcm_s16le
将不进行转换,而 pcm_s16be
将在 decoding/encoding 数据时交换字节。
正如安德烈所说,FFMpeg 在内部解码为本机字节顺序。 libavutil/samplefmt.h
的头文件中提到了这一点
* Audio sample formats
*
* - The data described by the sample format is always in native-endian order.
* Sample values can be expressed by native C types, hence the lack of a signed
* 24-bit sample format even though it is a common raw audio data format.
它没有描述 *le 或 *be。可用的格式是:
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_NB ///< Number of sample formats. DO NOT USE if linking dynamically
};
通常您会得到平面 16 位有符号样本。
我使用 ffmpeg 的 avcodec 从我的 c++ 应用程序中的音乐文件中检索原始音频样本。对于我测试过的文件,这些文件样本的字节顺序似乎是小端字节序,但我想知道对于我尝试解码的所有文件来说,这是否总是正确的(即来自 ffmpeg 的实现或至少它的架构-具体因为我的计算机的体系结构使用小端)。如果不是,我认为这将取决于特定文件的编码格式。在那种情况下,我如何检查我正在解码的每个文件适用于哪种字节顺序?我在文档中找不到任何相关信息。
在内部 ffmpeg 始终对音频样本使用本机字节序,因为它可以更轻松地对数据执行各种操作(有关此问题的一些文档,请参阅 libavutil/samplefmt.h
文件);编解码器的任务是根据文件格式将 to/from 转换为适当的字节顺序。作为一个简单的例子:有一个用于 reading/writing 原始样本的简单音频编解码器系列,称为 pcm_*
;例如有 pcm_s16le
和 pcm_s16be
。在小端架构上 pcm_s16le
将不进行转换,而 pcm_s16be
将在 decoding/encoding 数据时交换字节。
正如安德烈所说,FFMpeg 在内部解码为本机字节顺序。 libavutil/samplefmt.h
的头文件中提到了这一点 * Audio sample formats
*
* - The data described by the sample format is always in native-endian order.
* Sample values can be expressed by native C types, hence the lack of a signed
* 24-bit sample format even though it is a common raw audio data format.
它没有描述 *le 或 *be。可用的格式是:
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_NB ///< Number of sample formats. DO NOT USE if linking dynamically
};
通常您会得到平面 16 位有符号样本。