gpt4 book ai didi

ios - 如何在 iOS 中捕获音频输出?

转载 作者:行者123 更新时间:2023-11-29 12:21:59 25 4
gpt4 key购买 nike

我正在我的应用程序中播放来自互联网的音频流,我想显示一个图形均衡器。我用于流式传输的库是 FreeStreamer。为了绘制图形均衡器,我使用了 ZLHistogramAudioPlot。这两个库是唯一满足我需要的库。问题是我无法让他们一起工作。

ZLHistogramAudioPlot 需要一个缓冲区和 bufferSize 才能更新它的 View 。这是它的更新方法:

- (void)updateBuffer:(float *)buffer withBufferSize:(UInt32)bufferSize {
[self setSampleData:buffer length:bufferSize];
}

不幸的是,FreeStreamer 库没有提供一种方法来读取输出到声卡的音频输出。所以,我需要的是一种方法来读取即将通过扬声器播放的音频输出流(不是来自互联网的字节流,因为它是按 block 接收的,然后进行缓冲,这意味着直方图不会在实时)。

我发现Apple的CoreAudio框架中的AURemoteIO可以用来做这个,但是Apple的sample project复杂到无法理解,几乎没有关于使用 AURemoteIO 的在线示例。

这是实现此目标的最佳方式吗?如果是,任何有用的信息/链接将不胜感激。

最佳答案

这是查看 FreeStreamer header 的可能答案

#define minForSpectrum 1024

@implementation MyClass {
TPCircularBuffer SpectrumAnalyzerBuffer;
}

- (void)dealloc {
TPCircularBufferCleanup(&SpectrumAnalyzerBuffer);
}

-(instancetype) init {
self = [super init];
if (self) {
TPCircularBufferInit(&SpectrumAnalyzerBuffer, 16384);
self.audioController.activeStream.delegate = self;
}
return self;
}

- (void)audioStream:(FSAudioStream *)audioStream samplesAvailable:(const int16_t *)samples count:(NSUInteger)count {
// incoming data is integer

SInt16 *buffer = samples;
Float32 *floatBuffer = malloc(sizeof(Float32)*count);
// convert to float
vDSP_vflt16(buffer, 1, floatBuffer, 1, count);

// scale
static float scale = 1.f / (INT16_MAX/2);
static float zero = 0.f;

vDSP_vsmsa(floatBuffer, 1, &scale, &zero, floatBuffer, 1, count);

TPCircularBufferProduceBytes(&SpectrumAnalyzerBuffer, floatBuffer, count*sizeof(Float32));

free(floatBuffer);
}

- (void) timerCallback: (NSTimer*) timer {

Float32 *spectrumBufferData = TPCircularBufferTail(&SpectrumAnalyzerBuffer, &availableSpectrum);

if (availableSpectrum >= minForSpectrum) {
// note visualiser may want chunks of a fixed size if its doing fft
[histogram updateBuffer: spectrumBufferData length: minForSpectrum];
TPCircularBufferConsume(&SpectrumAnalyzerBuffer, minForSpectrum);
}


}

关于ios - 如何在 iOS 中捕获音频输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30347401/

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