2013-07-04 95 views
1

從WAV文件獲取原始音頻樣本(理想情況下爲浮點數)而不修改文件採樣率的最簡單方法是什麼?從WAV文件中讀取原始音頻樣本

我跟着https://stackoverflow.com/a/4572990/1116197的例子,但我不知道如何從buffer提取浮動。只是做buffer[n]不起作用。據basicDescription.mFormatFlags該文件是kAudioFormatFlagIsSignedIntegerkAudioFormatFlagIsPacked

我已經成功使用ExtAudioFileRef,而不是做提取數據(如float S),但是這需要指定要輸出的格式,但我不希望改變採樣率。例如你可以做

AudioStreamBasicDescription audioFormat; 
audioFormat.mSampleRate = 44100; 
audioFormat.mFormatID = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; 
audioFormat.mBitsPerChannel = sizeof(Float32) * 8; 
audioFormat.mChannelsPerFrame = 1; // Mono 
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(Float32); // == sizeof(Float32) 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame; // = sizeof(Float32) 


ExtAudioFileSetProperty(
    fileRef, 
    kExtAudioFileProperty_ClientDataFormat, 
    sizeof (AudioStreamBasicDescription), 
    &audioFormat 
), 

我想我可以獲取該文件AudioStreamBasicDescription首先使用使用ExtAudioFileGetProperty,但根據蘋果文檔(http://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html)屬性ID我需要的是kExtAudioFileProperty_FileDataFormat這是隻讀 - A file’s data format. Value is a read-only AudioStreamBasicDescription struct. - 所以我不能修改它添加mFormatFlags = kLinearPCMFormatFlagIsFloat

所以我想我可以做到上述,並創建一個新的ASBD和複製一切,但它似乎是非常複雜,所以我想知道如果我吠叫錯了樹完全?有沒有更簡單的方法來做到這一點?

回答

0

正如您發現的那樣,您需要首先獲取文件的數據格式,然後以文件的採樣率創建客戶端數據格式,但需要使用所需的樣本量和類型。它真的歸結爲一個額外的函數調用,這在Core Audio的世界中並不多。

+0

我會用這種方法,謝謝! – Mark

2

最常見的.WAV文件只是一個44字節的標題,其後是16位或2字節的小端原始PCM音頻採樣。如果您有一種類型的文件,在小端CPU(x86,ARM等)上,您只需跳過前44個字節,然後讀取並將短整型轉換爲浮點型。

+2

Apple不使用44字節標題 –

+0

iOS存儲,播放和讀取44字節標題RIFF/.wav文件就好了。它可能不會以該格式創建文件,具體取決於API,但這是一個不同的問題。 – hotpaw2

相關問題