为特定的 ASBD 缓冲区获取正确的数字数据类型转换
Posted
技术标签:
【中文标题】为特定的 ASBD 缓冲区获取正确的数字数据类型转换【英文标题】:Getting the right numeric data type cast for a specific ASBD buffer 【发布时间】:2012-09-05 04:18:33 【问题描述】:我有一个AudioBuffer
,它的void *mData
充满了使用Apple 的CoreAudio 音频单元API 新鲜渲染的音频样本,但是我在获取正确格式的样本时遇到了问题。该缓冲区的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
,但如果我没有先获得正确的样本格式,我就无法做到。
提前致谢。
【问题讨论】:
【参考方案1】:根据我的经验,ios 不会直接向您提供浮点数据。相反,您应该请求 SInt16
(因此,也将 mBitsPerChannel
设置为 16),然后通过将每个数字除以 32767 手动将整数数据转换为浮点数。
【讨论】:
【参考方案2】:基于该 ASBD,数据是立体声非交错 32 位浮点数,这是 Mac OS X 上音频单元的规范格式。
您应该能够将mData
字段转换为float *
并获得一个音频数据通道。完整的立体声音频应包含在具有两个缓冲区的 AudioBufferList
中,每个缓冲区包含一个通道。
为什么投射到Float32
不起作用?
【讨论】:
【参考方案3】:检查此代码:
- (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");
【讨论】:
以上是关于为特定的 ASBD 缓冲区获取正确的数字数据类型转换的主要内容,如果未能解决你的问题,请参考以下文章