gpt4 book ai didi

swift - 不使用 setSampleBufferDelegate 调用 captureOutput 函数

转载 作者:IT王子 更新时间:2023-10-29 05:22:11 26 4
gpt4 key购买 nike

我开始开发 iOS 应用程序,这是我的第一篇 SO 帖子。我正在尝试实现一个 UI View ,它可以显示后置摄像头的预览视频并处理捕获的帧。我的预览层工作得很好,我可以在我的 UI View 中看到图片显示。但是,从未调用 captureOutput 函数。

我在网上搜索类似的问题和解决方案有一段时间了,并尝试调整不同的东西,包括输出、连接和调度队列设置,但都没有奏效。任何人都可以帮助我或分享一些见解和方向吗?非常感谢!

这是我的代码,我使用 Xcode 11 betaiOS 10 作为构建目标。

class ThreeDScanningViewController: UIViewController, 
AVCaptureVideoDataOutputSampleBufferDelegate {

@IBOutlet weak var imageView: UIImageView!

var session : AVCaptureSession!
var device : AVCaptureDevice!
var output : AVCaptureVideoDataOutput!
var previewLayer : AVCaptureVideoPreviewLayer!

override func viewDidLoad() {
super.viewDidLoad()
//NotificationCenter.default.addObserver(self, selector: #selector(self.startedNotif), name: NSNotification.name.CaptureSessionDidStartRunningNotification, object: nil)

func initCamera() -> Bool {
session = AVCaptureSession()
session.sessionPreset = AVCaptureSession.Preset.medium

let devices = AVCaptureDevice.devices()

for d in devices {
if ((d as AnyObject).position == AVCaptureDevice.Position.back) {
device = d as! AVCaptureDevice
}
}
if device == nil {
return false
}

do {
// Set up the input

let input : AVCaptureDeviceInput!
try input = AVCaptureDeviceInput(device: device)

if session.canAddInput(input) {
session.addInput(input)
} else {
return false
}

// Set up the device

try device.lockForConfiguration()
device.activeVideoMinFrameDuration = CMTimeMake(1, 15)
device.unlockForConfiguration()

// Set up the preview layer

previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.frame = imageView.bounds
imageView.layer.addSublayer(previewLayer)

// Set up the output

output = AVCaptureVideoDataOutput()
output.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString) as String: kCVPixelFormatType_32BGRA]

let queue = DispatchQueue(label: "myqueue")
output!.setSampleBufferDelegate(self, queue: queue)

output.alwaysDiscardsLateVideoFrames = true

if session.canAddOutput(output) {
session.addOutput(output)
} else {
return false
}

for connection in output.connections {
if let conn = connection as? AVCaptureConnection {
if conn.isVideoOrientationSupported {
conn.videoOrientation = AVCaptureVideoOrientation.portrait
}
}
}

session.startRunning()

} catch let error as NSError {
print(error)
return false
}

return true
}

func captureOutput (captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
print("captureOutput!\n");
DispatchQueue.main.async(execute: {
// Do stuff
})
}
}

以下是我查看过的一些链接,但没有一个与解决我的问题相关:

最佳答案

我终于找到了问题的原因。您需要确保为 Swift 3 语法的 captureOutput 函数使用正确的函数签名。

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)

func captureOutput(_ output: AVCaptureOutput, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)

我使用的是旧版本的 Swift 语法,编译器没有警告我这个问题!更正函数签名后,captureOutput 函数被漂亮地调用了:-)

关于swift - 不使用 setSampleBufferDelegate 调用 captureOutput 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45628283/

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