首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改CVPixelBuffer

修改CVPixelBuffer
EN

Stack Overflow用户
提问于 2021-09-26 18:23:35
回答 1查看 53关注 0票数 0

我使用下面的方法将图形添加到像素缓冲区,然后将其附加到AVAssetWriterInputPixelBufferAdaptor

它可以在我的Mac mini (macOS 12 beta 7)上运行,但drawingHandler在我的MacBook (macOS 11.5.2)上什么都没有。

这段代码有什么问题吗?

代码语言:javascript
复制
#if os(macOS)
import AppKit
#else
import UIKit
#endif

import CoreMedia

extension CMSampleBuffer {
    
    func pixelBuffer(drawingHandler: ((CGRect) -> Void)? = nil) -> CVPixelBuffer? {
        guard let pixelBuffer = CMSampleBufferGetImageBuffer(self) else {
            return nil
        }
        guard let drawingHandler = drawingHandler else {
            return pixelBuffer
        }
        guard CVPixelBufferLockBaseAddress(pixelBuffer, .readOnly) == kCVReturnSuccess else {
            return pixelBuffer
        }
        
        let data = CVPixelBufferGetBaseAddress(pixelBuffer)
        let width = CVPixelBufferGetWidth(pixelBuffer)
        let height = CVPixelBufferGetHeight(pixelBuffer)
        let bitsPerComponent = 8
        let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let imageByteOrderInfo = CGImageByteOrderInfo.order32Little
        let imageAlphaInfo = CGImageAlphaInfo.premultipliedFirst
        
        if let ctx = CGContext(data: data,
                               width: width,
                               height: height,
                               bitsPerComponent: bitsPerComponent,
                               bytesPerRow: bytesPerRow,
                               space: colorSpace,
                               bitmapInfo: imageByteOrderInfo.rawValue | imageAlphaInfo.rawValue)
        {
            // Push
            #if os(macOS)
            let graphCtx = NSGraphicsContext(cgContext: ctx, flipped: false)
            NSGraphicsContext.saveGraphicsState()
            NSGraphicsContext.current = graphCtx
            #else
            UIGraphicsPushContext(ctx)
            #endif
            
            let rect = CGRect(x: 0, y: 0, width: width, height: height)
            drawingHandler(rect)
            
            // Pop
            #if os(macOS)
            NSGraphicsContext.restoreGraphicsState()
            #else
            UIGraphicsPopContext()
            #endif
        }
        
        CVPixelBufferUnlockBaseAddress(pixelBuffer, .readOnly)
        
        return pixelBuffer
    }
    
}
EN

回答 1

Stack Overflow用户

发布于 2021-09-27 01:42:58

更改锁定标志。

代码语言:javascript
复制
let lockFlags = CVPixelBufferLockFlags(rawValue: 0)

guard CVPixelBufferLockBaseAddress(pixelBuffer, lockFlags) == kCVReturnSuccess else {
    return pixelBuffer
}

// ...

CVPixelBufferUnlockBaseAddress(pixelBuffer, lockFlags)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69337767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档