//
|
// PixelBufferConverter.swift
|
// LiveProject
|
//
|
// Created by 倪路朋 on 6/30/25.
|
//
|
|
import Foundation
|
import CoreImage
|
import CoreVideo
|
|
|
class PixelBufferConverter {
|
private let ciContext = CIContext()
|
|
func convertBGRAtoNV12(_ srcBuffer: CVPixelBuffer) -> CVPixelBuffer? {
|
let width = CVPixelBufferGetWidth(srcBuffer)
|
let height = CVPixelBufferGetHeight(srcBuffer)
|
|
let attrs: [CFString: Any] = [
|
kCVPixelBufferPixelFormatTypeKey: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,
|
kCVPixelBufferWidthKey: width,
|
kCVPixelBufferHeightKey: height,
|
kCVPixelBufferIOSurfacePropertiesKey: [:]
|
]
|
|
var dstBuffer: CVPixelBuffer?
|
let status = CVPixelBufferCreate(nil, width, height, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, attrs as CFDictionary, &dstBuffer)
|
|
guard status == kCVReturnSuccess, let output = dstBuffer else {
|
print("❌ 创建 NV12 失败,状态: \(status)")
|
return nil
|
}
|
|
// 渲染
|
let ciImage = CIImage(cvPixelBuffer: srcBuffer)
|
|
CVPixelBufferLockBaseAddress(output, [])
|
ciContext.render(ciImage, to: output)
|
CVPixelBufferUnlockBaseAddress(output, [])
|
|
return output
|
}
|
}
|