我想加載本地.caf音頻文件並反轉音頻(向後播放)。我已經收集到,我基本上需要翻轉從thisiOS音頻處理 - 向後播放本地.caf文件
職位緩衝區數據陣列然而,我不知道如何從給定的音頻文件訪問此緩衝區數據。我用AVaudioPlayer和ObjectAL(一個obj-c openAL庫)播放聲音有一點經驗,但我不知道如何訪問像這個緩衝區數據數組這樣的較低級別的東西。
我可以請一個我如何去訪問該數組的例子嗎?
我想加載本地.caf音頻文件並反轉音頻(向後播放)。我已經收集到,我基本上需要翻轉從thisiOS音頻處理 - 向後播放本地.caf文件
職位緩衝區數據陣列然而,我不知道如何從給定的音頻文件訪問此緩衝區數據。我用AVaudioPlayer和ObjectAL(一個obj-c openAL庫)播放聲音有一點經驗,但我不知道如何訪問像這個緩衝區數據數組這樣的較低級別的東西。
我可以請一個我如何去訪問該數組的例子嗎?
爲什麼不讓CoreAudio的AudioConverter爲您做到這一點?看到這篇文章約"Getting PCM from MP3/AAC/ALAC File",和蘋果的Core Audio Essentials
我認爲這個示例代碼可以幫助你。
它會加載從將兩個CAF文件和播放它。它包含一個函數調用readAudioFilesIntoMemory正如你所說,它將一個caf文件加載到數據數組中。
整個課程的核心音頻的例子,我希望它可以幫助你:)
使用MixerHost代碼的唯一問題readAudioFilesIntoMemory函數會將完整的音頻文件讀入手機內存。對於大型音頻文件,這可能是不可能的。您可以使用循環緩衝區來只讀取文件的一部分到內存。我已經分享了一個簡單的例子[這裏](https://github.com/iitotoro/BufferedAudioPlayer) – Totoro
我有一個示例應用程序,它記錄哪些用戶說和向後播放它們的工作。我已經使用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);
錄音後音頻不反轉,音頻文件無法播放 – Mehul
你的問題簡化爲同樣的問題描述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。
可能的重複http://stackoverflow.com/questions/6593118/how-to-reverse-an-audio-file < - 注意這個問題如何指定標題中的任務 –