English | 中文
WebAV 是 Web 平台上创建/编辑视频文件的 SDK,基于 WebCodecs 构建。
- 跨平台:支持在 Edge、Chrome 浏览器,以及 Electron 中运行
- 零成本:完全在客户端计算,无需服务器成本
- 隐私安全:不会上传用户的任何数据
- 高性能:是 ffmpeg.wasm 的 20 倍,与 Native 性能对比查看 WebCodecs 性能表现
- 易扩展:对 Web 开发者非常友好,能轻松与 Canvas、WebAudio 配合,实现自定义功能
- 体积小:约 50kb(MINIFIED + GZIPPED, 未 tree-shaking)
兼容 chrome 102+
- 批量音视频文件处理;如:添加水印、配音、嵌入字幕
- 构建音视频相关产品;如:视频剪辑、直播推流、视频动画制作
WebAV 项目有丰富的可快速体验的 DEMO,可以访问 DEMO 首页检查当前设备的兼容性。
提示:测试用的视频资源托管在 github pages,启动 DEMO 可能需要一些网络加载时间
下面是你可能感兴趣的功能演示
av-cliper
是音视频数据处理的基础 SDK,它提供了一些基础 class 或 function 帮助开发者快速实现目标功能。
这里简要介绍 av-cliper
的核心 API
IClip
是音视频素材的抽象,解析音视频、图片、字幕资源,给其他模块提供数据Sprite<IClip>
给素材附加空间、时间属性,用于控制素材中视频的空间位置、时间偏移,实现多素材协作、动画等功能Combinator
能添加多个 Sprite,根据它们位置、层级、时间偏移等信息,合成输出为视频文件
代码演示:给视频添加一个移动的半透明水印
import {
ImgClip,
MP4Clip,
OffscreenSprite,
renderTxt2ImgBitmap,
Combinator,
} from '@webav/av-cliper';
const spr1 = new OffscreenSprite(
new MP4Clip((await fetch('./video/bunny.mp4')).body),
);
const spr2 = new OffscreenSprite(
new ImgClip(
await renderTxt2ImgBitmap(
'水印',
`font-size:40px; color: white; text-shadow: 2px 2px 6px red;`,
),
),
);
spr2.time = { offset: 0, duration: 5e6 };
spr2.setAnimation(
{
'0%': { x: 0, y: 0 },
'25%': { x: 1200, y: 680 },
'50%': { x: 1200, y: 0 },
'75%': { x: 0, y: 680 },
'100%': { x: 0, y: 0 },
},
{ duration: 4e6, iterCount: 1 },
);
spr2.zIndex = 10;
spr2.opacity = 0.5;
const com = new Combinator({
width: 1280,
height: 720,
});
await com.addSprite(spr1);
await com.addSprite(spr2);
com.output(); // => ReadableStream
av-canvas
依赖 av-cliper
的基础能力,提供一个画布响应用户对 Sprite 的操作(拖拽、缩放、旋转),用于快速实现视频剪辑、直播推流工作台等产品。
代码演示:向画布中添加视频与文字
import {
ImgClip,
MP4Clip,
VisibleSprite,
renderTxt2ImgBitmap,
} from '@webav/av-cliper';
import { AVCanvas } from '@webav/av-canvas';
const avCvs = new AVCanvas(document.querySelector('#app'), {
width: 1280,
height: 720,
});
const spr1 = new VisibleSprite(
new MP4Clip((await fetch('./video/bunny.mp4')).body),
);
const spr2 = new VisibleSprite(
new ImgClip(
await renderTxt2ImgBitmap(
'水印',
`font-size:40px; color: white; text-shadow: 2px 2px 6px red;`,
),
),
);
await avCvs.add(spr1);
await avCvs.add(spr2);
// 将用户编辑的素材导出成视频
// (await avCvs.createCombinator()).output()
// 从画布捕获流(MediaStream),用于直播推流或录制视频
// avCvs.captureStream()
av-recorder
录制 MediaStream
输出 MP4 格式的视频文件流。
代码演示:录制摄像头、麦克风,输出 MP4 文件流
import { AVRecorder } from '@webav/av-recorder';
const mediaStream = await navigator.mediaDevices.getUserMedia({
video: true,
audio: true,
});
const recorder = new AVRecorder(recodeMS);
recorder.start(); // => ReadableStream
- clone 当前项目到本地
- 在根目录下执行
pnpm install && pnpm build
- cd 跳转到特定 package (假设为 av-cliper),运行
pnpm dev
- path 为 DEMO 目录下的文件名,如
concat-media.html
- 在浏览器中打开 DEMO URL,如
http://localhost:6066/concat-media.html
pnpm test
运行该 package 的单元测试
- clone 当前项目到本地
- 在根目录下执行
pnpm install && pnpm build
- cd 跳转到
doc-site
目录,执行pnpm dev
- 根据终端提示,访问指定 URL
如果你是 Web 音视频领域的初学者,可以先了解入门知识
如果该项目对你有帮助,扫描二维码请作者喝奶茶 :)
加微信 liujun_fenghen
备注 WebAV,邀请进入 WebAV 音视频技术交流 微信群