一段时间后处理 CMSampleBuffer 失败

如何解决一段时间后处理 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?