iOS AVAssetWriter 视频高度 "Squished" 从 UIImages 导出时
iOS AVAssetWriter Video Height "Squished" when exported to from UIImages
我们使用 AVAssetWriter 从首先转换为 CVPixelBufferRef 的 UIImages 导出视频 - 但视频中的图像 "squished" 底部有 160 像素高的黑色 "bar" 空像素。
鉴于图像是 640x480,事实上看到了 160 像素的黑条 - 就好像图像被旋转并且底部丢失了 - 但是 - 当我们看视频图像时 - 相同的高度的图像被捕获 - 它只是 "squished" 以适应黑条。
下面是我们的 UIImage 到 CVBufferPixelRef 的代码。
知道是什么导致了这种行为吗?
- (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;
}
我们发现这是因为我们的代码 运行 向视频的每个现有 UIImage 添加了 UIImage 徽标。添加徽标的代码实际上导致原始图像的底部被切掉。
不清楚徽标书写是问题的根源,因为徽标操作的结果是图像底部有 白色 条。白色条与背景混合在一起,我们没有看到图像被剪裁。
一旦我们删除了 UIImage 组合代码 - 我们发现我们的视频制作正确并且底部没有黑条。
我们修复了组合两个 UIImage 的代码并正确编写了徽标,现在制作的视频没有黑条了。
我们使用 AVAssetWriter 从首先转换为 CVPixelBufferRef 的 UIImages 导出视频 - 但视频中的图像 "squished" 底部有 160 像素高的黑色 "bar" 空像素。
鉴于图像是 640x480,事实上看到了 160 像素的黑条 - 就好像图像被旋转并且底部丢失了 - 但是 - 当我们看视频图像时 - 相同的高度的图像被捕获 - 它只是 "squished" 以适应黑条。
下面是我们的 UIImage 到 CVBufferPixelRef 的代码。
知道是什么导致了这种行为吗?
- (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;
}
我们发现这是因为我们的代码 运行 向视频的每个现有 UIImage 添加了 UIImage 徽标。添加徽标的代码实际上导致原始图像的底部被切掉。
不清楚徽标书写是问题的根源,因为徽标操作的结果是图像底部有 白色 条。白色条与背景混合在一起,我们没有看到图像被剪裁。
一旦我们删除了 UIImage 组合代码 - 我们发现我们的视频制作正确并且底部没有黑条。
我们修复了组合两个 UIImage 的代码并正确编写了徽标,现在制作的视频没有黑条了。