如何将FFMpeg获取的AVFrame转化为UIImage

如何将FFMpeg获取的AVFrame转化为UIImage

以下方法可以用AVPicture来转,但是现在AVPicture已经弃用

  • (UIImage*)imageFromAVFrame:(AVFrame *)avFrame
    {
    float width = avFrame->width;
    float height = avFrame->height;
    avpicture_free(&avPicture);
    avpicture_alloc(&avPicture, AV_PIX_FMT_RGB24, width, height); struct SwsContext * imgConvertCtx = sws_getContext(avFrame->width,
                                                     avFrame->height,
                                                     PIX_FMT_YUV420P,
                                                     width,
                                                     height,
                                                     AV_PIX_FMT_RGB24,
                                                     SWS_FAST_BILINEAR,
                                                     NULL,
                                                     NULL,
                                                     NULL);
    
    if(imgConvertCtx == nil) return nil; sws_scale(imgConvertCtx,
            avFrame->data,
            avFrame->linesize,
            0,
            avFrame->height,
            avPicture.data,
            avPicture.linesize);
    
    sws_freeContext(imgConvertCtx); CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CFDataRef data = CFDataCreate(kCFAllocatorDefault,
                                               avPicture.data[0],
                                               avPicture.linesize[0] * height);
    
    CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGImageRef cgImage = CGImageCreate(width,
                                     height,
                                     8,
                                     24,
                                     avPicture.linesize[0],
                                     colorSpace,
                                     bitmapInfo,
                                     provider,
                                     NULL,
                                     NO,
                                     kCGRenderingIntentDefault);
    
    UIImage *image = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    CGColorSpaceRelease(colorSpace);
    CGDataProviderRelease(provider);
    CFRelease(data); return image;
    }
清问如何在弃用AVPicture的情况下将AVFrame转化为UIImage