# RIFE **Repository Path**: zhou_lili/rife ## Basic Information - **Project Name**: RIFE - **Description**: 将rife插帧模型部署到鸿蒙端侧 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2026-01-31 - **Last Updated**: 2026-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RIFE 鸿蒙端侧插帧引擎 #### 介绍 本项目将 RIFE(Real-Time Intermediate Flow Estimation)插帧模型部署到鸿蒙(OpenHarmony/HarmonyOS NEXT)端侧,利用 NPU 加速推理,支持**图片插帧**和**视频插帧**两种场景。 视频插帧后**播放时长与原始视频严格一致**(帧率提升,每帧显示时间同比例缩短),且提供完整的播放控制(播放/暂停/重置)和进度回调。 --- ## 功能特性 - ✅ 图片插帧:输入两张 RGBA 图片,输出中间帧 PixelMap。 - ✅ 视频插帧:自动解码视频,对每相邻两帧进行插值,生成 2 倍帧率的新序列。 - ✅ 保持原始时长:基于原始视频帧率计算每帧显示间隔,播放总时长不变。 - ✅ 异步处理 + 进度回调:视频准备过程不阻塞 UI,实时显示解码/插帧进度。 - ✅ 可取消任务:支持中途取消视频处理。 - ✅ 逐帧获取:按序获取插帧后的 PixelMap,便于自定义播放器或导出帧序列。 - ✅ 高性能推理:MindSpore Lite + NPU(NNRT)。 --- ## 模型信息 - 模型来源:RIFE(RIFE-HDv3) - 转换格式:ONNX → MindSpore Lite `.ms`(含 NNRT Custom 算子,支持 NPU) - 输入尺寸:`1024 × 576`(模型会自动缩放到该尺寸,输出再恢复原始分辨率) - 使用模型:`RIFE_HDv3_576_1024.onnx.om.ms`。 --- ## 工程主要文件说明 | 文件 | 作用 | |------|------| | `entry/src/main/ets/pages/Index.ets` | 主界面 UI(选择视频/图片、触发插帧、播放控制) | | `entry/src/main/ets/components/VideoRife.ets` | 视频插帧专用组件(含播放器、动态帧间隔计算) | | `entry/src/main/cpp/napi_init.cpp` | NAPI 模块入口,注册 `PrepareVideo`, `ProcessImage`, `GetNextVideoFrame` 等接口 | | `entry/src/main/cpp/video_rife.cpp` | 视频插帧核心逻辑:FFmpeg 解码、插帧循环、输出帧缓存、异步任务 | | `entry/src/main/cpp/image_rife.cpp` | 图片插帧 NAPI 实现:RGBA ↔ BGR 转换,调用 `InferRIFE` | | `entry/src/main/cpp/model_predict.cpp` | 模型加载/推理封装:MindSpore Lite 上下文创建、预处理/后处理、耗时统计 | | `entry/libs/arm64-v8a/libopencv_*.so` | OpenCV 动态库(用于颜色转换、缩放等) | | `entry/src/main/resources/rawfile/RIFE_HDv3_576_1024.onnx.om.ms` | NPU 推理模型文件 | --- ## 核心实现要点 ### 1. 视频插帧保持原始时长 - 使用 FFmpeg 读取原始视频帧率 `fps` 和总帧数 `originalFrameCount`。 - 计算原始总时长:`durationMs = originalFrameCount / fps * 1000`。 - 输出总帧数 `totalFrames = 原始帧数 + 插值帧数`。 - 前端播放间隔:`frameIntervalMs = durationMs / totalFrames`。 - 播放时使用该动态间隔调用 `setInterval`,保证总时长与原始视频一致。 ### 2. 模型推理(MindSpore Lite + NPU) - 模型文件从 `rawfile` 读取,通过 `OH_ResourceManager` 获取。 - 优先选择 `HIAI_F` 设备(高性能 NPU),并设置性能模式为 `OH_AI_PERFORMANCE_HIGH`。 - 输入预处理:`BGR → resize → 归一化 → CHW`。 - 输出后处理:`CHW → 钳位 → 缩放到原始尺寸 → BGR`。 ### 3. 图片插帧流程 - 接收两个 `Uint8Array`(RGBA8888)、宽高、`ResourceManager`。 - RGBA → BGR → 推理 → BGR → RGBA → 创建 `PixelMap` 返回。 - 单次推理包含完整的前/后处理及耗时统计。 ### 4. 视频解码与帧缓存 - 使用 FFmpeg 6.x 解码,输出 RGB24 再转 OpenCV Mat(BGR)。 - 插帧结果暂存于 `std::vector`,通过 `GetNextVideoFrame` 逐次返回。 - 支持 `CancelPrepareVideo` 原子取消,避免资源浪费。 --- ## 使用说明 ### 环境要求 - HarmonyOS NEXT - DevEco Studio 5.0+ - 设备支持 NPU(麒麟 9000 系列及以上,或对应开发板) ### 编译与运行 1. 克隆本仓库。 2. 使用 DevEco Studio 打开项目,**重新签名**(File → Project Structure → Signing)。 3. 若遇到 SDK 版本不匹配,可先创建空项目,将本项目的 `entry/src` 和 `entry/libs` 复制进去,再重新配置 `build-profile.json5`。 4. 连接设备或模拟器,点击运行。 ### 运行示例 ![img.png](images/demo.gif)