为特定的ASBD缓冲区获取正确的数值数据类型

时间:2012-09-05 04:18:33

标签: ios audio core-audio audio-recording audiounit

我使用Apple的CoreAudio Audio Unit API获得了AudioBuffer void *mData个新鲜渲染的音频样本,但我在使用正确格式的样本时遇到问题。所述缓冲区的ASBD如下:

Float64 mSampleRate        44100
UInt32  mFormatID          1819304813
UInt32  mFormatFlags       41
UInt32  mBytesPerPacket    4
UInt32  mFramesPerPacket   1
UInt32  mBytesPerFrame     4
UInt32  mChannelsPerFrame  2
UInt32  mBitsPerChannel    32
UInt32  mReserved          0

我通过调试应用程序并执行AudioUnitGetProperty(rioUnit, kAudioUnitProperty_StreamFormat, ...)调用来实现此目的。 mFormatFlags字段意味着以下标志(我不知道任何正式的解码方法,我只是尝试了kAudioUnitFlags的不同组合,直到我得到41):

kAudioFormatFlagIsNonInterleaved | kAudioFormatFlagIsPacked | kAudioFormatFlagIsFloat

我应该使用哪种类型的数据转换缓冲区?我已经尝试使用Float32SInt32,但他们不是。

我打算之后转换为SInt16,但如果我没有首先获得正确的样本格式,我就无法做到。

提前致谢。

3 个答案:

答案 0 :(得分:3)

根据我的经验,iOS不会直接向您提供浮点数据。相反,你应该要求SInt16(因此,将mBitsPerChannel设置为16)然后通过将每个数字除以32767手动将整数数据转换为浮点数。

答案 1 :(得分:1)

基于该ASBD,数据是立体声非交错32位浮点数,这是Mac OS X上音频单元的规范格式。

您应该能够将mData字段转换为float *并获取一个音频数据频道。完整的立体声音频应包含在AudioBufferList中,每个缓冲区包含一个通道。

为什么投射到Float32不起作用?

答案 2 :(得分:0)

检查此代码:

   - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
   fromConnection:(AVCaptureConnection *)connection

       //calback function

        const AudioStreamBasicDescription *audioDescription = CMAudioFormatDescriptionGetStreamBasicDescription(CMSampleBufferGetFormatDescription(sampleBuffer));

        int sampleRate        = (int)audioDescription ->mSampleRate;
        int channelsPerFrame  = (int)audioDescription ->mChannelsPerFrame;
        UInt32 formatFlag     =  audioDescription ->mFormatFlags;

        if (formatFlag & kAudioFormatFlagIsFloat) {
          NSLog(@"IS FLOAT");

        } else if ( formatFlag & kAudioFormatFlagIsSignedInteger) {
          NSLog(@"IS Signed Integer");
        }

}