macOS/swift 使用 AVCaptureSession 捕获音频
macOS/swift Capture Audio with AVCaptureSession
我目前正在尝试在我的 Mac 上实现一个简单的录音工具。因为我需要内存中的原始音频缓冲区,所以我不能使用 AVAudioRecorder,它只会将录音写入文件。
我的方法是创建一个 AVCaptureSession、Input(Microphone) 和 Output(AVCaptureAudioDataOutput) 并启动会话。
一切正常,但是 输出的委托回调 从未被调用 。
我确保在项目设置中添加 mic/camera 权限(以防万一)。
也许有人可以帮我解决这个问题!
这是我的代码:
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
超出范围并被释放。
我目前正在尝试在我的 Mac 上实现一个简单的录音工具。因为我需要内存中的原始音频缓冲区,所以我不能使用 AVAudioRecorder,它只会将录音写入文件。
我的方法是创建一个 AVCaptureSession、Input(Microphone) 和 Output(AVCaptureAudioDataOutput) 并启动会话。 一切正常,但是 输出的委托回调 从未被调用 。
我确保在项目设置中添加 mic/camera 权限(以防万一)。
也许有人可以帮我解决这个问题!
这是我的代码:
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
超出范围并被释放。