首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AVCapture会话捕获音频帧

使用AVCapture会话捕获音频帧
EN

Stack Overflow用户
提问于 2022-07-14 05:19:05
回答 1查看 39关注 0票数 1

我需要捕获音频帧的频率为48000,和Int16位帧。我需要那种格式,因为这正是我的客户所期望的。现在,音频通过,但它听起来真的很有趣。我使用的是avcapture会话和以下设置。

代码语言:javascript
复制
 let audioSettings = [AVFormatIDKey : kAudioFormatLinearPCM,
                    AVSampleRateKey : 48000,
             AVLinearPCMBitDepthKey : 16,
              AVLinearPCMIsFloatKey : false] as [String : Any]

我将这些设置添加到AVCaptureDataOutput对象中

代码语言:javascript
复制
 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获得数据的地方。

代码语言:javascript
复制
        guard let bufferData = self.getBlockDataBuffer(from: buffer) else { return }
    delegate.audioDataUpdate(bufferData, Int(sampleDescription.mSampleRate),
                             Int(sampleDescription.mChannelsPerFrame),
                             duration)

我的getBlockDataBuffer功能

代码语言:javascript
复制
   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时,我会得到以下内容。

代码语言:javascript
复制
sampleDescription.mChannelsPerFrame -> 2
sampleDescription.mSampleRate -> 48000
sampleDescription.mBytesPerFrame -> 2
sampleDescription.mFramesPerPacket -> 1
sampleDescription.mBytesPerPacket -> 2
duration -> 1

下面是我的cmSampleBuffer的样子:

代码语言:javascript
复制
    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)

所以我的设置没有在我的捕获会话中持续?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-18 22:39:35

结果(就像@RhythmicFistman建议的那样),我只是错过了设定的天气,或者不想让这个画面交织在一起。所以我的设置现在是这样的:

代码语言:javascript
复制
    let audioSettings = [AVFormatIDKey : kAudioFormatLinearPCM,
                   AVSampleRateKey : 48000,
            AVLinearPCMBitDepthKey : 16,
             AVLinearPCMIsFloatKey : false,
       AVLinearPCMIsNonInterleaved : false] as [String : Any]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72975539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档