好的,我已经阅读了很多关于 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。一只小鸟告诉我,这将被弃用,那么有什么替代方案?
所以,基本上:
如何获取当前播放的音频以进行分析?我可以只使用 MPMusicPlayerController 并获取样本吗?还是我必须构建一个完整的 AudioUnit 来播放库?
分析低点、中点和高点的最快方法(CPU)是什么?过滤?快速傅里叶变换?还有什么?
我会在购买音乐的版权方面遇到麻烦吗?因为我试图将播放文件转换为 PCA 样本,有时我会遇到这个错误:
VTM_AViPodReader[7666:307] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[AVAssetReader initWithAsset:error:] 无效参数不满足:资产!=((void *)0)”
如果整个 AVAudioSession 的东西将来都不起作用,那么做 FFT 的“新”方法是什么?