我需要捕获音频帧的频率为48000,和Int16位帧。我需要那种格式,因为这正是我的客户所期望的。现在,音频通过,但它听起来真的很有趣。我使用的是avcapture会话和以下设置。
let audioSettings = [AVFormatIDKey : kAudioFormatLinearPCM,
AVSampleRateKey : 48000,
AVLinearPCMBitDepthKey : 16,
AVLinearPCMIsFloatKey : false] as [String : Any]我将这些设置添加到AVCaptureDataOutput对象中
private func setAudioDataOutput() -> EErrorCode {
if dataOutput == nil {
dataOutput = AVCaptureAudioDataOutput()
}
dataOutput!.setSampleBufferDelegate(self, queue: DispatchQueue(label: "myApp.AudioStreaming"))
dataOutput!.audioSettings = audioSettings
guard captureSession!.canAddOutput(dataOutput!) else {
VsLogger.logError(logTag, "setAudioDataOutput() failed to add dataOutput for \(getName() ?? "no name found")")
return .AudioOtherError
}
captureSession!.addOutput(dataOutput!)
return .Success
}这就是我从CMSampleBuffer获得数据的地方。
guard let bufferData = self.getBlockDataBuffer(from: buffer) else { return }
delegate.audioDataUpdate(bufferData, Int(sampleDescription.mSampleRate),
Int(sampleDescription.mChannelsPerFrame),
duration)我的getBlockDataBuffer功能
private func getBlockDataBuffer(from sampleBuffer: CMSampleBuffer) -> Data? {
guard let blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer) else { return nil }
let dataLength = CMBlockBufferGetDataLength(blockBuffer)
var blockBufferData = [UInt8](repeating: 0, count: dataLength)
let status = CMBlockBufferCopyDataBytes(blockBuffer, atOffset: 0, dataLength: dataLength,
destination: &blockBufferData)
guard status == noErr else {
return nil
}
return Data(bytes: blockBufferData , count: dataLength)当我打印AudioStreamBasicDescription时,我会得到以下内容。
sampleDescription.mChannelsPerFrame -> 2
sampleDescription.mSampleRate -> 48000
sampleDescription.mBytesPerFrame -> 2
sampleDescription.mFramesPerPacket -> 1
sampleDescription.mBytesPerPacket -> 2
duration -> 1下面是我的cmSampleBuffer的样子:
buffer numSamples: 557
buffer duration seconds: 0.011604166666666667
buffer isValid: true
buffer totalSampleSize: 0
buffer numSamples: 557
buffer dataReadiness: ready
sampleDescription: AudioStreamBasicDescription(mSampleRate: 48000.0,
mFormatID: 1819304813,
mFormatFlags: 44,
mBytesPerPacket: 2,
mFramesPerPacket: 1,
mBytesPerFrame: 2,
mChannelsPerFrame: 2,
mBitsPerChannel: 16,
mReserved: 0)所以我的设置没有在我的捕获会话中持续?
发布于 2022-07-18 22:39:35
结果(就像@RhythmicFistman建议的那样),我只是错过了设定的天气,或者不想让这个画面交织在一起。所以我的设置现在是这样的:
let audioSettings = [AVFormatIDKey : kAudioFormatLinearPCM,
AVSampleRateKey : 48000,
AVLinearPCMBitDepthKey : 16,
AVLinearPCMIsFloatKey : false,
AVLinearPCMIsNonInterleaved : false] as [String : Any]https://stackoverflow.com/questions/72975539
复制相似问题