2012-10-31 4 views
2

Je suis en train de faire un encodeur de fichier h.264 native extension Adobe pour iOS. J'ai la partie codeur qui fonctionne. Il fonctionne très bien à partir d'un projet de test xcode. Le problème est que lorsque j'essaie de l'exécuter à partir du fichier ane, cela ne fonctionne pas.Adobe Native Extension iOS encodeur de fichier h.264

Mon code pour ajouter des images converties d'un bitmapData en CGImage:

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

    FREAcquireBitmapData(objectBitmapData, &bitmapData); 

    CGImageRef theImage = getCGImageRefFromBitmapData(bitmapData); 

    [videoRecorder addFrame:theImage]; 

Dans ce cas, le CGImageRef a données, mais lorsque je tente d'ouvrir la vidéo, il montre seulement un écran noir. Lorsque je le teste à partir d'un projet xcode, il enregistre également une vidéo à écran noir, mais si je crée le CGImage à partir d'un fichier UIImage, puis que je modifie ce CGImage et que je le passe à addFrame, cela fonctionne correctement.

Je suppose que CGImageRef theImage n'est pas créé correctement.

Le code que je utilise pour créer le CGImageRef est la suivante: https://stackoverflow.com/a/8528969/800836

Pourquoi le CGImage ne fonctionne pas très bien quand il est crée en utilisant le CGImageCreate?

Merci!

Répondre

1

Dans le cas où quelqu'un a le même problème, ma solution était de créer un CGImageRef avec 0 octets par ligne:

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); 

Copiez ensuite les données de pixels à ce tmpImage puis créer un nouveau basé sur cette image :

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; 
}