iOS音视频资料

如何设置AudioStreamBasicDescription

2020-01-21  本文已影响0人  yxibng

AudioStreamBasicDescription

struct AudioStreamBasicDescription
{
    Float64             mSampleRate;
    AudioFormatID       mFormatID;
    AudioFormatFlags    mFormatFlags;
    UInt32              mBytesPerPacket;
    UInt32              mFramesPerPacket;
    UInt32              mBytesPerFrame;
    UInt32              mChannelsPerFrame;
    UInt32              mBitsPerChannel;
    UInt32              mReserved;
};
typedef struct AudioStreamBasicDescription  AudioStreamBasicDescription;

mSampleRate

采样率,每秒多少个采样。如: 16000, 44100, 48000

mFormatID

AudioFormatID 数据流的格式, 如

kAudioFormatLinearPCM               = 'lpcm',
kAudioFormatMPEG4AAC                = 'aac ',
kAudioFormatMPEGLayer3              = '.mp3',

AudioFormatFlags

描述AudioBufferList的格式

    kAudioFormatFlagIsFloat                     = (1U << 0),     // 0x1
    kAudioFormatFlagIsBigEndian                 = (1U << 1),     // 0x2
    kAudioFormatFlagIsSignedInteger             = (1U << 2),     // 0x4
    kAudioFormatFlagIsPacked                    = (1U << 3),     // 0x8
    kAudioFormatFlagIsNonInterleaved            = (1U << 5),     // 0x20

kAudioFormatFlagIsFloat

是否是浮点数, 没有设置,默认是 int 类型

kAudioFormatFlagIsBigEndian

是否是大端, 没有设置,默认是小端

kAudioFormatFlagIsSignedInteger

是否是 signed int, 没有设置,默认是 unsigned int

kAudioFormatFlagIsPacked

是否mBitsPerChannel 会占满整个通道,如果没有占满, 就会依高位对齐或低位对齐。
没有设置的时候,满足 ((mBitsPerSample / 8) * mChannelsPerFrame) == mBytesPerFrame 的条件,默认会设置此选项。

kAudioFormatFlagIsNonInterleaved

是否是平面类型,是否是交错类型。

双声道的情况

mChannelsPerFrame

描述音频通道的个数。单声道 1, 双声道为 2, 多声道 为 n

In audio data a frame is one sample across all channels. In non-interleaved
audio, the per frame fields identify one channel. In interleaved audio, the per
frame fields identify the set of n channels. In uncompressed audio, a Packet is
one frame, (mFramesPerPacket == 1). In compressed audio, a Packet is an
indivisible chunk of compressed data, for example an AAC packet will contain
1024 sample frames.

mBitsPerChannel

每个通道的位深 8, 16, 32等。

mBytesPerFrame

每个数据帧的字节。例如: kAudioFormatFlagIsSignedInteger 16 , 每个通道 2 byte

mFramesPerPacket

每个数据包,包含的采样数

pcm 类型

mBytesPerPacket

每个数据包,包含的字节数

pcm 类型 mBytesPerPacket = mFramesPerPacket * mBytesPerFrame

例 1

+ (AudioStreamBasicDescription)intFormatWithNumberOfChannels:(UInt32)channels
                                                  sampleRate:(float)sampleRate
                                               isInterleaved:(BOOL)isInterleaved
{
    AudioStreamBasicDescription asbd;
    UInt32 byteSize = 2;
    asbd.mChannelsPerFrame = channels;
    asbd.mBitsPerChannel = 8 * byteSize;
    if (isInterleaved) {
        asbd.mBytesPerFrame = asbd.mChannelsPerFrame * byteSize;
    } else {
        asbd.mBytesPerFrame = byteSize;
    }

    asbd.mFramesPerPacket = 1;
    asbd.mBytesPerPacket = asbd.mFramesPerPacket * asbd.mBytesPerFrame;

    if (isInterleaved) {
        asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
    } else {
        asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsNonInterleaved;
    }

    asbd.mFormatID = kAudioFormatLinearPCM;
    asbd.mSampleRate = sampleRate;
    asbd.mReserved = 0;
    return asbd;
}

例 2

+ (AudioStreamBasicDescription)floatFormatWithNumberOfChannels:(UInt32)channels
                                                    sampleRate:(float)sampleRate
                                                 isInterleaved:(BOOL)isInterleaved
{
    AudioStreamBasicDescription asbd;
    UInt32 floatByteSize = sizeof(float);
    asbd.mChannelsPerFrame = channels;
    asbd.mBitsPerChannel = 8 * floatByteSize;
    if (isInterleaved) {
        asbd.mBytesPerFrame = asbd.mChannelsPerFrame * floatByteSize;
    } else {
        asbd.mBytesPerFrame = floatByteSize;
    }

    asbd.mFramesPerPacket = 1;
    asbd.mBytesPerPacket = asbd.mFramesPerPacket * asbd.mBytesPerFrame;

    if (isInterleaved) {
        asbd.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked;
    } else {
        asbd.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsNonInterleaved;
    }

    asbd.mFormatID = kAudioFormatLinearPCM;
    asbd.mSampleRate = sampleRate;
    asbd.mReserved = 0;
    return asbd;
}
上一篇 下一篇

猜你喜欢

热点阅读