我想從應用程序包中讀取聲音文件,將其複製,以最大音量級別(增益值或峯值功率,我不確定其技術名稱)播放,然後再將它作爲另一個文件寫入該包。音頻處理:使用音量級別
我做了複製和寫作部分。生成的文件與輸入文件相同。我在AudioToolbox框架中使用AudioFile服務的AudioFileReadBytes()和AudioFileWriteBytes()函數來做到這一點。因此,我有輸入文件的字節和其音頻數據格式(通過使用AudioFileGetProperty()與kAudioFilePropertyDataFormat),但我找不到在這些原始文件的最大音量級別播放變量。
爲了闡明我的目的,我試圖生成另一個音量級別相對於原始音量增加或減少的聲音文件,因此我不在乎用戶設置的系統音量級別,或者iOS版。
這可能與我提到的框架有關嗎?如果沒有,是否有其他建議?
感謝
編輯: 通過山姆對於一些音頻基礎知識答案走,我決定擴大與其他可替代的問題。
我可以使用AudioQueue服務將現有聲音文件(它在包中)錄製到另一個文件中,並在錄製階段使用音量級別(在框架的幫助下)播放?
更新: 這裏就是我如何讀取輸入文件寫入輸出。下面的代碼降低了「某些」幅度值的聲級,但有很多噪音。有趣的是,如果我選擇0.5作爲幅度值,它會增加聲音級別而不是降低它,但是當我使用0.1作爲幅度值時,會降低聲音。這兩種情況都涉及干擾噪音。我認爲這就是爲什麼藝術正在談論正常化,但我不知道正常化。
AudioFileID inFileID;
CFURLRef inURL = [self inSoundURL];
AudioFileOpenURL(inURL, kAudioFileReadPermission, kAudioFileWAVEType, &inFileID)
UInt32 fileSize = [self audioFileSize:inFileID];
Float32 *inData = malloc(fileSize * sizeof(Float32)); //I used Float32 type with jv42's suggestion
AudioFileReadBytes(inFileID, false, 0, &fileSize, inData);
Float32 *outData = malloc(fileSize * sizeof(Float32));
//Art's suggestion, if I've correctly understood him
float ampScale = 0.5f; //this will reduce the 'volume' by -6db
for (int i = 0; i < fileSize; i++) {
outData[i] = (Float32)(inData[i] * ampScale);
}
AudioStreamBasicDescription outDataFormat = {0};
[self audioDataFormat:inFileID];
AudioFileID outFileID;
CFURLRef outURL = [self outSoundURL];
AudioFileCreateWithURL(outURL, kAudioFileWAVEType, &outDataFormat, kAudioFileFlags_EraseFile, &outFileID)
AudioFileWriteBytes(outFileID, false, 0, &fileSize, outData);
AudioFileClose(outFileID);
AudioFileClose(inFileID);
感謝藝術,我根據您的建議更新了我的代碼和問題,但這導致了其他問題。也許我弄錯了,但如果你可以用代碼片段來看看更新後的問題,它會是完美的。 – cocoatoucher 2010-10-21 13:57:47
我已經編輯了我的答案,並解釋了爲什麼代碼不起作用以及代碼的一個示例。 – 2010-10-21 15:43:56
藝術,我很感謝這個答案。您不僅向我提供了代碼,還幫助我瞭解發生了什麼。非常感謝!請繼續分享。也感謝其他人。 – cocoatoucher 2010-10-21 17:57:20