Audio von AVAudioPCMBuffer mit AVAudioEngine abspielen

Ich habe zwei Klassen,MicrophoneHandler, undAudioPlayer. Ich habe es geschafft, @ zu verwendAVCaptureSession, um mit der genehmigten Antwort auf Mikrofondaten zu tippenHie, und und das @ konvertieCMSampleBuffer zuNSData mit dieser Funktion:

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

Ich möchte jetzt den Ton über den Lautsprecher wiedergeben, indem ich dasNSData oben produziertAVAudioPCMBuffer und spiele es mitAVAudioEngine. MeinAudioPlayerclass ist wie folgt:

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
}

Der Puffer erreicht dashandleBuffer:buffer Funktion wennself.delegate.handleBuffer(result) wird oben im ersten Snippet aufgerufen.

Ich bin fähigprint(newBuffer), und sehen Sie die Speicherorte der konvertierten Puffer, aber es kommt nichts aus den Lautsprechern. Ich kann mir nur vorstellen, dass etwas zwischen den Konvertierungen zu und von @ nicht konsistent isNSData. Irgendwelche Ideen? Danke im Voraus

Antworten auf die Frage(2)

Ihre Antwort auf die Frage