Nodejs中使用FFmpeg

FFmpeg

常用参数

-c:指定编码器

-c copy:直接复制,不经过重新编码(这样比较快)

-c:v:指定视频编码器

-c:a:指定音频编码器

-i:指定输入文件

-an:去除音频流

-vn: 去除视频流

-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。

-y:不经过确认,输出时直接覆盖同名文件

常用操作

播放视频
js 复制代码
-autoexit 自动退出
-window_title 设置窗口标题
-fs 全屏播放
-loop 循环次数
-volume 音量
-vf 滤镜
-ss 开始播放时间
-t 播放时长
-speed 播放速度
-aspect 宽高比
-an 去除音频流
-vn 去除视频流

const { execSync } = require('child_process')
execSync('ffplay sp.mp4')
编码格式转换
js 复制代码
-i 指定输入文件
-vcodec 指定视频编码器
-strict -2:允许使用非标准的编解码器

const { execSync } = require('child_process')
execSync('ffmpeg -i sp.mp4 -strict -2 -vcodec h264 h264.mp4')
execSync('ffmpeg -i sp.mp4 -strict -2 -vcodec mpeg4 mpeg4.mp4')
视频压缩
js 复制代码
-vf scale=640:-2:将视频缩放为640宽度,高度按比例缩放
-threads 4:使用4个线程进行编码

const { execSync } = require('child_process')
execSync('ffmpeg -i sp.mp4 -vcodec h264 -vf scale=640:-2 -threads 4 2020_conv.mp4')
视频切割
切割一个片段
js 复制代码
-ss 开始时间
-t 持续时间
-c copy:直接复制,不经过重新编码(这样比较快)

const { execSync } = require('child_process')
execSync('ffmpeg -i sp.mp4 -ss 00:00:00 -t 10 -c copy cut.mp4')
切割成多个片段
js 复制代码
for (let i = 0; i < 10; i++) {
  execSync(`ffmpeg -i sp.mp4 -ss ${i * 10} -t 10 -c copy cut${i}.mp4`);
}
视频合并

将 filter_complex 参数用双引号包裹,避免了与 JavaScript 字符串语法的冲突。

js 复制代码
-filter_complex:指定滤镜
[0:0] 第一个输入文件的第一个流(视频)
[0:1] 第一个输入文件的第二个流(音频)
concat=n=3:v=1:a=1 合并三个视频流,只保留一个视频和一个音频流
-map '[v]':指定视频流
-map '[a]':指定音频流

const { execSync } = require('child_process')
execSync("ffmpeg -i cut0.mp4 -i cut1.mp4 -i cut2.mp4 -filter_complex \"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]\" -map \"[v]\" -map \"[a]\" output.mp4")
竖向拼接视频
js 复制代码
[0:v]pad = iw:ih*2[a] 将第一个输入文件的宽度保持不变,高度变为原来的两倍
[ a ][1:v]overlay=0:h 将第二个输入文件叠加到第一个输入文件的高度上

const { execSync } = require('child_process')
execSync("ffmpeg -i cut0.mp4 -i cut1.mp4 -filter_complex \"[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h\" out_2.mp4")
视频帧率操作
截图
js 复制代码
-frames:v:指定要提取的帧数

execSync("ffmpeg -i sp.mp4 -ss 00:1:05 -frames:v 1 img.jpg")
图片转视频
js 复制代码
-f image2:指定输入格式为图片序列
-i img%03d.jpg:指定输入文件名格式 文件名是img001.jpg ...

execSync("ffmpeg -f image2 -i img%03d.jpg -r 1 out.mp4")
图片格式转换
js 复制代码
execSync("ffmpeg -i img001.jpg img001.png");
相关推荐
年纪轻轻就扛不住1 小时前
Express 入门指南(超详细教程)
前端·前端框架·node.js·express·js
爱电摇的小码农3 小时前
【深度探究系列(5)】:前端开发打怪升级指南:从踩坑到封神的解决方案手册
前端·javascript·css·vue.js·node.js·html5·xss
王者鳜錸4 小时前
基于Selenium和FFmpeg的全平台短视频自动化发布系统
selenium·ffmpeg·音视频
aqi004 小时前
FFmpeg开发笔记(七十三)Windows给FFmpeg集成MPEG-5视频编解码器
ffmpeg·音视频·直播·流媒体
lihainuo6 小时前
Next.js + AI-SDK 实战:模型注册表从类型设计到工具调用全解析
后端·node.js
胡gh6 小时前
JavaScript 中的闭包、防抖与节流:让你彻底搞懂它们的作用和应用场景
前端·javascript·node.js
野槐7 小时前
vue3+node.js+mysql写接口(二)
node.js
讨厌吃蛋黄酥7 小时前
🚀 全栈开发48小时逆袭:用Node.js打造超炫实时数据仪表盘! 📊
node.js·全栈
天若有情6737 小时前
Node.js 是什么?npm 是什么? Vue 为什么需要他们?
vue.js·npm·node.js
爱敲代码的小冰8 小时前
npm 切换 node 版本 和npm的源
前端·npm·node.js