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 的代码并正确编写了徽标,现在制作的视频没有黑条了。