2011-03-22 27 views
1

我正在研究一個聲音分析器程序,並且我正在尋找將音頻數據轉換爲基於其每幀幅度的整數(或浮點數)數組,這是算法所必需的我正在使用。我有應用程序將聲音錄製到.caf中。如何將音頻轉換爲iPhone上的整數陣列

任何幫助都會很棒,因爲這個主題很少。

回答

1

看看ExtAudioFile。下面是如何使用它來讀取整數樣本粗略例如:

-(void)setupStreamReader 
     { 
     CAStreamBasicDescription dstFormat, srcFormat; 
     UInt32 sizeZ = sizeof(srcFormat); 
     SInt64 sizeN = 0; 
     UInt32 sizeofN = sizeof(sizeN); 
     ExtAudioFileGetProperty(file, kExtAudioFileProperty_FileDataFormat, &sizeZ, &srcFormat); 
     ExtAudioFileGetProperty(file, kExtAudioFileProperty_FileLengthFrames, &sizeofN, &sizeN); 
     size = sizeN*4; 

     dstFormat.mSampleRate = 44100; // set sample rate 
     dstFormat.mFormatID = kAudioFormatLinearPCM; 
     dstFormat.mChannelsPerFrame = 2; 
     dstFormat.mBitsPerChannel = 16; 
     dstFormat.mBytesPerPacket = dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame; 
     dstFormat.mFramesPerPacket = 1; 
     dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger; // little-endian 

     sizeZ = sizeof(dstFormat); 
     ExtAudioFileSetProperty(file, kExtAudioFileProperty_ClientDataFormat, sizeZ, &dstFormat); 
     } 

,然後將該獲得實際的短整型數組

-(void)getBytes:(short*)buffer range:(NSRange)range 
{ 
SInt64 off = range.location/4; 
ExtAudioFileSeek(file, off); 

AudioBufferList fillBufList; 
fillBufList.mNumberBuffers = 1; 
fillBufList.mBuffers[0].mNumberChannels = 2; 
fillBufList.mBuffers[0].mDataByteSize = range.length; 
fillBufList.mBuffers[0].mData = buffer; 
UInt32 frames = range.length/2; 
ExtAudioFileRead(file, &frames, &fillBufList); 
} 

文件是一個ExtAudioFileRef在頭部聲明。

相關問題