1

I get the callbacks from camera with for audio with data in the format of CMSampleBuffer but I am unable to convert this data to PCM data.

I followed the docs provided by Apple copyPCMData, UnsafeMutablePointer, AudioBufferList but all I get is 0.0 at the end.

Here is my code:

private let pcmBufferPointer = UnsafeMutablePointer<AudioBufferList>.allocate(capacity: 1024)

init(....){
    //...
    let unsafeRawPointer = UnsafeMutableRawPointer.allocate(byteCount: 4, alignment: 0)
    let audioBuffer = AudioBuffer(mNumberChannels: 1, mDataByteSize: 4, mData: unsafeRawPointer)
    let audioBufferList = AudioBufferList(mNumberBuffers: 0, mBuffers: audioBuffer)
    self.pcmBufferPointer.initialize(repeating: audioBufferList, count: 1024)
}


//CMSampleBuffer obtained from AVCaptureAudioDataOutputSampleBufferDelegate
private func audioFrom(sampleBuffer: CMSampleBuffer) -> Void {
    let status = CMSampleBufferCopyPCMDataIntoAudioBufferList(sampleBuffer, 0, 1024, pcmBufferPointer)
    if status == 0 {
        Logger.log(key: "Audio Sample Buffer Status", message: "Buffer copied to pointer")
        let dataValue = pcmBufferPointer[0].mBuffers.mData!.load(as: Float32.self) //Tried with Int, Int16, Int32, Int64 and Float too
        Logger.log(key: "PCM Data Value", message: "Data value : \(dataValue)") //prints 0.0
    }else{
        Logger.log(key: "Audio Sample", message: "Buffer allocation failed with status \(status)")
    }
}
4

1 回答 1

1

终于让它工作了。

AudioBufferList必须为指针到AudioList指针的转换添加额外的步骤

if status == 0 {
    let inputDataPtr = UnsafeMutableAudioBufferListPointer(pcmBufferPointer)
    let mBuffers : AudioBuffer = inputDataPtr[0]
    if let bufferPointer = UnsafeMutableRawPointer(mBuffers.mData){
        let dataPointer = bufferPointer.assumingMemoryBound(to: Int16.self)
        let dataArray = Array(UnsafeBufferPointer.init(start: dataPointer, count: 1024))
        pcmArray.append(contentsOf: dataArray)
    }else{
        Logger.log(key: "Audio Sample", message: "Failed to generate audio sample")
    }
}else{
    Logger.log(key: "Audio Sample", message: "Buffer allocation failed with status \(status)")
}

以上代码仅适用于单通道 PCM 数据。对于 2 通道数据,请参阅以下 GIST - https://gist.github.com/hotpaw2/ba815fc23b5d642705f2b1dedfaf0107

于 2018-06-05T08:44:14.777 回答