2017-04-06 3 views
3

Je suis en train d'enregistrer de l'audio à partir du microphone et de le diffuser vers un autre appareil. Actuellement, cet audio est envoyé à travers le flux même lorsque l'utilisateur ne parle pas. Mais j'ai remarqué que beaucoup de services de diffusion n'envoient pas réellement votre entrée de micro quand ils détectent qu'il y a très peu de bruit venant de lui.Swift - Comment obtenir le volume actuel à partir de l'entrée microphone (AVAudioPCMBuffer)

Donc, je demande, comment puis-je voir à quel point l'entrée est forte avant de la diffuser à l'autre périphérique. J'importe l'audio en utilisant un AVAudioPlayerNode attaché à un AVAudioEngine. Je puis utiliser ce qui suit pour fait enregistrer:

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

Ici, le tampon est un AVAudioPCMBuffer, donc je dois être en mesure de voir le volume de ce tampon.

Merci!

Répondre

1

j'ai pu réaliser ce but en utilisant le code suivant:

  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) 
      } 

crédit pour cette réponse va à ce question.