作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在我的应用程序中播放来自互联网的音频流,我想显示一个图形均衡器。我用于流式传输的库是 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/
我是一名优秀的程序员,十分优秀!