如何在 Node.js 中使用 ffmpeg

2025年5月3日 | 阅读4分钟

FFmpeg 的功能与 Node.js 结合起来,处理音频和视频以进行各种多媒体活动,可以轻松地自动化复杂的流程。本文将引导我们了解在 Node.js 环境中安装和操作 FFmpeg 所需的步骤。

什么是 FFmpeg?

它是一个用于流式传输、转换和录制音乐和视频的综合跨平台解决方案,即 FFmpeg。 Libavcodec 是音频/视频编解码器中最出色的库之一。

设置我们的 Node.js 项目

首先,确保我们的计算机上安装了 npm 和 Node.js。如果没有,我们可以从官方 Node.js 页面获取它们。

为了开始一个新的 Node.js 项目,为其创建一个新目录

必须安装 fluent-ffmpeg 包,它提供了一种在 Node.js 中使用 FFmpeg 的简单方法

标准用法

FFmpeg 将视频文件从一种格式转换为另一种格式的示例。

输出

How to use ffmpeg in Node.js

高级功能

Node.js 中 ffmpeg() 函数的一些高级功能如下

1. 添加水印

视频加水印是一种常见操作。下面是如何在 Node.js 中使用 FFmpeg 为视频添加水印

输出

How to use ffmpeg in Node.js

2. 从视频中提取音频

此外,ffmpeg 也可用于从视频文件中提取音频。在此示例中,我们可以看到如何在 Node.js 中从视频中提取音频。

输出

How to use ffmpeg in Node.js

3. 使用元数据

FFmpeg 也可用于读取和写入多媒体文件的元数据。此示例演示如何读取元数据

输出

Metadata: {
  streams: [
    {
      index: 0,
      codec_name: 'h264',
      codec_long_name: 'H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10',
      profile: 'High',
      codec_type: 'video',
      codec_time_base: '1/48',
      codec_tag_string: 'avc1',
      codec_tag: '0x31637661',
      width: 1280,
      height: 720,
      coded_width: 1280,
      coded_height: 720,
      closed_captions: 0,
      has_b_frames: 2,
      sample_aspect_ratio: '1:1',
      display_aspect_ratio: '16:9',
      pix_fmt: 'yuv420p',
      level: 31,
      color_range: 'tv',
      color_space: 'bt709',
      color_transfer: 'bt709',
      color_primaries: 'bt709',
      chroma_location: 'left',
      refs: 1,
      is_avc: 'true',
      nal_length_size: '4',
      r_frame_rate: '24/1',
      avg_frame_rate: '24/1',
      time_base: '1/12288',
      start_pts: 0,
      start_time: '0.000000',
      duration_ts: 588288,
      duration: '47.900000',
      bit_rate: '1305680',
      nb_frames: '1150',
      disposition: {
        default: 1,
        dub: 0,
        original: 0,
        comment: 0,
        lyrics: 0,
        karaoke: 0,
        forced: 0,
        hearing_impaired: 0,
        visual_impaired: 0,
        clean_effects: 0,
        attached_pic: 0,
        timed_thumbnails: 0
      },
      tags: {
        creation_time: '2020-01-01T00:00:00.000000Z',
        language: 'eng',
        handler_name: 'VideoHandler'
      }
    },
    {
      index: 1,
      codec_name: 'aac',
      codec_long_name: 'AAC (Advanced Audio Codec)',
      codec_type: 'audio',
      codec_time_base: '1/44100',
      codec_tag_string: 'mp4a',
      codec_tag: '0x6134706d',
      sample_fmt: 'fltp',
      sample_rate: '44100',
      channels: 2,
      channel_layout: 'stereo',
      bits_per_sample: 0,
      r_frame_rate: '0/0',
      avg_frame_rate: '0/0',
      time_base: '1/44100',
      start_pts: 0,
      start_time: '0.000000',
      duration_ts: 2110464,
      duration: '47.861451',
      bit_rate: '128000',
      max_bit_rate: '128000',
      nb_frames: '2087',
      disposition: {
        default: 1,
        dub: 0,
        original: 0,
        comment: 0,
        lyrics: 0,
        karaoke: 0,
        forced: 0,
        hearing_impaired: 0,
        visual_impaired: 0,
        clean_effects: 0,
        attached_pic: 0,
        timed_thumbnails: 0
      },
      tags: {
        creation_time: '2020-01-01T00:00:00.000000Z',
        language: 'eng',
        handler_name: 'SoundHandler'
      }
    }
  ],
  format: {
    filename: 'input.mp4',
    nb_streams: 2,
    nb_programs: 0,
    format_name: 'mov,mp4,m4a,3gp,3g2,mj2',
    format_long_name: 'QuickTime / MOV',
    start_time: '0.000000',
    duration: '47.900000',
    size: '7939828',
    bit_rate: '1305740',
    probe_score: 100,
    tags: {
      major_brand: 'mp42',
      minor_version: '0',
      compatible_brands: 'mp42isom',
      creation_time: '2020-01-01T00:00:00.000000Z',
      encoder: 'HandBrake 1.3.3 2020061300'
    }
  }
}

写入元数据

输出

How to use ffmpeg in Node.js

4. 错误处理

任何程序都需要处理错误。我们可以监听 Fluent-ffmpeg 提供的许多事件来处理失败和其他重要状态

输出

How to use ffmpeg in Node.js

结论

总而言之,fluent-ffmpeg 包提供了一个强大的工具包,用于处理各种媒体文件操作,使 FFmpeg 易于集成到我们的 Node.js 应用程序中。我们可以转换视频格式。它可以应用水印、提取音频流媒体或管理元数据变得简单。FFmpeg 和 Node.js 提供了一个强大的解决方案。掌握这些方法将使我们能够创建高效、高性能的程序,以优雅和适应性地处理多媒体文件。