首页
看点啥
插画图片
首页 科技看点 ffmpeg-concat:实践指南

ffmpeg-concat:实践指南

2026-09-11 0

准备试用ffmpeg-concat之前,先别急着安装;这个项目提供的是使用 ffmpeg 将视频列表与性感的 OpenGL 过渡连接在一起。一旦进入视频制作环节,素材、节奏、编码和最终画面容易不一致会直接影响交付,这也是我最关心的风险。我的评估方法是拿一组已有素材完成一段短样片,然后检查素材路径、渲染结果、音画同步和导出格式是否与文档一致。它更像给有真实素材并需要稳定视频产出的创作者准备的可审查方案,是否长期使用应由试跑数据决定。

ffmpeg 连接

使用 ffmpeg 将视频列表与性感的 OpenGL 过渡连接在一起。

(通过独特的过渡连接在一起的 9 个视频的示例)

(请注意,由于 GIF 预览,质量和 fps 很差;这里的 here 是原始版本)

简介

FFmpeg 是命令行视频编辑的事实上的标准,但使用非平凡的过渡将视频连接在一起确实很困难。以下是一些 复杂的 示例 两个视频之间的简单交叉淡入淡出。 FFmpeg 过滤图非常强大,但对于实现转换来说,它们太复杂且容易出错。

另一方面,GL Transitions 是由 Gaëtan Renaudeau 牵头的一项伟大的开源计划,旨在使用 GLSL 建立一个通用的过渡集合。其极其简单的规范使得自定义现有转换或编写自己的转换变得非常容易,而不是与复杂的 ffmpeg 过滤器图作斗争。

此模块和 CLI 可以轻松使用 gl-transitions 将视频连接在一起。

安装

该模块需要安装 ffmpeg。

npm install --save ffmpeg-concat

# or if you want to use the CLI
npm install -g ffmpeg-concat

该软件包在 Linux、macOS 和 Windows 上运行。

支持 Node.js 版本 10.13.0 及更高版本。注意(仅限 macOS):由于 libuv 进程处理代码中无意的低级重大更改,在运行 Node.js 版本 12.13.1 到 13.6.0 时,不支持 OpenGL 不支持 macOS。 Node.js 版本 13.7.0 中已发布修复程序。 12.x 的修复正在等待中。其他平台不受影响。

CLI

  Usage: ffmpeg-concat [options] 

  Options:

    -V, --version                         output the version number
    -o, --output                  path to mp4 file to write (default: out.mp4)
    -t, --transition-name           name of gl-transition to use (default: fade)
    -d, --transition-duration   duration of transition to use in ms (default: 500)
    -T, --transitions               json file to load transitions from
    -f, --frame-format            format to use for temp frame images (default: raw)
    -c, --concurrency             number of videos to process in parallel (default: 4)
    -C, --no-cleanup-frames               disables cleaning up temp frame images
    -O, --temp-dir                   temporary working directory to store frame data
    -v, --verbose                         enable verbose logging from FFmpeg
    -h, --help                            output usage information

  Example:

    ffmpeg-concat -t circleopen -d 750 -o huzzah.mp4 0.mp4 1.mp4 2.mp4

用途

const concat = require('ffmpeg-concat')

// concat 3 mp4s together using 2 500ms directionalWipe transitions
await concat({
  output: 'test.mp4',
  videos: [
    'media/0.mp4',
    'media/1.mp4',
    'media/2.mp4'
  ],
  transition: {
    name: 'directionalWipe',
    duration: 500
  }
})
// concat 5 mp4s together using 4 different transitions
await concat({
  output: 'test.mp4',
  videos: [
    'media/0.mp4',
    'media/1.mp4',
    'media/2.mp4',
    'media/0.mp4',
    'media/1.mp4'
  ],
  transitions: [
    {
      name: 'circleOpen',
      duration: 1000
    },
    {
      name: 'crossWarp',
      duration: 800
    },
    {
      name: 'directionalWarp',
      duration: 500,
      // pass custom params to a transition
      params: { direction: [ 1, -1 ] }
    },
    {
      name: 'squaresWire',
      duration: 2000
    }
  ]
})

API

连接(选项)

将视频文件与 OpenGL 过渡连接在一起。当输出视频已写入时,返回 Promise

请注意,您必须指定 videosoutput 以及 transitiontransitions

请注意,输出视频的大小和 fps 由第一个输入视频决定。

选项

视频

类型:Array 必填

要连接的视频数组,其中每个项目都是视频文件的路径或 URL。

输出

类型:String 必填

要写入的 mp4 视频文件的路径。

注意:我们目前仅支持输出为mp4;如果您希望看到对更多格式的支持,请打开一个问题。

过渡

类型:Object

指定每个视频之间使用的默认过渡。

请注意,您必须指定 transitiontransitions,具体取决于您想要对每个转换进行多少控制。如果同时指定两者,则 transitions 优先。

// example
const transition = {
  duration: 1000, // ms
name: 'directivewipe', // 要使用的 gl-transition 名称(将与小写字母匹配)
  params: { direction: [1, -1] } // optionally override default parameters
}

过渡

类型:Array

指定每个视频之间的(可能是唯一的)过渡。如果有 N 个视频,则应该有 N - 1 个过渡。

请注意,您必须指定 transitiontransitions,具体取决于您想要对每个转换进行多少控制。如果同时指定两者,则 transitions 优先。

// example
const transitions = [
  {
    duration: 1000,
    name: 'fade'
  },
  {
    duration: 500,
    name: 'swap'
  }
]

音频

类型:String 可选

用作输出视频音轨的音频文件的路径或 URL。

如果未提供参数 - 假设用户想要连接源场景音频。

参数

类型:Array 可选

默认值:['-c:v', 'libx264', '-profile:v', 'main', '-preset', 'medium', '-crf 20', '-movflags', 'faststart']

最终视频的仅输出 ffmpeg 命令行参数数组。

frameFormat

类型:string 默认值:raw

临时帧图像的格式。例如,您可以使用 pngjpg

注意:出于性能原因,默认值为 raw,因为写入和读取原始二进制像素数据比编码和解码 png 帧快得多。然而,原始格式很难预览和调试,在这种情况下,您可能需要将 frameFormat 更改为 png

并发性

类型:Number 默认值:4

并行处理的最大视频数。

日志

类型:Function 默认值:noop

用于记录进度和底层 ffmpeg 命令的可选函数。例如,您可以使用 console.log

cleanupFrames

类型:boolean 默认值:true

默认情况下,我们清理临时帧图像。如果需要调试中间结果,请将其设置为 false

tempDir

类型:string 默认:/tmp中的随机目录

存储中间帧数据的临时工作目录。这是 cleanupFrames 中帧的保存位置。

过渡

以下是一些我发现对于高质量视频过渡特别有用的 gl 过渡:

  • 褪色
  • 淡化灰度
  • 圆开
  • 定向扭曲
  • 定向擦拭
  • 交叉变形
  • 交叉缩放
  • 梦幻
  • 方线
  • 角形
  • 径向
  • 立方体
  • 兑换

相关

  • ffmpeg-gl-transition - 用于在视频流之间应用 GLSL 转换的低级 ffmpeg 过滤器(gl-transitions)。它允许使用更高级和可自定义的过滤器图,但它要求您构建 ffmpeg 的自定义版本。
  • gl-transitions - GLSL 过渡的集合。
  • fluence-ffmpeg - 底层 ffmpeg 包装器库。
  • Awesome-ffmpeg - 精选的 ffmpeg 资源列表,重点关注 JavaScript.
喜欢(0)