MEFrame Core
新一代高性能浏览器端视频合成引擎
概述
MEFrame Core 是完全重新设计的视频处理引擎,基于 WebCodecs API 和 Worker 并行架构,提供毫秒级响应的视频编辑和秒级导出能力。
核心特性
- 六阶段处理模型 - Load → Demux → Decode → Compose → Encode → Mux/Export
- Worker 并行架构 - 充分利用多核 CPU,各阶段独立并行处理
- 双层缓存系统 - L1 VRAM + L2 IndexedDB,智能缓存管理
- 流式处理 - 边加载边处理,优化首帧时间
- 增量更新 - 基于 Patch 的细粒度更新,最小化重渲染
性能指标
| 首帧渲染 | < 100ms | 从加载到显示第一帧 |
| Seek 响应 | < 50ms | 缓存命中情况下 |
| 播放帧率 | > 29.97 fps | 1080p 多轨合成 |
| 导出速度 | > 2x 实时 | 1080p H.264 编码 |
| 内存占用 | < 500MB | 典型项目场景 |
快速开始
安装
npm install @meframe/core
配置 Vite 插件
import { defineConfig } from 'vite';
import { meframePlugin } from '@meframe/core/vite-plugin';
export default defineConfig({
plugins: [
meframePlugin(),
],
});
为什么需要插件? Worker 文件在 node_modules 中,生产环境需要复制到输出目录才能访问。插件会自动处理这个过程。
基础使用
import { Meframe } from '@meframe/core';
import { parseDSL } from '@meframe/dsl-parser';
const core = await Meframe.create();
const compositionTree = {
version: '1.0',
fps: 30,
durationUs: 10_000_000,
root: {
type: 'group',
id: 'root',
startUs: 0,
durationUs: 10_000_000,
children: [
{
type: 'video',
id: 'video-1',
src: 'https://example.com/video.mp4',
startUs: 0,
durationUs: 5_000_000,
},
{
type: 'caption',
id: 'caption-1',
text: 'Hello World',
startUs: 1_000_000,
durationUs: 3_000_000,
style: {
fontSize: 48,
color: '#ffffff',
},
},
],
},
};
await core.setCompositionTree(compositionTree);
const dsl = await fetch('/project.json').then((r) => r.json());
const model = parseDSL(dsl);
await core.setCompositionTree(model);
const preview = core.startPreview();
preview.play();
const blob = await core.export({
preset: 'high',
container: 'mp4',
});
增量更新
await core.applyPatch({
version: '1.0',
operations: [
{
type: 'update',
nodeId: 'caption-1',
updates: {
text: 'Updated Text',
},
},
],
});
插件使用
import { PerfMonitorPlugin } from '@meframe/core/plugins';
const core = await Meframe.create({
canvas,
workerBaseUrl: '/workers/',
plugins: [
new PerfMonitorPlugin({
overlay: true,
sampleRate: 60,
}),
],
});
API 参考
Meframe
创建实例
static async create(config: CoreConfig): Promise<Meframe>
合成树管理
async setCompositionTree(model: CompositionModel): Promise<void>
async applyPatch(patch: CompositionPatch): Promise<void>
预览控制
startPreview(options?: PreviewOptions): PreviewHandle
导出
async export(options: ExportOptions): Promise<Blob>
PreviewHandle
interface PreviewHandle {
play(): void;
pause(): void;
seek(timeUs: number): void;
setRate(rate: number): void;
getCurrentTime(): number;
on(event: string, handler: Function): void;
}
CompositionModel
interface CompositionModel {
version: '1.0';
fps: 24 | 25 | 30 | 60;
durationUs: number;
root: GroupNode;
renderConfig?: {
width: number;
height: number;
background?: string;
};
}
架构设计
系统架构图
┌─────────────────────────────────────────────────────────┐
│ Main Thread │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Meframe │ │ Orchestrator │ │ CacheManager │ │
│ └─────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────┬───────────────────────────────┘
│ MessageChannel
┌─────────────────────────┴───────────────────────────────┐
│ Worker Threads │
│ ┌────────────┐ ┌─────────────┐ ┌────────────────┐ │
│ │DecodeWorker│ │ComposeWorker│ │EncodeWorker │ │
│ └────────────┘ └─────────────┘ └────────────────┘ │
│ ┌─────────────┐ │
│ │ MuxWorker │ │
│ └─────────────┘ │
└──────────────────────────────────────────────────────────┘
数据流
Input Stream
↓
[ResourceLoader] → ReadableStream
↓
[DecodeWorker] → VideoFrame/AudioData
↓
[ComposeWorker] → Composed VideoFrame
↓
[EncodeWorker] → EncodedChunk
↓
[MuxWorker] → MP4/WebM Blob
↓
Output File
缓存架构
┌─────────────────────────────────────┐
│ Cache Manager │
├─────────────────────────────────────┤
│ L1: VRAM (VideoFrame) │
│ - LRU eviction │
│ - ~90 frames @ 1080p │
├─────────────────────────────────────┤
│ L2: IndexedDB (EncodedChunk) │
│ - Compressed storage │
│ - Persistent across sessions │
└─────────────────────────────────────┘
性能优化
内存管理
videoFrame.close();
const core = await Meframe.create({
cache: {
l1: { maxMemoryMB: 200 },
l2: { maxSizeMB: 1000 },
},
});
预渲染策略
core.setPreRenderWindow({
forward: 10_000_000,
backward: 2_000_000,
});
降级处理
core.setAdaptiveQuality({
enabled: true,
targetFPS: 30,
minQuality: 'low',
maxQuality: 'high',
});
浏览器兼容性
| Chrome | 94+ | 完整支持 |
| Edge | 94+ | 完整支持 |
| Safari | 16.4+ | 需要开启实验性功能 |
| Firefox | - | 暂不支持 WebCodecs |
迁移指南
从 v1 迁移
主要变化:
- 时间单位 - 所有时间值改为微秒(microseconds)
- 八阶段 → 六阶段 - 简化的处理模型
- 新的数据结构 - CompositionModel 替代 Storyboard
- Worker 架构 - 所有重计算移至 Worker
详细迁移步骤请参考 MIGRATION.md
相关文档
开发
环境准备
npm install
npm run dev
npm test
npm run build
项目结构
packages/core-next/
├── src/ # 源代码
├── tests/ # 测试文件
├── examples/ # 示例代码
├── docs/ # 文档
└── benchmarks/ # 性能测试
贡献指南
- Fork 项目
- 创建特性分支 (
git checkout -b feature/amazing)
- 提交更改 (
git commit -m 'Add amazing feature')
- 推送分支 (
git push origin feature/amazing)
- 创建 Pull Request
路线图
v2.0.0 (Current)
v2.1.0 (Q2 2024)
v2.2.0 (Q3 2024)
许可证
MIT License
支持
致谢
感谢所有贡献者和以下开源项目: