使用 AVCaptureSession 读取音频文件

Posted

技术标签:

【中文标题】使用 AVCaptureSession 读取音频文件【英文标题】:Use AVCaptureSession to Read Audio Files 【发布时间】:2021-04-28 17:12:01 【问题描述】:

我目前有一个用于音乐可视化的 macOS 应用程序,使用 AVAudioEngine 读取音乐文件。它包含以下 swift 代码(为清楚起见,省略了无关代码):

import AVFoundation
class AudioManager: ObservableObject 
    static let audioManager = AudioManager()
    var selectedSongURL = Bundle.main.url(forResource: "music", withExtension: "mp3"
    var engine : AVAudioEngine!
    engine = AVAudioEngine()
    let player = AVAudioPlayerNode()
    do 
        let audioFile = try AVAudioFile(forReading: selectedSongURL!)
        player.scheduleFile(audioFile, at: nil, completionHandler: nil)
    
    player.play()

该应用包含其他代码,允许用户将 selectedSongURL 更改为不同的文件。

我想将我的应用更改为使用AVCaptureSession 而不是AVAudioEngine,以利用它提供的更精细的粒度。有许多代码示例展示了如何将AVCaptureSession 与麦克风输入一起使用。

但是,我找不到任何代码或教程,说明如何通过读取音乐文件的输入来使用它(类似于上面的代码)。

我不确定这是否可能。是否可以?如果是这样,我将如何做到这一点?

【问题讨论】:

如果我解释为什么我想从使用 AVAudioEngine 切换到 AVCaptureSession 作为我的音乐可视化应用程序的音频捕获部分,也许会有所帮助:使用 AVAudioEngine 的 Tap-on-bus 方法,最精细的音频我可以获得的采样(在运行 macOS Big Sur 的 2017 iMac 上)是每 0.1 秒 4,410 个采样。另一方面,使用带有麦克风输入的 AVCaptureSession,对应的数字是每 0.0116 秒 512 个样本。这提供了更低的延迟和更快的刷新率。要是我能想出一种方法让 AVCaptureSession 读取音频文件就好了…… 【参考方案1】:

在 WWDC 2021 上,我申请了 AVFoundation Lab 会议来提出这个问题。我最终与 Camera Capture 团队的一位工程师交谈,但幸运的是他非常熟悉 Apple 音频 API。他向我确认 AVCaptureSession 仅用于与硬件设备交互 - 因此无法按我的意愿读取歌曲文件。

他确实让我注意到了两个软件产品(Soundflower 和 Loopback),它们利用 Apple 的音频子系统总线并允许开发者应用程序(如我的)从中读取原始音频数据,就好像它们是“麦克风输入”一样。

他还承诺向 AVAudioEngine 团队传达我希望他们改进 Tap-on-bus 粒度以比每 0.1 秒更频繁地提供音频样本块的愿望。

【讨论】:

以上是关于使用 AVCaptureSession 读取音频文件的主要内容,如果未能解决你的问题,请参考以下文章

通话时 AVCaptureSession 的“空白”音频

没有音频处理的 AVCaptureSession 视频预览

向 AVCaptureSession 添加音频输入会停止 AVPlayer

使用 AVCaptureSession 和 AVAssetWriter 在翻转相机时无缝录制音频

iOS:AVCaptureSession 不会录制超过 11 秒的音频 [重复]

如何将多个音频 AVCaptureDevice 添加到 AVCaptureSession