2012-10-31 60 views
2

我正在嘗試爲iOS創建一個adobe本機擴展h.264文件編碼器。我有編碼器部分工作。它從xcode測試項目運行良好。問題是,當我嘗試從ane文件運行它不起作用。Adob​​e本機擴展iOS h.264文件編碼器

我的代碼中添加從位圖數據轉換幀成CGImage:

//convert first argument in a bitmapData 
    FREObject objectBitmapData = argv[0]; 
    FREBitmapData bitmapData; 

    FREAcquireBitmapData(objectBitmapData, &bitmapData); 

    CGImageRef theImage = getCGImageRefFromBitmapData(bitmapData); 

    [videoRecorder addFrame:theImage]; 

在這種情況下,CGImageRef有數據,但是當我嘗試打開該視頻,只顯示黑屏。

當我從Xcode項目測試它也保存黑屏視頻,但如果我從UIImage文件創建CGImage,然後修改此CGImage並將其傳遞給addFrame,它工作正常。

我的猜測是CGImageRef theImage沒有創建正確。

我使用創建CGImageRef的代碼是這樣的:https://stackoverflow.com/a/8528969/800836

爲什麼CGImage工作不正常,當它是創建使用CGImageCreate?

謝謝!

回答

1

萬一有人有同樣的問題,我的解決方案是創建一個CGImageRef每行0字節:

CGBitmapInfo bitmapInfo  = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little; 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(NULL, 1024, 768, 8, /*bytes per row*/0, colorSpace, bitmapInfo); 
// create image from context 
CGImageRef tmpImage = CGBitmapContextCreateImage(context); 
CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 

然後像素數據複製到該tmpImage,然後創建基於該圖像一個新的:

CGImageRef getCGImageRefFromRawData(FREBitmapData bitmapData) { 
    CGImageRef abgrImageRef = tmpImage; 
    CFDataRef abgrData = CGDataProviderCopyData(CGImageGetDataProvider(abgrImageRef)); 
    UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(abgrData); 
    int length = CFDataGetLength(abgrData); 

    uint32_t* input = bitmapData.bits32; 
    int index2 = 0; 
    for (int index = 0; index < length; index+= 4) { 
      pixelData[index] = (input[index2]>>0) & 0xFF; 
      pixelData[index+1] = (input[index2]>>8) & 0xFF; 
      pixelData[index+2] = (input[index2]>>16) & 0xFF; 
      pixelData[index+3] = (input[index2]>>24) & 0xFF; 
      index2++; 
    } 


    // grab the bgra image info 
    size_t width = CGImageGetWidth(abgrImageRef); 
    size_t height = CGImageGetHeight(abgrImageRef); 
    size_t bitsPerComponent = CGImageGetBitsPerComponent(abgrImageRef); 
    size_t bitsPerPixel = CGImageGetBitsPerPixel(abgrImageRef); 
    size_t bytesPerRow = CGImageGetBytesPerRow(abgrImageRef); 
    CGColorSpaceRef colorspace = CGImageGetColorSpace(abgrImageRef); 
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(abgrImageRef); 

    // create the argb image 
    CFDataRef argbData = CFDataCreate(NULL, pixelData, length); 
    CGDataProviderRef provider = CGDataProviderCreateWithCFData(argbData); 
    CGImageRef argbImageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorspace, bitmapInfo, provider, NULL, true, kCGRenderingIntentDefault); 

    // release what we can 
    CFRelease(abgrData); 
    CFRelease(argbData); 
    CGDataProviderRelease(provider); 
return argbImageRef; 
}