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