首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS音频操作-反向播放本地.caf文件

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

Stack Overflow用户
提问于 2011-07-15 21:51:15
回答 5查看 3.9K关注 0票数 3

我想要加载一个本地.caf音频文件并反转音频(向后播放)。我已经了解到,基本上我需要从像this这样的posts中翻转缓冲区数据的数组

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

我可以得到一个如何访问该数组的示例吗?

EN

回答 5

Stack Overflow用户

发布于 2013-10-10 06:41:08

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

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

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

您应该考虑首先将CAF文件转换为WAV,然后按照另一个解决方案中所示进行反向转换。有各种库可以为您完成此转换,但从包含Audio Converter ServicesAudioToolbox framework开始可能是个不错的选择。或者,如果您可以从一开始就使用WAV文件格式,则可以避免需要转换为WAV。

如果你发现Kiran的示例代码给你一个错误(Core Audio很挑剔),你可能需要知道更多。由Chris Adamson和Kevin Avila编写的Core Audio 'Bible', "Learning Core Audio"是一个很好的起点。这本书用很好的例子建立了你的数字声音知识。你也应该看看Michael Tyson写的任何东西,他在github上启动了Amazing Audio Engine项目,并编写了AudioBus。

票数 4
EN

Stack Overflow用户

发布于 2013-04-05 18:19:27

我在一个示例应用程序上工作,它记录用户所说的话并向后播放它们。我已经使用CoreAudio实现了这一点。链接到应用程序代码。

因为每个样本的大小是16位(2字节)(单声道)。您可以一次加载每个样本,方法是将其复制到不同的缓冲区中,方法是从录制的末尾开始并向后读取。当您到达数据的开头时,您已经颠倒了数据,并且播放将被颠倒。

代码语言:javascript
复制
// 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);
票数 3
EN

Stack Overflow用户

发布于 2012-05-29 17:10:41

我认为这个示例代码可能会对您有所帮助。

Mixer Host Sample Code

它将从捆绑包中加载两个caf文件并播放它。它包含一个名为readAudioFilesIntoMemory的函数,该函数将caf文件加载到数据数组中。

整个程序都是一个核心音频的例子,希望能对你有所帮助:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6707998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档