Vue3中使用ffmpeg.wasm进行转码

一、安装方法

1.1 使用yarn进行安装

复制代码
yarn add @ffmpeg/ffmpeg @ffmpeg/core

1.2 安装版本

注意安装版本需在0.12.0以上版本才可以使用下面代码(目前更新到0.12.10),之前的版本代码使用方法有所不同(0.12.10之后的版本也可能会有变动)

二、代码

1.1 引用和声明

复制代码
import { FFmpeg } from "@ffmpeg/ffmpeg";

const ffmpeg = new FFmpeg();

1.2 加载

复制代码
  if (!isLoadFfmpegCore) {
    messageText.value = "加载ffmpeg-core.js";
    await ffmpeg.load({
      coreURL: "/static/esm/ffmpeg-core.js",    
    });
    isLoadFfmpegCore = true;
  }

1.3 对url格式的网络视频转码

复制代码
const changeFormat = async (url) => {
  const response = await fetch(url);
  const blob = await response.blob();
  const name = "1.mp4";

  if (!isLoadFfmpegCore) {
    messageText.value = "加载ffmpeg-core.js";
    await ffmpeg.load({
      coreURL: "/static/esm/ffmpeg-core.js",
    });
    isLoadFfmpegCore = true;
  }

  await ffmpeg.writeFile(name, new Uint8Array(await readFromBlobOrFile(blob)));
  await ffmpeg.exec(["-i", name, `${111}.mp4`]);
  isTranscoding = false;

  const data = await ffmpeg.readFile(`${111}.mp4`);
  videoSrc.value = URL.createObjectURL(
    new Blob([data.buffer], { type: "video/mp4" })
  );
};

const readFromBlobOrFile = (blob) =>
  new Promise((resolve, reject) => {
    const fileReader = new FileReader();
    fileReader.onload = () => {
      resolve(fileReader.result);
    };
    fileReader.onerror = ({
      target: {
        error: { code },
      },
    }) => {
      reject(Error(`File could not be read! Code=${code}`));
    };
    fileReader.readAsArrayBuffer(blob);
  });

1.4 对本地文件视频转码

其他代码与网络视频类似,这里贴出读取文件代码

复制代码
const fetchFile = async (_data) => {
  let data = _data;
  if (typeof _data === "undefined") {
    return new Uint8Array();
  }

  if (typeof _data === "string") {
    /* From base64 format */
    if (/data:_data\/([a-zA-Z]*);base64,([^"]*)/.test(_data)) {
      data = atob(_data.split(",")[1])
        .split("")
        .map((c) => c.charCodeAt(0));
      /* From remote server/URL */
    } else {
      const res = await fetch(new URL(_data, import.meta.url).href);
      data = await res.arrayBuffer();
    }
    /* From Blob or File */
  } else if (_data instanceof File || _data instanceof Blob) {
    data = await readFromBlobOrFile(_data);
  }

  return new Uint8Array(data);
};
相关推荐
晓得迷路了1 小时前
栗子前端技术周刊第 139 期 - Nuxt 4.5、Vue 3.6 RC、Angular 发布节奏...
前端·javascript·vue.js
程序软件分享15 小时前
多语言DAPP综合盘交易所系统源码搭建剖析
vue.js·金融·开源
路光.20 小时前
Vue2升级Vue3处理原 UMD/CommonJS 打包文件,不是标准 ESM
前端·javascript·vue.js·vue3
shmily麻瓜小菜鸡1 天前
前端“伪防盗链”方案
前端·javascript·vue.js·bootstrap·echarts
MrDJun1 天前
分享一款免费实用的网页变动监控工具:PageWatch.tech
前端·javascript·vue.js
Yeauty1 天前
你那条 ffmpeg 命令,一键翻成 Rust builder 代码
开发语言·rust·ffmpeg
浅水壁虎2 天前
vue基础(第二章 )
前端·javascript·vue.js
腻害兔2 天前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
m0_547486662 天前
《Vue.js + uni-app全栈开发从入门到实践 》全套PPT课件2026版
vue.js·uni-app
达子6662 天前
第10章_HarmonyOs开发图解 用JS开发UI
vue.js