2

iOS用のAdobeネイティブ拡張h.264ファイルエンコーダーを作成しようとしています。エンコーダー部分が動作しています。xcodeテストプロジェクトから正常に実行されます。問題は、aneファイルから実行しようとすると機能しないことです。

ビットマップデータから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に渡すと、正常に機能します。

私の推測では、CGImageReftheImageは正しく作成されていません。

CGImageRefを作成するために使用しているコードは次のとおりです:https ://stackoverflow.com/a/8528969/800836

CGImageCreateを使用して作成しているときにCGImageが正常に機能しないのはなぜですか?

ありがとう!

4

1 に答える 1

1

誰かが同じ問題を抱えている場合、私の解決策は、行あたり 0 バイトの CGImageRef を作成することでした。

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;
}
于 2012-11-15T19:18:23.287 に答える