【问题标题】:AVCaptureSession Audio previewAVCaptureSession 音频预览
【发布时间】:2018-01-30 16:18:58
【问题描述】:

我为这个“愚蠢”的问题提前道歉,但我觉得我已经用尽了所有资源。我对 Swift 和一般编码几乎没有经验,但根据过去的经验和对 MAX MSP 等基于对象的编程的使用,我了解很多。

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

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

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

谁能指出我在 AVCaptureSession 中预览音频的方法?我仍然有一个实例化的 AVAudioSession(我最初的尝试),并且也刚刚(我希望)成功地将麦克风连接到 AVCaptureSession。但是,我不确定还能使用什么!我的目标:只是听到系统音频输出上的麦克风输入:Quicktime 连接应该(希望)处理来自 USB 端口的捕获(当 iOS 设备被选为麦克风时,手机上播放的音乐通过 USB 传输)。

    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 存在问题。

任何帮助将不胜感激,我相信你们中的许多人会翻白眼并能够轻松指出我的错误!

谢谢,

伊万

【问题讨论】:

    标签: ios swift4 avcapturesession avcapturedevice avcaptureoutput


    【解决方案1】:

    AVCaptureAudioPreviewOutput 仅在 mac 上可用,但您可以改用 AVSampleBufferAudioRenderer。您必须手动将CMSampleBuffers 的音频排入队列,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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多