【问题标题】:(iPhone) Live FFT from iPod(iPhone) 来自 iPod 的实时 FFT
【发布时间】:2013-09-05 14:11:46
【问题描述】:

好的,伙计们,我已经阅读了很多关于 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 的“新”方法是什么?

【问题讨论】:

    标签: iphone ios audio core-audio accelerate-framework


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多