Skip to content

运行 FFmpeg

FFmpeg 是一款功能强大的开源音视频处理工具,将其以独立扩展的方式集成到 uTools。(首次调用 FFmpeg 会引导用户下载集成)

utools.runFFmpeg(args[, onProgress])

运行集成的 FFmpeg

类型定义

ts
function runFFmpeg(
  args: string[],
  onProgress?: () => RunProgress
): PromiseLikeResult<void>; // 版本:>=6.1.0
  • args: FFmpeg 参数
  • onProgress: 进度函数

PromiseLikeResult 类型定义

PromiseLikeResultPromise 的扩展类型,包含 kill()quit() 函数

默认情况下,你可以单纯把它当作 Promise 来使用,但是扩展了 kill()quit() 函数,可以让你在运行过程中强制结束 FFmpeg 运行,或者通知 FFmpeg 退出。

ts
interface PromiseLikeResult<T> extends Promise<T> {
  kill(): void;
  quit(): void;
}

字段说明

  • kill(): 强制结束 FFmpeg 运行
  • quit(): 通知 FFmpeg 退出,类似命令行下按 q 键
RunProgress 类型定义
ts
interface RunProgress {
  bitrate: string;
  fps: number;
  frame: number;
  percent?: number;
  q: number | string;
  size: string;
  speed: string;
  time: string;
}

字段说明

  • bitrate

    视频或音频的比特率,表示每秒传输的比特数

  • fps

    当前处理的视频帧率,每秒处理的帧数

  • frame

    已处理的帧数

  • percent

    处理完成百分比

  • q

    质量指标

  • size

    已处理输出的文件大小

  • speed

    当前的处理速度

  • time

    前已处理的时间

示例代码

js
// 视频压缩
utools
  .runFFmpeg(
    [
      "-i",
      "/path/to/input.mp4",
      "-c:v",
      "libx264",
      "-tag:v",
      "avc1-movflags",
      "faststart",
      "-crf",
      "30",
      "-preset",
      "superfast",
      "/path/to/output.mp4",
    ],
    (progress) => {
      console.log("压缩中 " + progress.percent + "%");
    }
  )
  .then(() => {
    console.log("压缩完成");
  })
  .catch((error) => {
    console.log("出错了:" + error.message);
  });
js
// 视频转 GIF
const run = utools.runFFmpeg(
  [
    "-i",
    "/path/to/input.mp4",
    "-filter_complex",
    "[0]fps=15,split[v0][v1];[v0]palettegen=stats_mode=full[p];[v1][p]paletteuse",
    "/path/to/output.gif",
  ],
  () => {
    console.log("转换中 " + progress.percent + "%");
  }
);
run
  .then(() => {
    console.log("转换完成");
  })
  .catch((error) => {
    console.log("出错了:" + error.message);
  });

// 执行 run.kill() 取消转换
js
// 音频提取
utools
  .runFFmpeg([
    "-i",
    "/path/to/input.mp4",
    "-q:a",
    "0",
    "-map",
    "a",
    "/path/to/output.mp3",
  ])
  .then(() => {
    console.log("提取完成");
  })
  .catch((error) => {
    console.log("出错了:" + error.message);
  });
js
// Windows 录屏
const run = utools.runFFmpeg(['-f', 'gdigrab', '-framerate', '30', '-i', 'desktop', '/path/to/output.mp4')

// macOS 录屏
const run = utools.runFFmpeg(['-f', 'avfoundation', '-framerate', '30', '-i', 'default', '/path/to/output.mp4')

// Linux 录屏
const run = utools.runFFmpeg(['-f', 'x11grab', '-framerate', '30', '-i', ':0.0', '/path/to/output.mp4')

//执行 run.quit() 结束录屏
run.quit()
js
// Windows 截屏
utools.runFFmpeg(['-f', 'gdigrab', '-i', 'desktop', '-vframes', '1', '/path/to/screenshot.png'])

// macOS 截屏
utools.runFFmpeg(['-f', 'avfoundation', '-i', 'default', '-vframes', '1', '/path/to/screenshot.png')

// Linux 截屏
utools.runFFmpeg(['-f', 'x11grab', '-i', ':0.0', '-vframes', '1', '/path/to/screenshot.png')