gpt4 book ai didi

iphone - iOS - 缩放和裁剪 CMSampleBufferRef/CVImageBufferRef

转载 作者:IT王子 更新时间:2023-10-29 08:00:48 47 4
gpt4 key购买 nike

我正在使用 AVFoundation 并从 AVCaptureVideoDataOutput 获取样本缓冲区,我可以使用以下方法将其直接写入 videoWriter:

- (void)writeBufferFrame:(CMSampleBufferRef)sampleBuffer {
CMTime lastSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
if(self.videoWriter.status != AVAssetWriterStatusWriting)
{
[self.videoWriter startWriting];
[self.videoWriter startSessionAtSourceTime:lastSampleTime];
}

[self.videoWriterInput appendSampleBuffer:sampleBuffer];

}

我现在想做的是裁剪和缩放 CMSampleBufferRef 中的图像,而不将其转换为 UIImage 或 CGImageRef,因为这会降低性能。

最佳答案

如果您使用 vimage,您可以直接处理缓冲区数据而无需将其转换为任何图像格式。

outImg 包含裁剪和缩放的图像数据。 outWidthcropWidth 之间的关系设置缩放比例。 vimage cropping

int cropX0, cropY0, cropHeight, cropWidth, outWidth, outHeight;

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);

vImage_Buffer inBuff;
inBuff.height = cropHeight;
inBuff.width = cropWidth;
inBuff.rowBytes = bytesPerRow;

int startpos = cropY0*bytesPerRow+4*cropX0;
inBuff.data = baseAddress+startpos;

unsigned char *outImg= (unsigned char*)malloc(4*outWidth*outHeight);
vImage_Buffer outBuff = {outImg, outHeight, outWidth, 4*outWidth};

vImage_Error err = vImageScale_ARGB8888(&inBuff, &outBuff, NULL, 0);
if (err != kvImageNoError) NSLog(@" error %ld", err);

因此将cropX0 = 0cropY0 = 0 以及cropWidthcropHeight 设置为原始大小意味着没有裁剪(使用整个原始图像)。设置 outWidth = cropWidthoutHeight = cropHeight 不会导致缩放。请注意,inBuff.rowBytes 应始终是完整源缓冲区的长度,而不是裁剪后的长度。

关于iphone - iOS - 缩放和裁剪 CMSampleBufferRef/CVImageBufferRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8493583/

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