3

好的,我已经阅读了很多关于 FFT 的东西,但它似乎构建 tableView 更复杂一些。

我正在寻找一种方法来分析三个范围(低、中、高)中正在播放的音频(来自 iPod 库)。我认为 FFT 正在完成这项工作,但我不确定我是否可以过滤(低通、带通和高通)正在播放的音频并分析峰值。因此,如果有人知道什么是最好的(最好的意思是最快的(CPU)方式,请帮助我。不会有前端,所以我不会在窗口中绘制 FFT(我猜绘图确实吃掉了很多cpu)。

然后我不知道如何分析音频。我发现的所有 FFT 示例代码都在使用麦克风。我不想使用麦克风。我看到了一些获取音频文件并将其导出到未压缩文件的内容,但我需要进行实时分析。我看过 aurioTouch2,但我不明白如何将输入从麦克风更改为 iPod 库。我想,我正在寻找的部分在这里:

    // Initialize our remote i/o unit

inputProc.inputProc = PerformThru;
inputProc.inputProcRefCon = self;

CFURLRef url = NULL;
try {   
    url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFStringRef([[NSBundle mainBundle] pathForResource:@"button_press" ofType:@"caf"]), kCFURLPOSIXPathStyle, false);
    XThrowIfError(AudioServicesCreateSystemSoundID(url, &buttonPressSound), "couldn't create button tap alert sound");
    CFRelease(url);

    // Initialize and configure the audio session
    XThrowIfError(AudioSessionInitialize(NULL, NULL, rioInterruptionListener, self), "couldn't initialize audio session");

    UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
    XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory), "couldn't set audio category");
    XThrowIfError(AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self), "couldn't set property listener");

    Float32 preferredBufferSize = .005;
    XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize), "couldn't set i/o buffer duration");

    UInt32 size = sizeof(hwSampleRate);
    XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &size, &hwSampleRate), "couldn't get hw sample rate");

    XThrowIfError(AudioSessionSetActive(true), "couldn't set audio session active\n");

    XThrowIfError(SetupRemoteIO(rioUnit, inputProc, thruFormat), "couldn't setup remote i/o unit");
    unitHasBeenCreated = true;

    drawFormat.SetAUCanonical(2, false);
    drawFormat.mSampleRate = 44100;
    (...)

但是我对所有这些 AudioUnits 都很陌生,所以我不明白输入的加载位置。然后,上面提到的代码使用了 AVAudioSession。一只小鸟告诉我,这将被弃用,那么有什么替代方案?

所以,基本上:

  1. 如何获取当前播放的音频以进行分析?我可以只使用 MPMusicPlayerController 并获取样本吗?还是我必须构建一个完整的 AudioUnit 来播放库?

  2. 分析低点、中点和高点的最快方法(CPU)是什么?过滤?快速傅里叶变换?还有什么?

  3. 我会在购买音乐的版权方面遇到麻烦吗?因为我试图将播放文件转换为 PCA 样本,有时我会遇到这个错误:

    VTM_AViPodReader[7666:307] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[AVAssetReader initWithAsset:error:] 无效参数不满足:资产!=((void *)0)”

  4. 如果整个 AVAudioSession 的东西将来都不起作用,那么做 FFT 的“新”方法是什么?

4

1 回答 1

1

您无法在 iOS 上获取当前正在播放的音频(安全沙箱会阻止这一点),除非您的应用是使用某些选择 API(音频队列、RemoteIO 等)播放音频的应用

3 个带通滤波器(使用 IIR 双二阶)将比 FFT 更快。但即使是完整的 FFT 也将使用很小比例的 CPU 时间。

应用程序无法以可以捕获样本的形式转换或播放 iTunes 库中受保护的音乐。

FFT 在 Accelerate 框架中,而不是在音频会话中。

于 2013-09-05T15:02:06.567 回答