我想从应用程序包中读取声音文件,将其复制,以最大音量级别(增益值或峰值功率,我不确定其技术名称)播放,然后再将它作为另一个文件写入该包。音频处理:使用音量级别
我做了复制和写作部分。生成的文件与输入文件相同。我在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