3

わかりました、私は FFT について多くのことを読みましたが、tableView を構築するよりも少し複雑なようです。

再生中のオーディオ (iPod ライブラリから) を 3 つの範囲 (低、中、高) で分析する方法を探しています。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) は何ですか? フィルタリング?FFT? 他の何か?

  3. 購入した音楽の著作権でトラブルになることはありますか? 再生ファイルを PCA サンプルに変換しようとしたときに、次のエラーが発生することがあるためです。

    VTM_AViPodReader[7666:307] * キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。

  4. AVAudioSession全体が将来的に機能しない場合、FFTを実行する「新しい」方法は何ですか?

4

1 に答える 1

1

アプリが特定の選択 API (Audio Queue、RemoteIO など) を使用してオーディオを再生している場合を除き、iOS で現在再生中のオーディオを取得することはできません (セキュリティ サンドボックスがこれを防ぎます)。

3 つのバンドパス フィルター (IIR 双二次で作成) は、FFT よりも高速になります。ただし、完全な FFT でさえ、CPU 時間のごくわずかな割合しか使用しません。

アプリは、サンプルをキャプチャできる形式で iTunes ライブラリから保護された音楽を変換または再生することはできません。

FFT は、オーディオ セッションではなく、Accelerate フレームワークにあります。

于 2013-09-05T15:02:06.567 に答える