2

I am using AVAudioEngine to capture audio from macOS microphone and some other sources to mix multiple audio inputs, since the AVAudioCaptureSession does not have a feature to mix multiple inputs. Therefore, I am trying to convert the AVAudioPCMBuffer which I can obtain by installing a tap to the node of audioengine and convert it back to CMSampleBuffer. This is what I got so far.

engine.mainMixerNode.installTap(onBus: 0, bufferSize: 4096, format: format) { (buffer, time) in
    var sbuf : CMSampleBuffer?
    
    var timing = CMSampleTimingInfo(duration: CMTimeMake(value: 4096, timescale: 44100), presentationTimeStamp: .zero, decodeTimeStamp: .invalid)

    let code = CMSampleBufferCreate(allocator: kCFAllocatorDefault, dataBuffer: nil, dataReady: false, makeDataReadyCallback: nil, refcon: nil, formatDescription: buffer.format.formatDescription, sampleCount: CMItemCount(4096), sampleTimingEntryCount: 1, sampleTimingArray: &timing, sampleSizeEntryCount: 0, sampleSizeArray: nil, sampleBufferOut: &sbuf)
    print(code)
    let status = CMSampleBufferSetDataBufferFromAudioBufferList(sbuf!, blockBufferAllocator: kCFAllocatorDefault, blockBufferMemoryAllocator: kCFAllocatorDefault, flags: 0, bufferList: buffer.audioBufferList)
    print(status)    
}

However, when I do print(status) it prints -12731, and the databuffer is not initialized.

I am not sure what I did wrong.

k2sebeom
  • 21
  • 1

0 Answers0