4

我想要的只是读取一个 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

现在,当我编译时,我没有收到任何错误,并且运行时只有在我注释掉 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 文件:)。我将不胜感激任何反馈。

4

0 回答 0