我们正在使用来自UIImages的AVAssetWriter导出视频,这些视频首先被转换为CVPixelBufferRef'但是图像是"压缩"在视频中由160像素高的黑色" bar"底部的空像素。
鉴于图像是640x480,可以看到160个像素的黑条 - 这就好像图像被旋转而底部丢失了 - 但是 - 当我们看视频图像时 - 相同的高度图像被捕获 - 它只是"压扁"适合黑色酒吧。
下面是我们对CVBufferPixelRef代码的UIImage。
可能导致此行为的任何想法?
- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image
{
ATHSingleton *singleton = [ATHSingleton singletons];
int height = singleton.screenHeight;
int width = singleton.screenWidth;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
nil];
CVPixelBufferRef pxbuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, 480,
640, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
&pxbuffer);
NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
NSParameterAssert(pxdata != NULL);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pxdata, width,
height, 8, 4*width, rgbColorSpace,
kCGImageAlphaNoneSkipFirst);
NSParameterAssert(context);
CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
CGContextDrawImage(context, CGRectMake(0, -80, 480, 640), image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
return pxbuffer;
}
答案 0 :(得分:0)
我们发现原因是我们正在运行的代码,它为视频的每个现有UIImage添加了一个UIImage徽标。添加徽标的代码实际上导致原始图像的底部被切断。
目前还不清楚徽标编写是问题的根源,因为徽标操作的结果是底部带有白色条的图像。白色条与背景混合,我们没有看到图像被剪裁。
一旦我们删除了UIImage组合代码 - 我们发现我们的视频正在生成,底部没有黑条。
我们修复了组合两个UIImages的代码并正确地编写了徽标,现在正在制作没有黑条的视频。