我使用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
我应该使用哪种类型的数据转换缓冲区?我已经尝试使用Float32
,SInt32
,但他们不是。
我打算之后转换为SInt16
,但如果我没有首先获得正确的样本格式,我就无法做到。
提前致谢。
答案 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");
}
}