前端ffmpeg实现视频剪切

利用ffmpeg实现纯前端视频剪切

注意:在新版本Chrome浏览器中由于安全性问题,只能在https或localhost当中才能正常使用

1. 下载ffmpeg

npm install @ffmpeg/ffmpeg @ffmpeg/core

2. 文件引入及初始化

import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';

const ffmpeg = createFFmpeg();

// vue生命周期
created(): void {
    if(!ffmpeg.isLoaded()) {
      ffmpeg.load().catch((err) => {
        console.log(err);
    });
  }
}
// 在代理中加入:
headers: {
 "Cross-Origin-Opener-Policy": "same-origin",
 "Cross-Origin-Embedder-Policy": "require-corp",
}

2. 上传文件

html

<el-upload
  class="el-upload__video"
  drag
  :show-file-list="false"
  :before-upload="uploadVideo"
  accept="video/mp4,video/mkv"
>
  <h1>视频在线剪切</h1>
</el-upload>

js

  /*
   * 上传
   */
  public async uploadVideo (file: File) {

    this.videoName = file.name

    this.orgFileBuffer = await file.arrayBuffer() // 获取文件数据

    ffmpeg.FS('writeFile', this.videoName, await fetchFile(new Blob([this.orgFileBuffer]))); // 将视频数据写入内存

    this.videoUrl = URL.createObjectURL(new Blob([this.orgFileBuffer])); // 将视频数据转为url

    return false
  }

3. 播放

  <video>
    <source :src="videoUrl" type="video/mp4">
  </video>

4. 剪切

// startCutTime开始剪切的时间
// endCutTime结束剪切的时间
// videoName要剪切的视频名
// TEM_FILE_NAME剪切完成后保存到内存的视频名称

await ffmpeg.run(
  '-ss', `${this.startCutTime}`,
  '-t', `${this.endCutTime - this.startCutTime}`,
  '-i', this.videoName,
  '-vcodec', 'copy',
  '-acodec', 'copy', this.TEM_FILE_NAME)

let arrayBuffer = ffmpeg.FS('readFile', this.TEM_FILE_NAME).buffer // 读取缓存

this.videoUrl = URL.createObjectURL(new Blob([arrayBuffer]) // 转为Blob URL
posted @ 2022-11-04 16:04  梦羽微澜  阅读(1765)  评论(0编辑  收藏  举报