为特定的 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

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

我打算之后转换为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 缓冲区获取正确的数字数据类型转换的主要内容,如果未能解决你的问题,请参考以下文章

求ASP字符串转数字格式?

如何从以正确列类型传递的 SQL 服务器获取数据

javascript 字符串怎么转成数字类型

oracle 字符型中文日期怎么转换成日期型

将函数限制为特定数据类型的正确方法

MySQL把字符串转成数字类型