前端引入ffmepg 对视频画矩形贴图

业务场景: 和后端联调中视频监控需要把人员位置框出,返回的后端只给视频和框选位置

先上效果图

成功给成功给视频添加了两个框

demo技术框架 vue3 + vite + typeScript

  1. 引入 ffmepg
npm i @ffmpeg/ffmpeg 

2.项目中引入

  import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg/dist/ffmpeg.min.js'

3.可能会出现的报错 SharedArrayBuffer is not defined
解决方案为在vite.config.js中写入下方代码

  devServer: {
    headers: {
      'Cross-Origin-Opener-Policy': 'same-origin',
      'Cross-Origin-Embedder-Policy': 'require-corp',
    },
  },

使用ffmepg

 const ffmpeg = createFFmpeg({ log: true });

  (async () => {
    await ffmpeg.load();
    // 读取文件 并在内存中保存为input.mp4
    ffmpeg.FS('writeFile', 'input.mp4', await fetchFile('http://******.mp4')); // 也可以直接使用本地的file文件对象

    // 添加矩形框
    const filters = [
      {
        filter: "drawbox",
        options: {
          x: 100,
          y: 100,
          width: 200,
          height: 100,
          color: "red",
          t: "fill",
        }
      },
      {
        filter: "drawbox",
        options: {
          x: 300,
          y: 200,
          width: 150,
          height: 150,
          color: "blue",
        }
      }
    ];
    // ffmpeg.off('progress');
    // 监听本次进度
    ffmpeg.setProgress((e: any) => {
      console.log('progress: ' + Math.round(e.ratio * 100) + '%');
    });
    await ffmpeg.run('-i', 'input.mp4', '-vf', filters.map(f => `${f.filter}=${Object.entries(f.options).map(([key, value]) => `${key}=${value}`).join(':')}`).join(','), 'output.mp4');
    console.log('Complete');
    // 读取输出文件
    let arrayBuffer = ffmpeg.FS('readFile', 'output.mp4').buffer; // 读取缓存
    // 创建下载链接并通过回调下载保存到本地
    const fileUrl = URL.createObjectURL(new Blob([arrayBuffer])); // 转为Blob URL
  })();

// 在组件销毁时调用该方法

function onStopConversion() {
  // 停止运行ffmpeg.run
  ffmpeg.exit();
  // 释放内存
  ffmpeg.FS('unlink', 'input.mp4');
  ffmpeg.FS('unlink', 'output.mp4');
  ffmpeg.reset();
}

## ffmpeg 功能很强大 基本上业务上对视频的操作 它都可以做到  唯一的不足就是太慢了  各位大佬有什么优化速度的建议  欢迎评论区讨论
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在前端使用FFmpeg进行视频压缩,你可以使用FFmpeg的JavaScript库,例如`ffmpeg.js`或`fluent-ffmpeg`。以下是使用`ffmpeg.js`进行前端视频压缩的基本步骤: 1. 下载`ffmpeg.js`:从FFmpeg官方的GitHub存储库(https://github.com/ffmpegwasm/ffmpeg.wasm)下载`ffmpeg.js`文件。 2. 引入`ffmpeg.js`:将下载的`ffmpeg.js`文件放置在你的项目中,并在HTML文件中引入它。 ```html <script src="path/to/ffmpeg.js"></script> ``` 3. 初始化FFmpeg:在JavaScript代码中,使用以下代码初始化FFmpeg。 ```javascript const ffmpeg = createFFmpeg({ log: true, }); await ffmpeg.load(); ``` 4. 选择和处理视频文件:你可以通过文件输入元素或其他方式让用户选择要压缩的视频文件。一旦用户选择了视频文件,你可以使用以下代码加载和处理视频。 ```javascript const fileInput = document.querySelector('input[type="file"]'); const file = fileInput.files[0]; await ffmpeg.write('input.mp4', await file.arrayBuffer()); await ffmpeg.run('-i input.mp4 output.mp4'); ``` 在上述代码中,我们首先将用户选择的视频文件写入到FFmpeg的虚拟文件系统中(此处命名为`input.mp4`),然后运行FFmpeg命令进行视频压缩。 5. 获取压缩后的视频:使用以下代码从虚拟文件系统中获取压缩后的视频文件。 ```javascript const compressedVideoData = await ffmpeg.read('output.mp4'); const compressedVideoBlob = new Blob([compressedVideoData.buffer], { type: 'video/mp4' }); const compressedVideoURL = URL.createObjectURL(compressedVideoBlob); ``` 上述代码将压缩后的视频文件读取为`Uint8Array`,然后创建一个`Blob`对象,并使用`URL.createObjectURL()`方法创建一个URL,以便你可以在页面中显示或下载压缩后的视频。 请注意,这只是使用`ffmpeg.js`进行前端视频压缩的基本步骤。你可以根据需要进一步定制和处理视频。确保在实际使用中仔细阅读和理解`ffmpeg.js`的文档和示例代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值