iOS音频操作-向后播放本地.caf文件

iOS音频操作-向后播放本地.caf文件,ios,iphone,core-audio,Ios,Iphone,Core Audio,我想加载一个本地的.caf音频文件并反转音频(向后播放)。我发现我基本上需要从如下帖子中翻转缓冲区数据数组 但是,我不确定如何从给定的音频文件访问此缓冲区数据。我有一点使用AVaudioPlayer和ObjectAL(一个obj-c openAL库)播放声音的经验,但我不知道如何访问像这个缓冲区数据数组这样的较低级别的东西 我能举个例子说明我将如何访问该阵列吗?为什么不让CoreAudio的AudioConverter为您做呢?看到这篇关于苹果的帖子,我想这个示例代码可以帮助你 它将从捆绑包中

我想加载一个本地的.caf音频文件并反转音频(向后播放)。我发现我基本上需要从如下帖子中翻转缓冲区数据数组

但是,我不确定如何从给定的音频文件访问此缓冲区数据。我有一点使用AVaudioPlayer和ObjectAL(一个obj-c openAL库)播放声音的经验,但我不知道如何访问像这个缓冲区数据数组这样的较低级别的东西


我能举个例子说明我将如何访问该阵列吗?

为什么不让CoreAudio的AudioConverter为您做呢?看到这篇关于苹果的帖子,我想这个示例代码可以帮助你

它将从捆绑包中加载两个caf文件并播放。它包含一个函数调用readAudioFilesIntoMemory,正如您所说,它正在将caf文件加载到数据数组中


整个程序是核心音频的一个示例,我希望它能帮助您:)

您可以使用libsox for iphone框架轻松应用音频效果

它包括一个示例项目,演示了如何执行此操作


我开发了一个示例应用程序,它记录用户所说的内容并反向播放。我使用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);

您的问题简化为所描述的相同问题,该问题在您问题下的评论中通过链接。回答了这个问题,并在这里为您重新发布了他的答案。Kiran的回答是准确的,但您可能需要更多的细节才能决定如何继续,因为您从CAF文件开始

最简单的音频文件格式,线性脉冲编码调制(LPCM),是最容易逐字节或逐样本读取的。这意味着它是最容易反转的。基兰的解决方案就是这样

但是,CAF格式是一种容器/包装器格式。虽然CAF文件可能包含WAV文件,但也可能包含无法以相同方式操作的压缩文件格式

您应该考虑首先将CAF文件转换为WAV,然后将其反转,如另一个解决方案中所示。有各种库可以为您进行此转换,但一个好的起点可能是,它包括。或者,如果可以从一开始就使用WAV文件格式,则可以避免转换为WAV


如果你发现Kiran的示例代码给了你一个错误(核心音频很挑剔),你可能需要知道更多。一个很好的开始是和凯文·阿维拉一起写的。那本书通过大量的样本建立了你对数字声音的知识。您还应该查看github上的项目发起人、AudioBus的作者所写的任何内容

使用MixerHost代码的唯一问题是readAudioFilesIntoMemory函数可能会将完整的音频文件读取到手机存储器中。对于大型音频文件,这可能是不可能的。您可以使用循环缓冲区将文件的一部分只读到内存中。我分享了一个简单的例子,录音后音频不反转,音频文件不能播放