一段时间后处理 CMSampleBuffer 失败

问题描述

我正在尝试从设备麦克风捕获音频并将其作为 Float 数组进行处理。我已经设置了一个 AVCaptureSession 并实现了 captureOutput(_:didOutput:from:),它似乎可以工作一段时间,但在处理了大量样本后,通道数突然变为零。这是为什么?

输出为:

numSamples: 512,mNumberBuffers: 1,mNumberChannels: 2
signals count: 2,signals[0] count: 1536
...
numSamples: 512,signals[0] count: 1536
numSamples: 512,mNumberChannels: 0

我的代码是:

class Capture: NSObject,AVCaptureAudioDataOutputSampleBufferDelegate {
    var captureSession: AVCaptureSession
    
    override init() {
        self.captureSession = AVCaptureSession()
        super.init()
        beginCapture()
    }
    
    func beginCapture() {
        guard let device = AVCaptureDevice.default(for: .audio) else { return }
        guard let input = try? AVCaptureDeviceInput(device: device) else { return }
        guard captureSession.canAddInput(input) else { return }
        
        captureSession.addInput(input)
        
        let output = AVCaptureAudioDataOutput()
        let queue = dispatchQueue(label: "myqueue")
        output.setSampleBufferDelegate(self,queue: queue)
        guard captureSession.canAddOutput(output) else { return }
        captureSession.addOutput(output)
        captureSession.commitConfiguration()
        
        captureSession.startRunning()
    }
    
    func captureOutput(_ output: AVCaptureOutput,didOutput sampleBuffer: CMSampleBuffer,from connection: AVCaptureConnection) {
        var audiobufferlist = audiobufferlist(mNumberBuffers: 1,mBuffers: AudioBuffer(mNumberChannels: 0,mDataByteSize: 0,mData: nil))
        var blockBuffer: CMBlockBuffer? = nil
        
        CMSampleBufferGetaudiobufferlistWithRetainedBlockBuffer(sampleBuffer,bufferListSizeNeededOut: nil,bufferListOut: &audiobufferlist,bufferListSize: MemoryLayout<audiobufferlist>.stride,blockBufferAllocator: nil,blockBufferMemoryAllocator: nil,flags: kCMSampleBufferFlag_audiobufferlist_Assure16Bytealignment,blockBufferOut: &blockBuffer)
        
        var monoSamples = [UInt8]()
        let a = audiobufferlist.mBuffers
        let ptr = a.mData?.assumingMemoryBound(to: UInt8.self)
        monoSamples.append(contentsOf: UnsafeBufferPointer(start: ptr,count: Int(a.mDataByteSize)))
        
        let n = Int(a.mNumberChannels)
        
        let signals: [[Float]] = (0..<n).map { i in
            let a = stride(from: i,to: monoSamples.count,by: n)
            let b = a.map { ii in Float(monoSamples[ii]) }
            return b
        }
        
        print("numSamples: \(sampleBuffer.numSamples),mNumberBuffers: \(audiobufferlist.mNumberBuffers),mNumberChannels: \(audiobufferlist.mBuffers.mNumberChannels)")
        
        print("signals count: \(signals.count),signals[0] count: \(signals[0].count)")
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)