gpt4 book ai didi

ios - AVCaptureSession 音频预览

转载 作者:行者123 更新时间:2023-12-05 06:37:05 26 4
gpt4 key购买 nike

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

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

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

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

你们中的任何人都可以指出一种在 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 Session 时存在问题。

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

谢谢,

伊万

最佳答案

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

关于ios - AVCaptureSession 音频预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com