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)
}
}
}