Используйте AVCaptureSession для чтения аудиофайлов

#swift #macos #audio #avcapturesession #avaudioengine

Вопрос:

В настоящее время у меня есть работающее приложение 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()
}
 

Приложение содержит другой код, позволяющий пользователю изменить выбранный файл в другой файл.

Я хотел бы изменить свое приложение, чтобы использовать AVCaptureSession его вместо AVAudioEngine того, чтобы использовать преимущества более тонкой детализации, которую оно предлагает. Существует множество примеров кода, показывающих, как использовать AVCaptureSession с микрофонным входом.

Но я не смог найти никакого кода или учебных пособий о том, как его использовать с вводом при чтении музыкальных файлов (аналогично приведенному выше коду).

Я даже не уверен, что это возможно. Возможно ли это? Если да, то как бы я этого добился?

Комментарии:

1. Возможно, вам помогло бы, если бы я объяснил, почему я хочу переключиться с использования AVAudio Engine на AVCaptureSession в качестве части захвата звука в моем приложении для визуализации музыки: используя подход AVAudio Engine с подключением к шине, я могу получить самую точную выборку звука (на моем iMac 2017 года под управлением macOS Big Sur) — 4 410 образцов каждые 0,1 секунды. С другой стороны, при использовании AVCaptureSession с микрофонным входом соответствующие числа составляют 512 выборок каждые 0,0116 секунды. Это обеспечивает гораздо меньшую задержку и гораздо более быструю частоту обновления. Если бы только я мог придумать способ для AVCaptureSession читать аудиофайлы …

Ответ №1:

На WWDC 2021 я попросил провести лабораторную сессию AVFoundation, чтобы задать этот вопрос. В итоге я поговорил с инженером из группы захвата камеры, но, к счастью, он был очень хорошо знаком с API Apple audio. Он подтвердил мне, что AVCaptureSession предназначен только для взаимодействия с аппаратными устройствами — и, следовательно, не будет работать для чтения файлов песен, как я хотел.

Он действительно обратил мое внимание на два программных продукта (Soundflower и Loopback), которые подключаются к шине аудиосистемы Apple и позволяют приложениям для разработчиков (например, моим) считывать с них необработанные аудиоданные, как если бы они были «микрофонным входом».

Он также пообещал передать команде AVAudio Engineering мое желание, чтобы они улучшили детализацию при нажатии на шину, чтобы предоставлять блоки звуковых сэмплов чаще, чем каждые 0,1 секунды.