ffmpeg:音频样本的字节顺序

ffmpeg: Endianness of audio samples

我使用 ffmpeg 的 avcodec 从我的 c++ 应用程序中的音乐文件中检索原始音频样本。对于我测试过的文件,这些文件样本的字节顺序似乎是小端字节序,但我想知道对于我尝试解码的所有文件来说,这是否总是正确的(即来自 ffmpeg 的实现或至少它的架构-具体因为我的计算机的体系结构使用小端)。如果不是,我认为这将取决于特定文件的编码格式。在那种情况下,我如何检查我正在解码的每个文件适用于哪种字节顺序?我在文档中找不到任何相关信息。

在内部 ffmpeg 始终对音频样本使用本机字节序,因为它可以更轻松地对数据执行各种操作(有关此问题的一些文档,请参阅 libavutil/samplefmt.h 文件);编解码器的任务是根据文件格式将 to/from 转换为适当的字节顺序。作为一个简单的例子:有一个用于 reading/writing 原始样本的简单音频编解码器系列,称为 pcm_*;例如有 pcm_s16lepcm_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 位有符号样本。