前端使用ffmpeg进行视频格式转换 (WebM → MP4)

复制代码
1、这里以vue项目为例,实现使用ffmpeg将.webm格式的blob文件转化为mp4的。
2、因为在项目中使用到杰西卡播放器,该播放器录制功能,在移动端录制的blob文件为.webm格式的,在ios或者低版本的安卓手机端保存录制文件时,文件打开会出现黑屏无法播放的问题,想正常播放就需要进行格式转化。
3、官方文档地址:https://ffmpegwasm.netlify.app/docs/getting-started/installation
4、注意v0.11.x和0.12.x的使用区别

1、安装依赖

typescript 复制代码
pnpm install @ffmpeg/ffmpeg @ffmpeg/util //版本为v.0.12.x
pnpm install @ffmpeg/core -D

2、配置ffmpeg的核心加载文件

在node-moudle/@ffmepg/core 找到文件"esm/ffmpeg-core.js","ffmpeg-core.wasm" 复制到项目static目录下,ffmpeg版本为0.12.x以上,加载需要手动配置加载必须文件

3、解决调用ffmpeg.load()无响应问题(必须)

在vite.config.js文件中,配置如下

typescript 复制代码
export default defineConfig({
  optimizeDeps: {
    exclude: ['@ffmpeg/ffmpeg', '@ffmpeg/util']
  },
})
//注意:不配置调用ffmpeg.load()时,不会出现任何报错,也不知道如何排查,我在这个问题上排查了很久

4、封装一个视频格式转换的方法

这是实现视频格式转换的核心处理流程,根据项目的需求,可以在此基础上去添加加载状态,监控转转化的进度,提高用户体验

typescript 复制代码
 const videoConverter = async () => {
  //创建视频处理器
  const ffmpeg = new FFmpeg();
  //开启日志监听
  ffmpeg.on("log", ({ message: msg }) => {
    console.log(msg);
  });
  //加载核心文件
  await ffmpeg.load({
    coreURL: await toBlobURL(`/static/esm/ffmpeg-core.js`, "text/javascript"),
    wasmURL: await toBlobURL(`/static/esm/ffmpeg-core.wasm`, "application/wasm"),
  });
  await ffmpeg.writeFile("test.webm", await fetchFile(recorder.getBlob()));
  //视频格式转化
  await ffmpeg.exec(["-i", "test.webm", "test.mp4"]);
  //重新封装格式,-c copy 表示直接复制视频和音频流,不进行重新编码,只是改变封装格式。
  await ffmpeg.exec(["-i", "test.mp4", "-c", "copy", "test.mp4"]);
  //读取转化后的文件
  const data = await ffmpeg.readFile("test.mp4");
  // 清理文件系统中的临时文件
  await ffmpeg.deleteFile("test.webm");
  await ffmpeg.deleteFile("test.mp4");
  // 创建 Blob 对象
  const blob = new Blob([data], { type: "video/mp4" });
  // 保存mp4文件
  const url = URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = "video.mp4";
  a.click();
  URL.revokeObjectURL(url);
};
复制代码
按照上面的步骤你就实现了一个简单视频格式转换,但是ffmpeg的功能不仅仅如此,它还可以实现
1. 降低视频分辨率
2. 降低视频比特率
3. 降低帧率
......
虽然ffmpeg功能强大,但是前端通过这种方式处理视频,太耗时,太耗时!!!用户体验太差,建议把压力交给服务端处理
相关推荐
代码搬运媛5 小时前
Jest 测试框架详解与实现指南
前端
counterxing6 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq6 小时前
windows下nginx的安装
linux·服务器·前端
之歆6 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
发现一只大呆瓜6 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Maimai108087 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
kyriewen8 小时前
产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住
前端·ai编程·cursor
humcomm9 小时前
元框架的工作原理详解
前端·前端框架
canonical_entropy9 小时前
Attractor Before Harness: AI 大规模开发的方法论
前端·aigc·ai编程
zhangxingchao9 小时前
多 Agent 架构到底怎么选?从 Claude Agent Teams、Cognition/Devin 到工程落地原则
前端·人工智能·后端