![](/img/trans.png)
[英]How can i capture what's being played on an iOS device output audio stream and store it in an object?
[英]How to capture audio output in iOS?
我正在應用程序中播放來自互聯網的音頻流,並且我想顯示一個圖形均衡器。 我用於流式傳輸的庫是FreeStreamer
。 為了繪制圖形均衡器,我使用ZLHistogramAudioPlot
。 這兩個庫是唯一適合我需要的庫。 問題是我無法讓他們一起工作。
ZLHistogramAudioPlot
需要一個buffer和bufferSize才能更新其視圖。 這是它的更新方法:
- (void)updateBuffer:(float *)buffer withBufferSize:(UInt32)bufferSize {
[self setSampleData:buffer length:bufferSize];
}
不幸的是, FreeStreamer
庫沒有提供一種在音頻輸出向聲卡輸出時讀取音頻輸出的方法。 因此,我需要的是一種讀取將要通過揚聲器播放的音頻輸出流的方法(而不是來自互聯網的字節流,因為它是分塊接收的,然后進行緩沖,這意味着直方圖將不在即時的)。
我發現可以使用Apple的CoreAudio
框架中的AURemoteIO
來執行此操作,但是Apple的示例項目非常復雜,難以理解,在線上幾乎沒有使用AURemoteIO
示例。
這是實現此目標的最佳方法嗎?如果是的話,將不勝感激任何有用的信息/鏈接。
這是通過查看FreeStreamer標頭獲得的可能答案
#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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.