我正在实现裁剪视频帧的自定义视频合成器。目前我使用Core Graphics来执行此操作:如何使用Metal API或Accelerate Framework绘制裁剪的位图?
-(void)renderImage:(CGImageRef)image inBuffer:(CVPixelBufferRef)destination {
CGRect cropRect = // some rect ...
CGImageRef currentRectImage = CGImageCreateWithImageInRect(photoFullImage, cropRect);
size_t width = CVPixelBufferGetWidth(destination);
size_t height = CVPixelBufferGetHeight(destination);
CGContextRef context = CGBitmapContextCreate(CVPixelBufferGetBaseAddress(destination), // data
width,
height,
8, // bpp
CVPixelBufferGetBytesPerRow(destination),
CGImageGetColorSpace(backImage),
CGImageGetBitmapInfo(backImage));
CGRect frame = CGRectMake(0, 0, width, height);
CGContextDrawImage(context, frame, currentRectImage);
CGContextRelease(context);
}
如何使用金属API执行此操作?它应该更快,对吗? 使用Accelerate Framework(vImage具体)怎么样?这会更简单吗?
你可以很容易地从CVMetalTextureRef到CGImageRef,然后到CVPixelBufferRef,但是如果你需要实时性能,我在同一个pickle中(试图找出如何获得CVPixelBufferRef) –