swift - 相机输入的尺寸为一像素一像素

标签 swift avfoundation

这是一个相当奇怪的请求,但我希望构建一个具有实时摄像头占据整个屏幕的应用程序。但是,它不会显示正常分辨率,而是全部为一种颜色。特别是,我想采用通常是屏幕上中间像素的颜色,并使其占据整个屏幕。它需要实时快速地完成。

我尝试创建一个函数,将 capturesession 保存为 uiimage,然后从中获取像素数据,但是,事实证明它实时速度很慢。有什么建议吗?

最佳答案

假设您有 AVCaptureSession 设置。您需要设置 AVCaptureVideoDataOutput,然后设置其示例缓冲区委托(delegate)。委托(delegate)类应该覆盖 func captureOutput(AVCaptureOutput!, CMSampleBuffer!, AVCaptureConnection!) 。在此函数中,您可以访问像素缓冲区以对中心点进行采样。你可以按照下面的方法来做。我已将中心点的实际采样留给了您。

class MyClass : NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {

    func addVideoOutput() {
        // Add video data output.
        if session.canAddOutput(videoDataOutput)
        {
            videoDataOutput.setSampleBufferDelegate(self, queue: sessionQueue)
            videoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as NSString:Int(kCVPixelFormatType_32BGRA)]

            videoDataOutput.alwaysDiscardsLateVideoFrames = true
            session.addOutput(videoDataOutput)
        }
    }

    // AVCaptureVideoDataOutputSampleBufferDelegate
    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
        if let buffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
            process(pixelBuffer: buffer)
        }
    }
    func process(pixelBuffer: CVPixelBuffer) {
        let sourceRowBytes = CVPixelBufferGetBytesPerRow( pixelBuffer );
        let width = CVPixelBufferGetWidth( pixelBuffer );
        let height = CVPixelBufferGetHeight( pixelBuffer );

        let rt = CVPixelBufferLockBaseAddress( pixelBuffer, .readOnly );
        if (rt == kCVReturnSuccess) {
            ... 
            Do your processing of the pixeldata here
            ...
            CVPixelBufferUnlockBaseAddress(pixelBuffer, .readOnly)
        }
    }

    private let session = AVCaptureSession()
    private let sessionQueue = DispatchQueue(label: "session queue", attributes: [], target: nil) // Communicate with the session     
    private let videoDataOutput = AVCaptureVideoDataOutput()
}

关于swift - 相机输入的尺寸为一像素一像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44231055/

相关文章:

ios - 在按下不同标签的 UIButton 上播放声音

swift - 使用 AVFoundation 和 Swift 访问多个音频硬件输出/ channel

ios - 如何存储数据(来自文本字段的用户输入)

ios - 添加可访问性自定义 slider iOS

ios - 如何在iOS中找到 "NFC Tag Identifier"

ios - AVFoundation 停止

cocoa - 为什么加载后 AVURLAsset 的 track 数组为空?

swift - requestRecordPermission 在 ios10 xcode 8 beta 3 中不起作用

ios - 使用 Xcode 7 Swift2 更改 MKMapView 上的图钉图像

ios - 在应用程序处于后台时更改状态栏中的文本