AVCaptureSession Audio Предварительный просмотр

Заранее извиняюсь за "тупой" вопрос, но чувствую, что исчерпал все ресурсы. У меня практически нет опыта работы со Swift и кодированием в целом, но я понимаю многое, основываясь на прошлом опыте и использовании объектно-ориентированного программирования, такого как MAX MSP.

Я пытаюсь разработать приложение iOS для захвата камеры / микрофона для функции записи MacOS QuickTime Player (отвечая на мою собственную потребность в доступе к камере в формате RAW, поскольку я буквально не мог найти нужную вещь!).

Успешно реализовав вывод видео AVCaptureSession, я перепробовал много способов отправки аудио в Quicktime (включая AVAudioSessionPortUSBAudio) безрезультатно. Это было до того, как я понял, что QuickTime автоматически захватывает аудиосигнал системы iOS.

Таким образом, я предполагал, что у меня будет возможность предварительного просмотра аудио в рамках AVCapture Session; не так! Кажется, AVCaptureAudioPreviewOutput в "недоступен" в swift4, или я просто пропускаю некоторые основы. Я видел статьи о стеке, в которых упоминается необходимость ОСТАНОВИТЬ обработку звука, поэтому я надеюсь, что ее легко просмотреть / отслеживать.

Может ли кто-нибудь из вас указать мне метод предварительного просмотра аудио в AVCaptureSession? У меня все еще есть экземпляр AVAudioSession (моя первоначальная попытка), и я только что сумел (надеюсь) успешно подключить микрофон к AVCaptureSession. Тем не менее, я не уверен, что еще использовать! Моя цель: просто услышать микрофонный вход на аудиовыходе системы: соединение Quicktime должно (надеюсь) обрабатывать захват с USB-порта (музыка, воспроизводимая на телефоне, переходит через usb, когда устройство iOS выбрано в качестве микрофона).

    let audioDevice = AVCaptureDevice.default(for: AVMediaType.audio)
    do {
        let audioInput = try AVCaptureDeviceInput(device: audioDevice!)
        self.captureSession.addInput(audioInput)
    } catch {
        print("Unable to add Audio Device")
    }

Я также пробовал другие вещи, от которых я теряюсь;

    captureSession.automaticallyConfiguresApplicationAudioSession = true

    func showAudioPreview() -> Bool { return true }

Возможно, можно использовать AVAudioSession вместе с захватом? Тем не менее, мои базовые знания указывают на тот факт, что есть проблемы с запуском Capture и Audio Sessions вместе.

Любая помощь будет искренне оценена, я уверен, что многие из вас закроют глаза и смогут легко указать на мои ошибки!

Спасибо,

Iwan

1 ответ

AVCaptureAudioPreviewOutputдоступен только на Mac, но вместо этого вы можете использовать AVSampleBufferAudioRenderer. Вы должны вручную поставить аудио в очередь CMSampleBufferк чему AVCaptureAudioDataOutputможет обеспечить:

      import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureAudioDataOutputSampleBufferDelegate {
    let session = AVCaptureSession()
    let bufferRenderSyncer = AVSampleBufferRenderSynchronizer()
    let bufferRenderer = AVSampleBufferAudioRenderer()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        bufferRenderSyncer.addRenderer(bufferRenderer)
        
        let audioDevice = AVCaptureDevice.default(for: .audio)!
        
        let captureInput = try! AVCaptureDeviceInput(device: audioDevice)
        
        let audioOutput = AVCaptureAudioDataOutput()
        audioOutput.setSampleBufferDelegate(self, queue: DispatchQueue.main) // or some other dispatch queue
        
        session.addInput(captureInput)
        session.addOutput(audioOutput)
        
        session.startRunning()
    }

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        bufferRenderer.enqueue(sampleBuffer)
        
        if bufferRenderSyncer.rate == 0 {
            bufferRenderSyncer.setRate(1, time: sampleBuffer.presentationTimeStamp)
        }
    }
}
Другие вопросы по тегам