使用 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 添加音频输入会停止 AVPlayer
使用 AVCaptureSession 和 AVAssetWriter 在翻转相机时无缝录制音频