gpt4 book ai didi

iphone - (iPhone) 来自 iPod 的实时 FFT

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:41 25 4
gpt4 key购买 nike

好吧,我读过很多关于 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;
(...)

但我对所有这些 AudioUnit 都很陌生,所以我无法理解输入的加载位置。然后,上面提到的代码使用了AVAudioSession。一只小鸟告诉我,这将被弃用,那么有什么选择呢?

所以,基本上:

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

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

  3. 我会因为购买的音乐的版权而遇到麻烦吗?因为我尝试将播放文件转换为PCA Samples,有时会出现此错误:

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

  4. 如果整个 AVAudioSession 的东西将来都不起作用,那么执行 FFT 的"new"方法是什么?

最佳答案

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

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

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

FFT 在 Accelerate 框架中,不在 Audio Session 中。

关于iphone - (iPhone) 来自 iPod 的实时 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18638666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com