I'm having an issue with AVAudioConverter
. I'm trying to convert AVAudioPCMBuffers
to AAC
.
This is my function for converting, taken from the "What's new in Core Audio" session 507 at WWDC 2015.
func convertPCMBufferToAAC(inBuffer : AVAudioPCMBuffer) -> Void {
let inputFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32,
sampleRate: 8000, channels: 1,
interleaved: false)
var outDesc = AudioStreamBasicDescription(mSampleRate: 8000,
mFormatID: kAudioFormatMPEG4AAC,
mFormatFlags: 0,
mBytesPerPacket: 0,
mFramesPerPacket: 0,
mBytesPerFrame: 0,
mChannelsPerFrame: 1,
mBitsPerChannel: 0,
mReserved: 0)
let outputFormat = AVAudioFormat(streamDescription: &outDesc)
let converter = AVAudioConverter(from: inputFormat, to: outputFormat)
let outBuffer = AVAudioCompressedBuffer(format: outputFormat,
packetCapacity: 8,
maximumPacketSize: converter.maximumOutputPacketSize)
let inputBlock : AVAudioConverterInputBlock = {
inNumPackets, outStatus in
outStatus.pointee = AVAudioConverterInputStatus.haveData
return inBuffer
}
var error : NSError?
let status = converter.convert(to: outBuffer, error: &error, withInputFrom: inputBlock)
}
The problem is that the outBuffer is empty. If I print it I get the output <AVAudioCompressedBuffer@0x170012420: 0/6144 bytes>
so as you can see it is not filled.
If your wondering I'm getting the AVAudioPCMBuffer
from installing a tap on the AVAudioEngine
. This I'm converting to the same format as inputFormat
using the AVAudioEngines
main mixer.
Does anyone know a solution to this?
I think the problem is that the
inputFormat
you construct differs frominBuffer.format
. Try this instead:and make sure to run the code on a device, as it does not appear to work on the simulator.