macOS/swift 使用 AVCaptureSession 捕获音频

2023-11-26

我目前正在尝试在我的 Mac 上实现一个简单的录音工具。由于我需要内存中的原始音频缓冲区,因此我无法使用 AVAudioRecorder,它只会将录音写入文件。

我的方法是创建 AVCaptureSession、输入(麦克风)和输出(AVCaptureAudioDataOutput)并启动会话。 然而一切都很好委托回调输出是从未打电话过.

我确保在项目设置中添加麦克风/摄像头权限(以防万一)。

也许有人可以帮我解决这个问题!

这是我的代码:

import Foundation
import AVFoundation

class AudioCaptureSession: NSObject, AVCaptureAudioDataOutputSampleBufferDelegate {

    let settings = [
        AVFormatIDKey: kAudioFormatMPEG4AAC,
        AVNumberOfChannelsKey : 1,
        AVSampleRateKey : 44100]
    let captureSession = AVCaptureSession()

    override init() {
        super.init()

        let queue = DispatchQueue(label: "AudioSessionQueue", attributes: [])
        let captureDevice = AVCaptureDevice.default(for: AVMediaType.audio)
        var audioInput : AVCaptureDeviceInput? = nil
        var audioOutput : AVCaptureAudioDataOutput? = nil

        do {
            try captureDevice?.lockForConfiguration()
            audioInput = try AVCaptureDeviceInput(device: captureDevice!)
            captureDevice?.unlockForConfiguration()
            audioOutput = AVCaptureAudioDataOutput()
            audioOutput?.setSampleBufferDelegate(self, queue: queue)
            audioOutput?.audioSettings = settings
        } catch {
            print("Capture devices could not be set")
            print(error.localizedDescription)
        }

        if audioInput != nil && audioOutput != nil {
            captureSession.beginConfiguration()
            if (captureSession.canAddInput(audioInput!)) {
                captureSession.addInput(audioInput!)
            } else {
                print("cannot add input")
            }
            if (captureSession.canAddOutput(audioOutput!)) {
                captureSession.addOutput(audioOutput!)
            } else {
                print("cannot add output")
            }
            captureSession.commitConfiguration()

            print("Starting capture session")
            captureSession.startRunning()
        }
    }

    func captureOutput(_ output: AVCaptureOutput,
                       didOutput sampleBuffer: CMSampleBuffer,
                       from connection: AVCaptureConnection) {

        print("Audio data recieved")
    }
}

这是为我召唤的。你没有展示你如何使用它,但也许你的AudioCaptureSession超出范围并被释放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

macOS/swift 使用 AVCaptureSession 捕获音频 的相关文章

