2011-07-15 113 views
3

我想加載本地.caf音頻文件並反轉音頻(向後播放)。我已經收集到,我基本上需要翻轉從thisiOS音頻處理 - 向後播放本地.caf文件

職位緩衝區數據陣列然而,我不知道如何從給定的音頻文件訪問此緩衝區數據。我用AVaudioPlayer和ObjectAL(一個obj-c openAL庫)播放聲音有一點經驗,但我不知道如何訪問像這個緩衝區數據數組這樣的較低級別的東西。

我可以請一個我如何去訪問該數組的例子嗎?

+2

可能的重複http://stackoverflow.com/questions/6593118/how-to-reverse-an-audio-file < - 注意這個問題如何指定標題中的任務 –

回答

1

我認爲這個示例代碼可以幫助你。

Mixer Host Sample Code

它會加載從將兩個CAF文件和播放它。它包含一個函數調用readAudioFilesIntoMemory正如你所說,它將一個caf文件加載到數據數組中。

整個課程的核心音頻的例子,我希望它可以幫助你:)

+1

使用MixerHost代碼的唯一問題readAudioFilesIntoMemory函數會將完整的音頻文件讀入手機內存。對於大型音頻文件,這可能是不可能的。您可以使用循環緩衝區來只讀取文件的一部分到內存。我已經分享了一個簡單的例子[這裏](https://github.com/iitotoro/BufferedAudioPlayer) – Totoro

0

您可以使用libsox爲iphone框架可以輕鬆地將音頻效果。

它包括一個示例項目,顯示如何做到這一點。

libsox ios

3

我有一個示例應用程序,它記錄哪些用戶說和向後播放它們的工作。我已經使用CoreAudio來實現這一點。鏈接到應用程序代碼。

由於每個樣本的大小爲16位(2字節)(單聲道)。您可以一次加載每個樣本,方法是從錄製結束開始並向後讀取,將其複製到不同的緩衝區中。當你到達數據的開始時,你已經轉換了數據並且播放將被顛倒過來。

// set up output file 
AudioFileID outputAudioFile; 

AudioStreamBasicDescription myPCMFormat; 
myPCMFormat.mSampleRate = 16000.00; 
myPCMFormat.mFormatID = kAudioFormatLinearPCM ; 
myPCMFormat.mFormatFlags = kAudioFormatFlagsCanonical; 
myPCMFormat.mChannelsPerFrame = 1; 
myPCMFormat.mFramesPerPacket = 1; 
myPCMFormat.mBitsPerChannel = 16; 
myPCMFormat.mBytesPerPacket = 2; 
myPCMFormat.mBytesPerFrame = 2; 


AudioFileCreateWithURL((__bridge CFURLRef)self.flippedAudioUrl, 
        kAudioFileCAFType, 
        &myPCMFormat, 
        kAudioFileFlags_EraseFile, 
        &outputAudioFile); 
// set up input file 
AudioFileID inputAudioFile; 
OSStatus theErr = noErr; 
UInt64 fileDataSize = 0; 

AudioStreamBasicDescription theFileFormat; 
UInt32 thePropertySize = sizeof(theFileFormat); 

theErr = AudioFileOpenURL((__bridge CFURLRef)self.recordedAudioUrl,kAudioFileReadPermission, 0, &inputAudioFile); 

thePropertySize = sizeof(fileDataSize); 
theErr = AudioFileGetProperty(inputAudioFile, kAudioFilePropertyAudioDataByteCount, &thePropertySize, &fileDataSize); 

UInt32 dataSize = fileDataSize; 
void* theData = malloc(dataSize); 

//Read data into buffer 
UInt32 readPoint = dataSize; 
UInt32 writePoint = 0; 
while(readPoint > 0) 
{ 
    UInt32 bytesToRead = 2; 

AudioFileReadBytes(inputAudioFile, false, readPoint, &bytesToRead, theData); 
AudioFileWriteBytes(outputAudioFile, false, writePoint, &bytesToRead, theData); 

writePoint += 2; 
readPoint -= 2; 
} 

free(theData); 
AudioFileClose(inputAudioFile); 
AudioFileClose(outputAudioFile); 
+1

錄音後音頻不反轉,音頻文件無法播放 – Mehul

4

你的問題簡化爲同樣的問題描述here,這是由P-i在您的問題下方的評論鏈接。 Kiran回答了這個問題,並在這裏重新發布了他的答案。基蘭的答案是準確的,但是你可能需要一些更多的細節來決定如何繼續,因爲你從一個CAF文件開始。

最簡單的音頻文件格式,線性脈衝編碼調製(LPCM),最容易讀取逐字節或樣本採樣。這意味着它是最容易倒過來的。基蘭的解決方案就是這麼做的。

但是,CAF格式是一種容器/包裝格式。雖然您的CAF文件可能包含WAV文件,但它也可能包含無法以相同方式操作的壓縮文件格式。

您應該首先考慮將CAF文件轉換爲WAV,然後如其他解決方案中所示將其倒轉。有各種圖書館會爲你做這種轉換,但一個好的開始可能是AudioToolbox framework,其中包括Audio Converter Services。或者,如果您可以從一開始就使用WAV文件格式,則可以防止轉換爲WAV。

如果你發現Kiran的示例代碼給你一個錯誤(核心音頻是挑剔的),你可能需要知道更多。開始的好地方是Core Audio 'Bible', "Learning Core Audio",由Chris Adamson和凱文阿維拉編寫。這本書使用大量的樣本來建立你對數字聲音的瞭解。你還應該看看Michael Tyson,誰開始在github上的Amazing Audio Engine項目寫的東西,並寫了AudioBus。