AVCaptureSession音频预览

时间:2018-01-30 16:18:58

标签: ios swift4 avcapturesession avcapturedevice avcaptureoutput

我提前为“愚蠢”的问题道歉,但我觉得我已经用尽所有资源了。我对Swift和编码总体上几乎没有经验,但我基于过去的经验和使用基于对象的编程(如MAX MSP)了解很多。

我正在尝试为macOS QuickTime Player录制功能开发相机/麦克风捕捉iOS应用程序(回答我自己对RAW相机访问的需求,因为我真的找不到合适的东西!)。

成功实施了AVCaptureSession视频输出后,我尝试了很多向Quicktime发送音频的方法(包括AVAudioSessionPortUSBAudio)无济于事。这是在我意识到QuickTime自动捕获iOS系统音频输出之前。

所以我的假设是我能够轻松地在AVCapture Session下预览音频;不是这样!似乎AVCaptureAudioPreviewOutput在swift4中“不可用”或者我很简单地遗漏了一些基础知识。我看过堆栈上的文章提到需要停止音频处理,所以我希望它很容易预览/监控它。

你们有没有人能指出我在AVCaptureSession中预览音频的方法?我还有一个实例化的AVAudioSession(我的原始尝试),并且还管理(我希望)成功将麦克风连接到AVCaptureSession。但是,我不确定还能用什么!我的目标:只是听到系统音频输出上的麦克风输入:Quicktime连接应该(希望)处理从USB端口捕获(当iOS设备被选为麦克风时,手机上播放的音乐会通过USB播放)。 / p>

    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时会出现问题。

任何帮助都会受到衷心的感谢,我相信你们中的许多人都会睁大眼睛,能够轻易指出我的错误!

谢谢,

伊万

1 个答案:

答案 0 :(得分:0)

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)
        }
    }
}
相关问题