簡體   English   中英

從WAV文件讀取原始音頻樣本

[英]Reading raw audio samples from WAV files

從WAV文件中獲取原始音頻樣本(理想情況下為浮動)的最簡單方法是什么,而無需修改文件的采樣率?

我已經按照https://stackoverflow.com/a/4572990/1116197上的示例進行操作,但是我不確定如何從buffer提取浮點數。 僅執行buffer[n]不起作用。 根據basicDescription.mFormatFlags ,文件為kAudioFormatFlagIsSignedIntegerkAudioFormatFlagIsPacked

我已經設法使用ExtAudioFileRef提取數據(作為float ),但是這需要指定所需的輸出格式,但是我不想更改sampleRate。 例如你可以

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
),

我想我可以先使用ExtAudioFileGetProperty來獲取AudioStreamBasicDescription文件,但是根據Apple文檔( 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. A file's data format. Value is a read-only AudioStreamBasicDescription struct. -因此我無法對其進行修改,添加mFormatFlags = kLinearPCMFormatFlagIsFloat

因此,我想我可以執行上述操作,然后創建一個新的ASBD並復制所有內容,但這一切似乎都非常復雜,所以我想知道我是否完全在樹錯了樹嗎? 有沒有更簡單的方法可以做到這一點?

最常見的.WAV文件只是一個44字節的標頭,后跟16位或2字節的Little-endian原始PCM音頻樣本。 如果您擁有這些類型的文件之一,則在低端CPU(x86,ARM等)上,只需跳過前44個字節,然后讀取並將short int轉換為float。

如您所見,要執行此操作,您首先需要獲取文件的數據格式,然后以文件的采樣率創建具有所需采樣大小和類型的客戶端數據格式。 它實際上歸結為一個額外的函數調用,在Core Audio的世界中並沒有多少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM