- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
因此,我尝试使用 Accelerate.framework 阅读有关 FFT 的所有内容,并获得了一个适用于 MTAudioProcessingTap 的示例,但我觉得我做错了什么,我的标绘点不应该看起来像这样。
#import "AudioTap.h"
#pragma mark - TapContext
typedef struct TapContext {
void *audioTap;
Float64 sampleRate;
UInt32 numSamples;
FFTSetup fftSetup;
COMPLEX_SPLIT split;
float *window;
float *inReal;
} TapContext;
#pragma mark - AudioTap Callbacks
static void TapInit(MTAudioProcessingTapRef tap, void *clientInfo, void **tapStorageOut)
{
TapContext *context = calloc(1, sizeof(TapContext));
context->audioTap = clientInfo;
context->sampleRate = NAN;
context->numSamples = 4096;
vDSP_Length log2n = log2f((float)context->numSamples);
int nOver2 = context->numSamples/2;
context->inReal = (float *) malloc(context->numSamples * sizeof(float));
context->split.realp = (float *) malloc(nOver2*sizeof(float));
context->split.imagp = (float *) malloc(nOver2*sizeof(float));
context->fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2);
context->window = (float *) malloc(context->numSamples * sizeof(float));
vDSP_hann_window(context->window, context->numSamples, vDSP_HANN_DENORM);
*tapStorageOut = context;
}
static void TapPrepare(MTAudioProcessingTapRef tap, CMItemCount numberFrames, const AudioStreamBasicDescription *format)
{
TapContext *context = (TapContext *)MTAudioProcessingTapGetStorage(tap);
context->sampleRate = format->mSampleRate;
if (format->mFormatFlags & kAudioFormatFlagIsNonInterleaved) {
NSLog(@"is Non Interleaved");
}
if (format->mFormatFlags & kAudioFormatFlagIsSignedInteger) {
NSLog(@"dealing with integers");
}
}
static void TapProcess(MTAudioProcessingTapRef tap, CMItemCount numberFrames, MTAudioProcessingTapFlags flags,
AudioBufferList *bufferListInOut, CMItemCount *numberFramesOut, MTAudioProcessingTapFlags *flagsOut)
{
OSStatus status;
status = MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, flagsOut, NULL, numberFramesOut);
if (status != noErr) {
NSLog(@"MTAudioProcessingTapGetSourceAudio: %d", (int)status);
return;
}
//UInt32 bufferCount = bufferListInOut->mNumberBuffers;
AudioBuffer *firstBuffer = &bufferListInOut->mBuffers[1];
float *bufferData = firstBuffer->mData;
//UInt32 dataSize = firstBuffer->mDataByteSize;
//printf(": %li", dataSize);
TapContext *context = (TapContext *)MTAudioProcessingTapGetStorage(tap);
vDSP_vmul(bufferData, 1, context->window, 1, context->inReal, 1, context->numSamples);
vDSP_ctoz((COMPLEX *)context->inReal, 2, &context->split, 1, context->numSamples/2);
vDSP_Length log2n = log2f((float)context->numSamples);
vDSP_fft_zrip(context->fftSetup, &context->split, 1, log2n, FFT_FORWARD);
context->split.imagp[0] = 0.0;
UInt32 i;
NSMutableArray *outData = [NSMutableArray array];
[outData addObject:[NSNumber numberWithFloat:0]];
for( i = 1; i < context->numSamples; i++) {
float power = context->split.realp[i] * context->split.realp[i] + context->split.imagp[i] * context->split.imagp[i];
//amp[i] = sqrtf(power);
[outData addObject:[NSNumber numberWithFloat:sqrtf(power)]];
}
AudioTap *audioTap = (__bridge AudioTap *)context->audioTap;
[audioTap updateSpectrum:outData];
}
static void TapUnprepare(MTAudioProcessingTapRef tap)
{
}
static void TapFinalize(MTAudioProcessingTapRef tap)
{
TapContext *context = (TapContext *)MTAudioProcessingTapGetStorage(tap);
free(context->split.realp);
free(context->split.imagp);
free(context->inReal);
free(context->window);
context->fftSetup = nil;
context->audioTap = nil;
free(context);
}
#pragma mark - AudioTap Implementation
@implementation AudioTap
- (id)initWithTrack:(AVAssetTrack *)track frameSize:(UInt32)frameSize
{
self = [super init];
if (self) {
_assetTrack = track;
_frameSize = frameSize;
[self setupAudioTap];
}
return self;
}
- (void)setupAudioTap
{
//MTAudioProcessingTap
MTAudioProcessingTapCallbacks callbacks;
callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
callbacks.init = TapInit;
callbacks.prepare = TapPrepare;
callbacks.process = TapProcess;
callbacks.unprepare = TapUnprepare;
callbacks.finalize = TapFinalize;
callbacks.clientInfo = (__bridge void *)self;
MTAudioProcessingTapRef tapRef;
OSStatus err = MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks,
kMTAudioProcessingTapCreationFlag_PostEffects, &tapRef);
if (err || !tapRef) {
NSLog(@"Unable to create AudioProcessingTap.");
return;
}
//Audio Mix
AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters
audioMixInputParametersWithTrack:_assetTrack];
inputParams.audioTapProcessor = tapRef;
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
audioMix.inputParameters = @[inputParams];
_audioMix = audioMix;
}
- (void)updateSpectrum:(NSArray *)data
{
@autoreleasepool
{
dispatch_async(dispatch_get_main_queue(), ^{
// Forward left and right channel volume to delegate.
if (_delegate && [_delegate respondsToSelector:@selector(updateSpectrum:)]) {
[_delegate updateSpectrum:data];
}
});
}
}
@end
我读到 audioBuffer->mData 属性可能是 float 以外的其他东西(即 SInt32 等?),如果这是真的,如何确保我在尝试对其进行 FFT 之前正确转换它?
最佳答案
绘图长度和真实的 FFT 幅度结果长度 (2^log2n)/2 不一样。
关于ios - 在 iOS 上使用 MTAudioProcessingTap 进行 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22751685/
在我的 iOS 8.0 中。 App 我需要对(非实时)音频播放应用一些自定义音频处理。通常,音频来自设备本地音频文件。 目前,我在 AVMutableAudioMix 上使用 MTAudioProc
阅读这篇文章后:How do you release an MTAudioProcessingTap? ,按照克里斯的一次点击建议似乎有效,并且调用了 unprepare 和 finalize 回调。
MTAudioProcessingTap 的头文件说它的初始化和准备回调将由未准备和完成回调平衡。然而,在 Apple's example ,这些回调永远不会被调用(我向它们添加了日志记录以便我可以检
我正在尝试根据此博客条目中的教程创建 MTAudioProcessingTap - http://chritto.wordpress.com/2013/01/07/processing-avplaye
我正在尝试实现 MTAudioProcessingTap,它运行良好。问题是当我完成使用 Tap 并重新启动我的类并创建一个新的 Tap 时。 我怎么可能松开水龙头1-我在创建时将水龙头保留为属性,希
我正在尝试使用 AVAssetExportSession 导出可变组合。我使用 MTAudioProcessingTap 处理可变组合中的音频数据,并根据音频数据,使用 AVVideoComposit
我正在尝试构建一个 iOS 应用程序来播放视频文件并使用 MTAudioProcessingTap 做一些有趣的事情。我需要它能够播放各种格式,包括一些 Apple 不支持的格式。我正在考虑从 VLC
由于关于 MTAudioProcessingTap 的文档非常少(实际上几乎没有),我使用的是 Apple's demo app from WWDC 2012 . 我正在尝试在 MTAudioProc
因此,我尝试使用 Accelerate.framework 阅读有关 FFT 的所有内容,并获得了一个适用于 MTAudioProcessingTap 的示例,但我觉得我做错了什么,我的标绘点不应该看
我正在尝试在 iOS 设备上播放用户 iPod 库中的音频文件,同时使用 AudioUnit 应用参数 EQ 效果。我一直在使用这个示例作为指南:https://developer.apple.com
关于 AVAudioMix 的文档很少和 MTAudioProcessingTap,它允许处理应用于 AVFoundation(在 iOS 上)中媒体 Assets 的音轨(PCM 访问)。这arti
我是一名优秀的程序员,十分优秀!