2

我使用 Apple 的 CoreAudio 音频单元 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

我应该使用哪种类型的数据来转换缓冲区?我已经尝试过Float32, SInt32,但不是这样。

我打算在SInt16之后进行转换,但如果我没有先获得样本的正确格式,我就无法做到这一点。

提前致谢。

4

3 回答 3

3

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

于 2012-10-02T08:26:31.843 回答
1

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

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

为什么铸造Float32不起作用?

于 2012-09-07T23:33:46.100 回答
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");
        }

}

于 2015-06-09T10:24:26.893 回答