2017-04-06 158 views
3

我正在錄製來自麥克風的音頻並將該音頻流式傳輸到其他設備。目前,即使用戶不在說話時,也會通過流發送此音頻。但是我注意到,很多流媒體服務在檢測到來自它的噪聲很少時實際上並沒有發送您的麥克風輸入。Swift - 如何從麥克風輸入獲取當前音量(AVAudioPCMBuffer)

所以我問,如何在輸入到其他設備之前看到輸入有多大聲。

我使用連接到AVAudioEngine的AVAudioPlayerNode錄製音頻。然後我用下面的實際記錄:

localInput?.installTap(onBus: 0, bufferSize: 4096, format: localInputFormat) { 
    (buffer, when) -> Void in 

這裏,緩衝是一個AVAudioPCMBuffer,所以我需要能夠看到從這個緩衝區的容量。

謝謝!

回答

1

我能得到使用下面的代碼完成這件事:

  let arraySize = Int(buffer.frameLength) 
      var channelSamples: [[DSPComplex]] = [] 
      let channelCount = Int(buffer.format.channelCount) 

      for i in 0..<channelCount { 

       channelSamples.append([]) 
       let firstSample = buffer.format.isInterleaved ? i : i*arraySize 

       for j in stride(from: firstSample, to: arraySize, by: buffer.stride*2) { 

        let channels = UnsafeBufferPointer(start: buffer.floatChannelData, count: Int(buffer.format.channelCount)) 
        let floats = UnsafeBufferPointer(start: channels[0], count: Int(buffer.frameLength)) 
        channelSamples[i].append(DSPComplex(real: floats[j], imag: floats[j+buffer.stride])) 

       } 
      } 

      var spectrum = [Float]() 

      for i in 0..<arraySize/2 { 

       let imag = channelSamples[0][i].imag 
       let real = channelSamples[0][i].real 
       let magnitude = sqrt(pow(real,2)+pow(imag,2)) 

       spectrum.append(magnitude) 
      } 

信用爲這個答案去這個question