随机推荐

  • 如何解决 wsdl2java 上 ObjectFactory 中的冲突?

    我在用着CXF and wsdl2java自动生成Web服务类 问题 不知何故 我想要连接的网络服务的某些元素有重复的名称 Two declarations cause a collision in the ObjectFactory cl
  • 获取 java.time.chrono.HijrahDate 实例的月份名称

    HijrahDate hd HijrahChronology INSTANCE date LocalDate of 2014 11 25 如果我们有HijrahDate实例 预计有一个方法UmalquraCalendar API显示月份名称
  • 我可以将 Must_use 应用于函数结果吗?

    我有一个函数返回一个f64 我想确保使用该函数的输出 而不是仅仅忽略它 有什么办法可以做到这一点吗 返回类型不用于错误处理 因此将其包装在Result or Option确实没有意义 我想要类似的东西 must use fn calcula
  • 两个 .net 程序集之间的循环引用

    我有两个程序集 A 和 B A 已存在对 B 的引用 并且必须保持这种状态 现在我对B做了一些修改 需要引用A 所以就出现了循环引用 一些细节 A 有一些属性网格 B 中的对话框需要托管这些属性网格 因此 为了避免这种循环引用问题 我尝试在
  • 交换字符串中的字母

    我需要按照以下规则交换字符串中的字母 A 被 T 取代 T 被替换为 A C 被 G 取代 G 被 C 取代 例如 ACGTA应该成为TGCAT 解决这个问题的最佳方法是什么 正在寻找java A to T T to A 找到了这个建议 S
  • 如何调试/记录 wsgi python 应用程序?

    我试过这个 usr bin python from wsgiref simple server import make server from cgi import parse qs escape import logging import
  • 为什么 object.__new__ 在这两种情况下工作方式不同?

    Python 版本 2 7 3 默认 2013 年 4 月 10 日 06 20 15 n GCC 4 6 3 我有这个 gt gt gt class testclass1 object pass gt gt gt class testcl
  • WPF:ContentPresenter 上的 TextTrimming

    有没有一种简单的方法可以让 TextTrimming 与 ContentPresenter 一起使用 我有 TextBlock 和 AccessText 的隐式样式 其中 TextTrimming 设置为 CharacterEllipsis
  • 具有特征的 Scala 和 Mockito

    我有一个简单的类 它自然地分为两部分 所以我重构为 class Refactored extends PartOne with PartTwo 然后单元测试开始失败 下面是重现该问题的尝试 所有三个示例的功能都是相同的 但第三个测试失败并出
  • 指向结构的指针的大小[重复]

    这个问题在这里已经有答案了 我试图记住 C 编程的基础知识 并且关于结构体指针 我正在执行以下操作 include
  • Google Apps 脚本国际化 (i18n)

    这些文档似乎没有提及任何内容 是否有关于如何在 Google Apps 脚本中执行 i18n 的推荐方法 尤其是作为 WebApp 发布的 有没有办法找出用户的区域设置 Session getActiveUserLocale 应返回区域设置
  • CodeIgniter POST/GET 默认值

    如果 POST GET 数据为空 假 我可以设置默认值吗 this gt input gt post varname value if falsy 所以我不必像这样编码 a this gt input gt post varname thi
  • 非 void 函数中的空返回是未定义的行为吗?

    阅读有关该主题的答案后控制到达非 void 函数的末尾我没有看到任何专门针对以空退出非 void 函数的情况的答案return陈述 int return integer return empty return in non void fun
  • 我想通过蓝牙设备强制打开键盘

    我有一个蓝牙条形码设备 如果将蓝牙设备连接到 iPhone 我无法使用 iPhone 键盘写任何内容 您已经知道iPhone键盘不会显示 因为蓝牙设备已识别键盘 但 当 iPhone 连接蓝牙设备时 我必须通过键盘在文本框中写入一些内容 请
  • 如何在 Windows 上正确地将拉丁字符打印到 C++ 控制台?

    我在用 C 将法语字符写入控制台时遇到问题 该字符串是从文件中加载的std ifstream and std getline然后使用打印到控制台std cout 以下是该字符串在文件中的内容 该链对应于代码 TEST CODE 并且与语言环
  • 为什么 Ruby 只允许某些运算符重载

    在 Ruby 中 与许多其他面向对象编程语言一样 运算符是可重载的 但是 只有某些字符运算符可以重载 此列表可能不完整 但以下是一些不能重载的运算符 not and or 吉姆 韦里奇
  • 如何将 PHP 的内存限制增加到 2GB 以上?

    我在增加 PHP 作为 Apache 模块的内存限制时遇到问题 如果我将以下指令放入 Apache 配置中 则可以正常工作 php value memory limit 1 99G 但是超过2GB就不行了 它把这个值恢复到128MB 这里有
  • Google Plus API 和照片?

    据我了解 没有官方的 G API 用于从相册中获取照片 但我已经弄清楚了hereGoogle Plus 在内部使用 Picasa 我的问题是 是否可以仅通过 G API Picasa userId 找出 如果是 如果我只有 Google P
  • XCTest 中的 IOS -NSRunLoop:如何让运行循环在单元测试中工作?

    好的 我环顾四周 没有找到我的问题的确切答案 我正在尝试在单元测试 而不是主要运行 中测试超时处理程序 问题似乎在于 NSRunLoop mainRunLoop 单元测试中的运行方式与标准运行中的运行方式不同 我以这种方式进行超时 NSTi
  • macOS/swift 使用 AVCaptureSession 捕获音频

    我目前正在尝试在我的 Mac 上实现一个简单的录音工具 由于我需要内存中的原始音频缓冲区 因此我无法使用 AVAudioRecorder 它只会将录音写入文件 我的方法是创建 AVCaptureSession 输入 麦克风 和输出 AVCa