簡體   English   中英

如何在iOS中捕獲音頻輸出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM