gpt4 book ai didi

ios - 如何调整/缩放 MTLTexture

转载 作者:行者123 更新时间:2023-12-01 16:20:12 26 4
gpt4 key购买 nike

我有一个 MTLTexture,它是它出现在 MTLView 中的大小。但是,我正在将纹理写入 AVAssetWriterInputPixelBufferAdaptor 以录制需要纹理的视频标准视频尺寸,即 1280x720。

目前我正在使用 MTLRegionMake2D 指定纹理中要提取的区域。在宽度较长的手机上,裁剪效果并不那么明显。但是在形状和尺寸都比较方形的 iPad 上,剪裁很明显。理想情况下,我会先将纹理调整为与视频相同的宽度或高度,然后裁剪其余部分(而不是仅仅裁剪)。

调整 MTLTexture 大小的合适方法是什么?

示例代码:

guard let pixelBufferPool = assetWriterPixelBufferInput.pixelBufferPool else { return }

var maybePixelBuffer: CVPixelBuffer? = nil
let status = CVPixelBufferPoolCreatePixelBuffer(nil, pixelBufferPool, &maybePixelBuffer)
if status != kCVReturnSuccess { return }

guard let pixelBuffer = maybePixelBuffer else { return }

CVPixelBufferLockBaseAddress(pixelBuffer, [])
let pixelBufferBytes = CVPixelBufferGetBaseAddress(pixelBuffer)!

let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)
let region = MTLRegionMake2D(0, 0, Int(videoSize.width), Int(videoSize.height))

texture.getBytes(pixelBufferBytes, bytesPerRow: bytesPerRow, from: region, mipmapLevel: 0)

let frameTime = CACurrentMediaTime()
let presentationTime = CMTimeMakeWithSeconds(frameTime, 240)
assetWriterPixelBufferInput.append(pixelBuffer, withPresentationTime: presentationTime)

CVPixelBufferUnlockBaseAddress(pixelBuffer, [])

最佳答案

最后我使用了MPSImageLanczosScale来缩放纹理,见:

Apple 文档: https://developer.apple.com/documentation/metalperformanceshaders/mpsimagelanczosscale

例子: Crop and scale MTLTexture

重新缩放后,我仍然需要使用一个区域来裁剪剩余部分。我有一些逻辑来检测肖像/风景,以及平板电脑或手机来确定合适的裁剪。在我的例子中(对于纵向),我选择垂直居中以裁剪顶部/底部的瘦设备(手机),并选择水平居中以裁剪左/右的宽设备(平板电脑)。对景观有类似的逻辑,但相反。

关于ios - 如何调整/缩放 MTLTexture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62369041/

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