Nodejs 第十六章 ffmpeg

Nodejs 第十六章 ffmpeg

FFmpeg 是一个开源的跨平台多媒体处理工具,可以用于处理音频、视频和多媒体流。它提供了一组强大的命令行工具和库,可以进行视频转码、视频剪辑、音频提取、音视频合并、流媒体传输等操作。

应用场景

  • 视频转码和处理:可以将视频从一种格式转换成另一种格式,调整视频的分辨率,或者改变其编码质量。
  • 音频转换:可以提取视频文件中的音频流,或者将音频文件转换成其他格式。
  • 流媒体处理:FFmpeg 支持从实时的音视频源捕捉数据,处理后实时输出到其他服务器或设备。
  • 视频分析:可以获取视频的详细信息,包括帧速率、流格式、编解码详情等。

安装

  • 通过点击能够打开下图中的网站,找到发布版本进行下载压缩包即可
  • 下载下来解压后,内部结构是这样的
  • 我们先把这个文件夹移到我们放安装配置的地方,一般的话,平时配置都在C盘的Program Files文件夹中,像我的Git,Go之类的配置都是放在这里
  • 下一步则是进行配置环境变量
    1. 其中用户变量是当前windows系统用户的
    2. 环境变量里有用户变量和环境变量,这个根据自己个人情况选择。像我windows电脑就一个用户,采用哪个就没什么区别。
  • 我最终选择的是写在用户变量中,选择变量Path,然后将我们FFmpeg的bin目录加进去,这个bin目录就是启动命令所在的目录,在前面章节有讲解到,就不再额外多说
  • 这样就大功告成,将环境变量配置好了,接下来就需要进行验证配置是否成功
    1. 通过win+r输入cmd打开终端
    2. 输入ffmpeg -version,看是否有输出一堆配置信息,如果出现如下信息,则表示配置成功

FFmpeg的常用命令参数配置

  • 以表格和代码块的形式将常用的部分进行总结,方便大家进行阅读
参数 描述
-i 指定输入文件。用于定义输入源,可以是文件、设备、网络流等。
-c 指定编解码器。-c:v 指定视频编解码器,-c:a 指定音频编解码器。使用 copy 表示复制流而不重新编码。
-b:v 设置视频比特率。例如 -b:v 1M 表示视频比特率为1 Mbps。
-b:a 设置音频比特率。例如 -b:a 128k 表示音频比特率为128 kbps。
-s 设置视频的分辨率。格式为宽x高,例如 -s 1280x720
-r 设置帧率。例如 -r 30 表示每秒30帧。
-vn 禁用视频。用于提取音频或者生成音频文件时不包含视频流。
-an 禁用音频。用于提取视频或者生成视频文件时不包含音频流。
-ar 设置音频采样率。例如 -ar 44100 表示采样率为44.1 kHz。
-ac 设置音频通道数。例如 -ac 2 表示双声道音频。
-vf 应用视频过滤器。用于裁剪、调整大小、添加水印等视频处理任务。
-af 应用音频过滤器。用于音频效果处理,如音量调整、回声添加等。
-ss 指定起始时间。用于截取视频或音频的起始点,例如 -ss 00:00:10 从10秒开始。
-t 指定持续时间。用于截取视频或音频的持续时间,例如 -t 10 表示持续10秒。
-to 指定结束时间。与 -ss 结合使用,定义视频或音频的结束时间点。
-fps 设置输出文件的帧率。通常与视频相关的过滤器一起使用。
bash 复制代码
# 转换视频格式
ffmpeg -i input.mp4 output.avi # 将 MP4 转换为 AVI

# 提取音频
ffmpeg -i video.mp4 -vn audio.mp3 # 从视频文件中提取音频,保存为 MP3

# 转换音频格式
ffmpeg -i input.wav output.mp3 # 将 WAV 音频转换为 MP3

# 调整视频分辨率
ffmpeg -i input.mp4 -s 1280x720 output.mp4 # 将视频分辨率调整为 1280x720

# 压缩视频
ffmpeg -i input.mp4 -b:v 1M -b:a 128k output.mp4 # 设置视频比特率为 1 Mbps,音频比特率为 128 kbps

# 从视频中截取一段
ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:20 -c copy output.mp4 # 截取第 10 秒到第 20 秒的视频片段

# 添加水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4 # 将 logo.png 添加为视频的水印

# 提取视频中的帧
ffmpeg -i video.mp4 -vf "fps=1" output%d.png # 每秒提取一帧,保存为 PNG

# 生成视频预览
ffmpeg -i input.mp4 -vf "select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)'" -vsync vfr -frame_pts true preview%d.jpg # 每 10 秒提取一帧生成预览图

案例实操

  • 将mp4视频转化为gif动图形式
js 复制代码
const { execSync } = require("child_process")

// 输入mp4版本,输出gif版本
// execSync('ffmpeg -i test.mp4 test.gif')
// stdio: "inherit"可以直接在控制台看到执行命令(如 ffmpeg)的输出结果,同时任何错误信息也会直接显示。这在调试或者需要直接查看命令输出的场景非常有用
execSync('ffmpeg -i test.mp4 test.gif', { stdio: "inherit" })
  • 通过实际效果,我们可以看到转化是成功的
  • 当然功能其实不止这么一点的,根据上面的总结使用方式,可以看到转化形式是特别繁多的。这个需要看具体的需求
    1. 比如平时如果我们喜欢听音乐,但又只有MV类型的,或者是抖音短视频有些小姐姐唱歌很好听,我们想要拿到音频文件,就可以这样进行转化了
    2. 而我使用的这个案例其实更适合做动图表情包,当然这也是最常用的方式。
    3. 各种功能结合起来做成接口,加上前端页面可视化,就能做成一个工具类的网站了(使用门槛也会大大降低,毕竟直接用代码拼接没有任何提示那确实是使用起来较为难受,还容易出错)
    4. 在各种视频剪辑软件或者网站中,我们往往也是经常看见这些典型功能的
  • 剩下的案例就不展示了,跟上面总结是重复的了
相关推荐
庸俗今天不摸鱼20 分钟前
【万字总结】前端全方位性能优化指南(十)——自适应优化系统、遗传算法调参、Service Worker智能降级方案
前端·性能优化·webassembly
QTX1873020 分钟前
JavaScript 中的原型链与继承
开发语言·javascript·原型模式
黄毛火烧雪下27 分钟前
React Context API 用于在组件树中共享全局状态
前端·javascript·react.js
Apifox37 分钟前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
一张假钞40 分钟前
Firefox默认在新标签页打开收藏栏链接
前端·firefox
高达可以过山车不行40 分钟前
Firefox账号同步书签不一致(火狐浏览器书签同步不一致)
前端·firefox
m0_5937581041 分钟前
firefox 136.0.4版本离线安装MarkDown插件
前端·firefox
掘金一周44 分钟前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
三翼鸟数字化技术团队1 小时前
Vue自定义指令最佳实践教程
前端·vue.js
Jasmin Tin Wei2 小时前
蓝桥杯 web 学海无涯(axios、ecahrts)版本二
前端·蓝桥杯