2015-06-12 45 views
1

我們使用UIImage中的AVAssetWriter導出視頻,這些視頻首先轉換爲CVPixelBufferRef,但圖像在視頻中由160像素高的黑色「酒吧」底部的空像素。iOS AVAssetWriter當從UIImages導出時視頻高度「Squished」

鑑於圖像是640x480,可以看到160像素的黑條 - 這就好像圖像被旋轉並且底部丟失了一樣 - 但是 - 當我們看視頻圖像時 - 高度相同圖像被捕獲 - 它只是「擠壓」,以適應黑色條。

下面是我們的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; 
} 

回答

0

我們發現原因是我們正在運行的代碼是爲視頻的每個現有UIImage添加UIImage徽標。添加徽標的代碼實際上會導致原始圖像的底部被切斷。

由於徽標操作的結果是橫跨底部的條形碼圖像,因此不清楚徽標書寫是否是問題的根源。白色條紋與背景混合在一起,我們沒有看到圖像被剪切。

一旦我們刪除了UIImage組合代碼 - 我們發現我們的視頻正在正確生成,並且底部沒有黑條。

我們修復了將兩個UIImages結合在一起的代碼,並正確編寫了徽標,現在正在製作沒有黑條的視頻。

相關問題