我想要加载一个本地.caf音频文件并反转音频(向后播放)。我已经了解到,基本上我需要从像this这样的posts中翻转缓冲区数据的数组
但是,我不确定如何从给定的音频文件中访问此缓冲区数据。我有一点使用AVaudioPlayer和ObjectAL(一个obj-c openAL库)回放声音的经验,但我不知道如何访问像这个缓冲区数据数组这样的较低级别的数据。
我可以得到一个如何访问该数组的示例吗?
发布于 2013-10-10 06:41:08
您的问题简化为描述here的相同问题,这是由P-i在您的问题下的评论中链接的。Kiran回答了这个问题,并在这里为您重新发布了他的答案。Kiran的回答是准确的,但您可能需要更多细节才能决定如何继续,因为您是从CAF文件开始的。
最简单的音频文件格式,线性脉冲编码调制(LPCM),是最容易读取的逐字节或采样。这意味着它是最容易逆转的。Kiran的解决方案就是这样做的。
然而,CAF格式是容器/包装器格式。虽然您的CAF文件可以包含WAV文件,但它也可以包含无法以相同方式处理的压缩文件格式。
您应该考虑首先将CAF文件转换为WAV,然后按照另一个解决方案中所示进行反向转换。有各种库可以为您完成此转换,但从包含Audio Converter Services的AudioToolbox framework开始可能是个不错的选择。或者,如果您可以从一开始就使用WAV文件格式,则可以避免需要转换为WAV。
如果你发现Kiran的示例代码给你一个错误(Core Audio很挑剔),你可能需要知道更多。由Chris Adamson和Kevin Avila编写的Core Audio 'Bible', "Learning Core Audio"是一个很好的起点。这本书用很好的例子建立了你的数字声音知识。你也应该看看Michael Tyson写的任何东西,他在github上启动了Amazing Audio Engine项目,并编写了AudioBus。
发布于 2013-04-05 18:19:27
我在一个示例应用程序上工作,它记录用户所说的话并向后播放它们。我已经使用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);发布于 2012-05-29 17:10:41
我认为这个示例代码可能会对您有所帮助。
它将从捆绑包中加载两个caf文件并播放它。它包含一个名为readAudioFilesIntoMemory的函数,该函数将caf文件加载到数据数组中。
整个程序都是一个核心音频的例子,希望能对你有所帮助:)
https://stackoverflow.com/questions/6707998
复制相似问题