AVFoundation:如何完整获取1秒的音频样本缓冲区数据,共44100个浮点值
创始人
2024-11-13 01:30:08
0

以下是使用AVFoundation框架获取1秒音频样本缓冲区数据的示例代码:

import AVFoundation

class AudioSampleBufferDelegate: NSObject, AVCaptureAudioDataOutputSampleBufferDelegate {
    var audioData: [Float] = []

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        guard let audioBuffer = CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, bufferListSizeNeededOut: nil, bufferListOut: nil, bufferListSize: MemoryLayout.size, blockBufferAllocator: nil, blockBufferMemoryAllocator: nil, flags: kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, blockBufferOut: nil) == noErr else {
            return
        }
        
        let audioBuffers = UnsafeBufferPointer(start: &audioBuffer.mBuffers, count: Int(audioBuffer.mNumberBuffers))
        
        for audioBuffer in audioBuffers {
            let frameCount = Int(audioBuffer.mDataByteSize) / MemoryLayout.size
            let samples = UnsafeBufferPointer(start: audioBuffer.mData?.assumingMemoryBound(to: Float.self), count: frameCount)
            audioData.append(contentsOf: samples)
        }
    }
}

// 创建AVCaptureSession
let captureSession = AVCaptureSession()

// 获取音频设备
guard let audioDevice = AVCaptureDevice.default(for: .audio) else {
    fatalError("Failed to get audio device")
}

// 创建音频输入
guard let audioInput = try? AVCaptureDeviceInput(device: audioDevice) else {
    fatalError("Failed to create audio input")
}

// 将音频输入添加到会话
if captureSession.canAddInput(audioInput) {
    captureSession.addInput(audioInput)
} else {
    fatalError("Failed to add audio input to capture session")
}

// 创建音频输出
let audioOutput = AVCaptureAudioDataOutput()
let audioSampleBufferDelegate = AudioSampleBufferDelegate()
audioOutput.setSampleBufferDelegate(audioSampleBufferDelegate, queue: DispatchQueue.main)

// 将音频输出添加到会话
if captureSession.canAddOutput(audioOutput) {
    captureSession.addOutput(audioOutput)
} else {
    fatalError("Failed to add audio output to capture session")
}

// 开始采集音频数据
captureSession.startRunning()

// 停止采集音频数据
captureSession.stopRunning()

// 获取音频数据
let audioSamples = audioSampleBufferDelegate.audioData

上述代码创建了一个AVCaptureSession来采集音频数据。通过AVCaptureAudioDataOutputSampleBufferDelegate代理方法captureOutput(_:didOutput:from:)来获取音频样本缓冲区数据,并将其存储在audioData数组中。最后,可以通过访问audioSampleBufferDelegate.audioData来获取完整的1秒音频样本缓冲区数据,其中包含了44100个浮点值。

相关内容

热门资讯

解密一下!广西优乐免费辅助,陕... 解密一下!广西优乐免费辅助,陕西奇迹打锅子破解,确实是真的有挂(哔哩哔哩)1、让任何用户在无需广西优...
科普一下!陕西三带辅助,新九天... 科普一下!陕西三带辅助,新九天辅助,总是存在有挂(哔哩哔哩)该软件可以轻松地帮助玩家将陕西三带辅助外...
揭幕一下!闲聚辅助器,八仙游戏... 揭幕一下!闲聚辅助器,八仙游戏辅助,都是是真的有挂(哔哩哔哩)1、进入游戏-大厅左侧-新手福利-激活...
详细一下!多乐够级辅助,浙江游... 详细一下!多乐够级辅助,浙江游戏大厅修改器,原来有挂(哔哩哔哩)多乐够级辅助透视方法中分为三种模型:...
解谜一下!小程序牵手跑得有外挂... 解谜一下!小程序牵手跑得有外挂吗,人海大厅脚本,原来是真的有挂(哔哩哔哩)1、进入到小程序牵手跑得有...
开挂一下!内蒙麻将外卦神器下载... 开挂一下!内蒙麻将外卦神器下载,上饶中至能操控吗,本来真的是有挂(哔哩哔哩)内蒙麻将外卦神器下载透视...
教你一下!点我达辅助,玄龙辅助... 教你一下!点我达辅助,玄龙辅助工具,原来有挂(哔哩哔哩)1、点我达辅助免费辅助多个强度级别选择2、点...
曝光一下!钱塘十三水透视,一起... 曝光一下!钱塘十三水透视,一起宁德钓蟹辅助器,竟然存在有挂(哔哩哔哩)1、钱塘十三水透视透视辅助软件...
解密一下!决战十三水辅助,吉祥... 解密一下!决战十三水辅助,吉祥填大坑技巧,确实是真的有挂(哔哩哔哩)1、完成决战十三水辅助有辅助插件...
了解一下!微信小程序微乐辅助器... 了解一下!微信小程序微乐辅助器破解版,葫芦娃七子降妖破解版内购,本来真的是有挂(哔哩哔哩)1、微信小...