2016-11-04 43 views
2

我遇到AVAudioConverter问题。我试图将AVAudioPCMBuffers转换为AACAVAudioConverter将AVAudioPCMBuffer转换为AAC

这是我的转换功能,从采取“什么在核心音频新”会话507WWDC 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) 
} 

问题是outBuffer是空的。如果我打印它,我得到输出<[email protected]: 0/6144 bytes>,因为你可以看到它没有填充。

如果您想知道我在AVAudioEngine上安装了水龙头AVAudioPCMBuffer。我将使用AVAudioEngines主调音台将其转换为与inputFormat相同的格式。

有没有人知道这个解决方案?

回答

0

我认为问题是您构建的inputFormatinBuffer.format不同。试试这个:

let inputFormat = inBuffer.format 

并确保在设备上运行代码,因为它似乎不能在模拟器上工作。

+0

不幸的是,与以前相同的问题和错误代码(Error Domain = NSOSStatusErrorDomain Code = -50“(null)”):/ – nullforlife

+0

您的inputBlock被调用了吗? –

+0

不,它不是。 – nullforlife