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

时间:2011-07-15 13:51:15

标签: ios iphone core-audio

我想加载本地.caf音频文件并反转音频(向后播放)。我已经收集到了,我基本上需要从this

这样的帖子中翻转一系列缓冲区数据

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

我可以举个例子来了解如何访问该阵列吗?

5 个答案:

答案 0 :(得分:4)

您的问题会缩小到here所描述的同一问题,该问题在您提问的评论中由P-i关联。 Kiran回答了这个问题,并在此重新发布了他的回答。 Kiran的答案是准确的,但您可能需要更多细节才能决定如何继续,因为您正在使用CAF文件。

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

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

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

如果您发现Kiran的示例代码会给您一个错误(Core Audio很挑剔),您可能需要了解更多信息。一个很好的起点是由Core Audio 'Bible', "Learning Core Audio"和Kevin Avila撰写的Chris Adamson。那本书使用很棒的样本来建立你对数字声音的了解。您还应该查看由Michael Tyson编写的任何内容,他们在github上启动了Amazing Audio Engine项目,并编写了AudioBus。

答案 1 :(得分:3)

我参与了一个示例应用,它会记录用户说的内容并向后播放。我使用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);

答案 2 :(得分:1)

我认为此示例代码可以为您提供帮助。

Mixer Host Sample Code

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

整个程序是核心音频的一个例子,我希望它可以帮助你:)

答案 3 :(得分:0)

为什么不让CoreAudio Audio Converter为您做到这一点?请参阅此帖关于"Getting PCM from MP3/AAC/ALAC File"和Apple的Core Audio Essentials

答案 4 :(得分:0)

您可以使用libsox for iphone framework轻松应用音频效果。

它包含一个展示如何操作的示例项目。

libsox ios