我想要的只是读取一个 caf 文件并将其写入另一个文件,希望也许我可以操作它,例如将多个文件合并为一个文件,或修剪。所以我找到了 Apples 自己的iPhoneExtAudioFileConvertTest示例,它看起来非常具有挑战性,但我认为一旦我将这些部分放入我自己的项目中,我就可以使用它,这被证明是相当麻烦的。
现在,经过几个不眠之夜的信息挖掘和大量的反复试验;我相信我已经设法在我自己的项目中使用了iPhoneExtAudioFileConvertTest示例。我想我会发布这个来拯救一个程序员同事一些睡眠。
脚步:
- 将iPhoneExtAudioFileConvertTest示例中的iPublicUtility文件夹和ExtAudioFileConvert.cpp文件添加到我的项目中。
- 将 3 个新的 .cpp 文件的扩展名重命名为 .mm(.h 文件保持不变)。这允许 xcode 将 cpp 文件视为目标 c++ 文件。
- ExtAudioFileConvert.mm
- iPublicUtility/CAStreamBasicDescription.mm
- iPublicUtility/CAXException.mm
- 在我计划调用该方法的myViewController.m
DoConvertFile(sourceURL, destinationURL, outputFormat, sampleRate);
(UIViewController) 类中,我添加了一行以使 DoConvertFile 方法可见extern OSStatus DoConvertFile(CFURLRef sourceURL, CFURLRef destinationURL, OSType outputFormat, Float64 outputSampleRate);
- 还将 myViewController.m重命名为 myViewController.mm,因为它使用 .cpp 文件来调用 convertFile 方法
- 在我的目标/构建设置下的项目设置中,我搜索了键“标题搜索路径”并添加了以下值/Developer/Extras/CoreAudio/PublicUtility/ $(inherited)没有此行,编译器会给我超过 30错误,例如“DebugPrintfFile ”未在此范围内声明*
- 我注意到该示例在应用程序委托中也有代码
- 所以我直接从示例的appDelegate复制了2个方法的代码到我自己的appDelegate中,namly
static void interruptionListener(void *inClientData, UInt32 inInterruption)
static void propertyListener(void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData)
#import
并在原始语句 之后添加以下 4 行- #import "CAXException.h"
extern void ThreadStateInitalize();
extern void ThreadStateBeginInterruption();
extern void ThreadStateEndInterruption();
- 当然也将示例中的代码添加
applicationDidFinishLaunching
到我的didFinishLaunchingWithOptions
- 并再次将我的 appDelegate.m 重命名为 appDelegate.mm
- 所以我直接从示例的appDelegate复制了2个方法的代码到我自己的appDelegate中,namly
现在,当我编译时,我没有收到任何错误,并且运行时只有在我注释掉 ExtAudioFileConvert.mm 中的断言时才有效
// in this sample we should never be on the main thread here
assert(![NSThread isMainThread]);
同样在启动时,我收到一个不会导致任何问题的错误,但我更愿意将其删除。任何人 ?
Error: couldn't set audio category (-50)
这似乎来自我的 appDelegate 中的这个调用
// our default category -- we change this for conversion and playback appropriately
UInt32 audioCategory = kAudioSessionCategory_SoloAmbientSound;
XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory), "couldn't set audio category");
除了这些警告/错误,我可以编写/转换一个 caf 文件:)。我将不胜感激任何反馈。