Adobe本机扩展IOS H.264文件编码器



我正在尝试制作iOS的Adobe本机扩展名H.264文件编码器。我有编码器部分工作。它可以从Xcode测试项目中运行良好。问题是,当我尝试从ANE文件运行时,它不起作用。

我的代码添加从bitmapdata转换为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创建时不正常?

谢谢!

如果某人有相同的问题,我的解决方案是创建一个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;
}

最新更新