插帧算法适用于平滑慢放/帧率提升。该算法不支持实时将相机流作为输入,只支持从相册中导入视频的输入方式。
V4.4.0新增算法
支持平台 | Android、iOS |
---|---|
支持输入格式 | RGBA8888、BGRA8888 |
内存占用 | <42M (测试设备OPPO R11) |
检测速度 | <79ms(测试设备OPPO R11) |
该插帧策略仅供参考,与sample内示例一致。
假设输入视频为20fps,在插帧倍率为0.5的情况下:
帧号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
原视频时间戳(ms) | 0 | 50 | 100 | 150 | 200 | 250 | 300 | 350 |
预期时间戳(ms) | 0 | 25 | 50 | 75 | 100 | 125 | 150 | 175 |
是否插帧 | 否 | 是 | 否 | 是 | 否 | 是 | 否 | 是 |
使用帧号 | 1 | 0.5插帧 | 2 | 0.5插帧 | 3 | 0.5插帧 | 4 | 0.5插帧 |
输入视频为20fps,在插帧倍率为0.8的情况下:
帧号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
原视频时间戳(ms) | 0 | 50 | 100 | 150 | 200 | 250 | 300 | 350 |
预期时间戳(ms) | 0 | 40 | 80 | 120 | 160 | 200 | 240 | 280 |
是否插帧 | 否 | 是 | 否 | 否 | 否 | 否 | 是 | 否 |
使用帧号 | 1 | 0.8插帧 | 2 | 3 | 4 | 5 | 0.8插帧 | 6 |
总结:在视频正常播放的情况下,对预期时间戳位置缺帧的位置进行插帧。
详细接口说明查看头文件:bef_ai_image_quality_enhancement_vfi.h
BEF_SDK_API bef_effect_result_t bef_ai_image_quality_enhancement_vfi_create(bef_image_quality_enhancement_handle *handle, bef_ai_vfi_init_config* config); typedef struct bef_ai_vfi_init_config { const char* kernelBinPath; // 可读写的路径 bef_ai_lens_vfi_type type; // 插帧的类型 bef_ai_lens_power_level level; //iOS端无需设置 bef_ai_lens_vfi_data_type dataType; // 插帧输的的输入输出类型 }bef_ai_vfi_init_config;
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_image_quality_enhancement_handle* | 创建的插帧算法句柄 |
config | bef_ai_vfi_init_config* | 算法初始化时的配置参数 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
支持纹理或buffer的输入,只需选择一种作为输入,texture不使用,置成-1或0
BEF_SDK_API bef_effect_result_t bef_ai_image_quality_enhancement_vfi_process(bef_image_quality_enhancement_handle handle, bef_ai_vfi_process_config* config, bef_ai_lens_vfi_data *output); typedef struct bef_ai_vfi_process_config { int textureIdP; //第一帧的纹理id int textureIdN; //第二帧的纹理id,如果LensVideoVFIParam设置的inputFrameNum为2,则必须设置这个纹理ID void* buffer; //第一帧的buffer void* backBuffer; //第二帧的buffer int width; //输入图像的宽 int height; //输入图像的高 int strideW; //输入图像x方向的stride int strideH; //输入图像y方向的stride //flag帧标志 // 对于每次输入一帧测case:0表示第一帧,1表示更新帧,2表示不更新帧,更新timeStamp(用于两帧间插多帧的case) // 对于每次输入两帧测case:0或1表示更新帧,2表示不更新帧,更新timeStamp(用于两帧间插多帧的case) int flag; int open; //插帧动态开关 float timeStamp; //帧间插帧位置,例如:0.5表示在两帧中间插帧,0.1表示在离第一帧0.1的位置插帧 float scaleX; //x方向缩放系数 float scaleY; //y方向缩放系数 }bef_ai_vfi_process_config; typedef union bef_ai_lens_vfi_data{ int texture; // 如果是纹理,这里纹理的index, ios 的纹理目前只支持metal的纹理, android 需要oes 纹理,且纹理放在0 位置 void* buffer; // 如果是数据输入,iOS 传入pixelBuffer的指针 }bef_ai_lens_vfi_data;
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_image_quality_enhancement_handle | 插帧算法句柄 |
config | const bef_ai_vfi_process_config* | 算法初始化时的配置参数 |
output | bef_ai_lens_vfi_data* | 插帧算法输出 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
BEF_SDK_API bef_effect_result_t bef_ai_image_quality_enhancement_vfi_destroy(bef_image_quality_enhancement_handle handle);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_image_quality_enhancement_handle | 插帧算法的句柄 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
// 离线license检测方式 BEF_SDK_API bef_effect_result_t bef_ai_image_quality_enhancement_vfi_check_license( bef_image_quality_enhancement_handle handle, const char* license_path); // 在线license检测方式 BEF_SDK_API bef_effect_result_t bef_ai_image_quality_enhancement_vfi_check_online_license( bef_image_quality_enhancement_handle handle, const char* license_path);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
handle | bef_image_quality_enhancement_handle | 插帧算法句柄 |
licensePath | const char * | 授权文件字符串 |
返回值
成功返回 BEF_RESULT_SUC, 失败返回相应错误码, 具体请参考 bef_effect_ai_public_define.h
接口说明
详细接口说明查看文件:com.bytedance.labcv.effectsdk.VideoFI.java
public int create(String rwDir, BytedEffectConstants.ImageQualityVfiType algoType, BytedEffectConstants.ImageQualityVfiDataType dataType, int inputFrame, BytedEffectConstants.ImageQulityPowerLevel level) public enum ImageQualityVfiType { IMAGE_QUALITY_VFI_TYPE_UM(0), //补帧 IMAGE_QUALITY_VFI_TYPE_COVER(1); //帧融合 }; public enum ImageQualityVfiDataType { IMAGE_QUALITY_VFI_DATA_TYPE_BUFFER_RGBA8888(0), IMAGE_QUALITY_VFI_DATA_TYPE_TEXTURE_RGBA8(1); } public enum ImageQulityPowerLevel { POWER_LEVEL_DEFAULT (0), POWER_LEVEL_LOW (1), POWER_LEVEL_NORMAL (2), POWER_LEVEL_HIGH (3), POWER_LEVEL_AUTO (4); }
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
rwDir | String | 插帧算法输出文件路径 |
algoType | ImageQualityVfiType | 插帧算法类型 |
dataType | ImageQualityVfiDataType | 输入类别为纹理或buffer |
inputFrame | int | 插帧算法输入帧数 |
level | ImageQulityPowerLevel | 使用的频率等级 |
返回值
成功返回BEF_RESULT_SUC,否则返回对应的错误码
public int processTexture( int textureIdP, int textureIdN, int width, int height, int flag, float scaleX, float scaleY, float timeStamp);
参数说明
参数名 | 参数类型 | 参数说明 |
---|---|---|
textureIdP | int | 第一帧纹理号 |
textureIdN | int | 第二帧纹理号 |
width | int | 输入图像宽 |
height | int | 输入图像高 |
flag | int | 帧标志 |
scaleX | float | x方向缩放系数 |
scaleY | float | y方向缩放系数 |
timeStamp | float | 帧间插帧位置 |
public void destroy()
答:建议首先查看以下tag输出Error类型的日志:
bef_effect_ai 和SMASH_E_LOG 以及 EffectSDK
错误码请参考错误码表