Воспроизведение аудио с AVAudioPCMBuffer с AVAudioEngine

У меня есть два класса,MicrophoneHandler, а такжеAudioPlayer, Мне удалось использоватьAVCaptureSession нажать на данные микрофона, используя утвержденный ответВоти преобразовалCMSampleBuffer вNSData используя эту функцию:

func sendDataToDelegate(buffer: CMSampleBuffer!)
{
    let block = CMSampleBufferGetDataBuffer(buffer)
    var length = 0
    var data: UnsafeMutablePointer<Int8> = nil

    var status = CMBlockBufferGetDataPointer(block!, 0, nil, &length, &data)    // TODO: check for errors

    let result = NSData(bytesNoCopy: data, length: length, freeWhenDone: false)

    self.delegate.handleBuffer(result)
}

Теперь я хотел бы воспроизвести звук через динамик, преобразовавNSData производится выше дляAVAudioPCMBuffer и играть в нее, используяAVAudioEngine, мойAudioPlayerКласс выглядит следующим образом:

var engine: AVAudioEngine!
var playerNode: AVAudioPlayerNode!
var mixer: AVAudioMixerNode!

override init()
{
    super.init()

    self.setup()
    self.start()
}

func handleBuffer(data: NSData)
{
    let newBuffer = self.toPCMBuffer(data)
    print(newBuffer)

    self.playerNode.scheduleBuffer(newBuffer, completionHandler: nil)
}

func setup()
{
    self.engine = AVAudioEngine()
    self.playerNode = AVAudioPlayerNode()

    self.engine.attachNode(self.playerNode)
    self.mixer = engine.mainMixerNode

    engine.connect(self.playerNode, to: self.mixer, format: self.mixer.outputFormatForBus(0))
}

func start()
{
    do {
        try self.engine.start()
    }
    catch {
        print("error couldn't start engine")
    }

    self.playerNode.play()
}

func toPCMBuffer(data: NSData) -> AVAudioPCMBuffer
{
    let audioFormat = AVAudioFormat(commonFormat: AVAudioCommonFormat.PCMFormatFloat32, sampleRate: 8000, channels: 2, interleaved: false)  // given NSData audio format
    let PCMBuffer = AVAudioPCMBuffer(PCMFormat: audioFormat, frameCapacity: UInt32(data.length) / audioFormat.streamDescription.memory.mBytesPerFrame)

    PCMBuffer.frameLength = PCMBuffer.frameCapacity

    let channels = UnsafeBufferPointer(start: PCMBuffer.floatChannelData, count: Int(PCMBuffer.format.channelCount))

    data.getBytes(UnsafeMutablePointer<Void>(channels[0]) , length: data.length)

    return PCMBuffer
}

Буфер достигаетhandleBuffer:buffer функция, когдаself.delegate.handleBuffer(result) называется в первом фрагменте выше.

я смогуprint(newBuffer)и увидеть ячейки памяти преобразованных буферов, но из динамиков ничего не выходит. Я могу только представить, что что-то не соответствует между преобразованиями в и изNSData, Есть идеи? Заранее спасибо.

Ответы на вопрос(1)

Ваш ответ на вопрос