1.什么是ffmpeg?
FFmpeg 是一个 开源的跨平台多媒体处理工具,可以用于处理音频、视频和多媒体流。它提供了一组强大的命令行工具和库,可以进行视频转码、视频剪辑、音频提取、音视频合并、流媒体传输等操作。
2.ffmpeg主要功能和特效
- 格式转换:FFmpeg 可以将一个媒体文件从一种格式转换为另一种格式,支持几乎所有常见的音频和视频格式,包括 MP4、AVI、MKV、MOV、FLV、MP3、AAC 等。
- 视频处理:FFmpeg 可以进行视频编码、解码、裁剪、旋转、缩放、调整帧率、添加水印等操作。你可以使用它来调整视频的分辨率、剪辑和拼接视频片段,以及对视频进行各种效果处理。
- 音频处理:FFmpeg 可以进行音频编码、解码、剪辑、混音、音量调节等操作。你可以用它来提取音频轨道、剪辑和拼接音频片段,以及对音频进行降噪、均衡器等处理。
- 跨平台支持:FFmpeg 可以在多个操作系统上运行,包括 Windows、MacOS、Linux 等,同时支持多种硬件加速技术,如 NVIDIA CUDA 和 Intel Quick Sync Video。
3.安装ffmpeg
-
点击 ffmpeg官网
-
来到官网后根据自己的操作系统选择下载的版本,如我是
windows选择windows的版本即可
-
进入下载页面之后 windows下载区
-
下载扩展名
.zip或.7z的其中一个即可 -
下载完成之后解压到自己的某个盘符我是解压到D盘的
4.配置ffmpeg环境变量
- 复制路径一定要复制到bin文件下
-
点击 此电脑 进入此电脑后 右击 属性 点击高级系统设置
-
点击
系统变量中的path点击 编辑 粘贴 刚刚复制内容 复制完成之后 点击 确定保存 -
输入
ffmpeg -version不报错即可
5.开始使用
0.小姐姐视频素材
我们用之前学过的子进程来配合ffmpeg
1.转换视频格式
-
stdio: 可以指定stdio选项来控制子进程的标准输入/输出/错误流的行为。-
pie默认值 子进程的 stdio 流会被创建为管道。你可以通过在父进程中访问 -
inherit意味着子进程会使用父进程的标准输入输出流,会直接使用终端显示其输入输出 -
ignore忽略流。子进程的输出将不会显示在父进程的控制台中,也不能从父进程中访问。
-
1.将MP4转换为GIF
const { execSync, exec } = require('child_process');
// 将MP4转换为GIF
execSync('ffmpeg -i ./mp4-2/test.mp4 ./mp4-2/test.gif', { stdio: 'inherit' });
2.将GIF转换为MP4
注意:动图转视频没有声音,因为图本来就没有声音
const { execSync, exec } = require('child_process');
execSync('ffmpeg -i ./mp4-2/test.gif ./mp4-2/test1.mp4', { stdio: 'inherit' });
3.将MP4转换为MP3
const { execSync, exec } = require('child_process');
execSync('ffmpeg -i ./mp4-2/test.mp4 ./mp4-2/test.mp3');
其他格式同理
2.添加水印
1. 将水印添加到顶部
-vf是用于视频滤镜(Video Filter)的选项,它允许你在处理视频时应用各种滤镜效果。具体来说,它用于添加、处理或修改视频流。drawtext=...:fontsize=50:设置文本的字体大小为50。text="仅供学习适用":这是你要在视频中显示的文字水印内容:仅供学习适用。fontcolor=0xff8a01:设置文本的字体颜色为redx=100:设置文字的 X 坐标,使其水平100像素的位置。y=100:设置文字的 Y 坐标,使其水平100像素的位置。
const { execSync, exec } = require('child_process');
execSync(`ffmpeg -i ./mp4-2/test.mp4 -vf drawtext=fontsize=50:text="仅供学习适用" :fontcolor=red:x=100:y=100 ./mp4-2/video-filter.mp4`,
{ stdio: 'inherit' }
);
2.将水印添加到中间
drawtext=...:fontsize=50:设置文本的字体大小为50。text="仅供学习适用":这是你要在视频中显示的文字水印内容:仅供学习适用。fontcolor=0xff8a01:设置文本的字体颜色为#ff8a01, 即橙色(十六进制表示法,格式为0xRRGGBB)。也可以设置这种方式red blue yellowx=(main_w-text_w)/2:设置文字的 X 坐标,使其水平居中。main_w是视频的宽度,text_w是文字的宽度,所以(main_w - text_w) / 2可以让文字水平居中。y=(main_h-text_h)/2:设置文字的 Y 坐标,使其垂直居中。main_h是视频的高度,text_h是文字的高度,所以(main_h - text_h) / 2可以让文字垂直居中。
const { execSync, exec } = require('child_process');
execSync(`ffmpeg -i ./mp4-2/test.mp4 -vf drawtext=fontsize=50:text="仅供学习适用" :fontcolor=0xff8a01:x=(main_w-text_w)/2:y=(main_h-text_h)/2 ./mp4-2/video-filter.mp4`,
{ stdio: 'inherit' }
);
3.删除水印
1.将在顶部水印删除
delogo的工作机制:delogo滤镜要求你手动提供具体的坐标和尺寸来定义需要移除的徽标区域(即四个参数:x、y、w、h)。delogo滤镜是一个简单的滤波操作,处理的是像素的具体位置和范围,主要用来对目标区域进行模糊或遮盖操作。
const { execSync, exec } = require('child_process');
execSync(
`ffmpeg -i ./mp4-2/video-filter1.mp4 -vf delogo=w=300:h=50:x=100:y=100 ./mp4-2/video- no-filter1.mp4`,
{
stdio: 'inherit',
}
);
2.去除中间的水印
1. delogo只支持绝对值
-
delogo不支持**main_w和main_h**:- 因为
delogo滤镜的工作方式是基于绝对像素位置的,而不是基于视频宽度和高度的动态计算。 main_w和main_h是表达式变量,用于获取视频的宽度和高度,通常用于滤镜如drawtext或crop中,它们支持使用这些表达式来进行相对位置的计算。- 但
delogo滤镜没有内置表达式解析功能,无法处理main_w和main_h。它期望的是固定的数值,而不是表达式。
- 因为
2.得到视频宽高
-
第一步先得到视频 宽和高
-
ffprobe- 这是命令行工具,用于获取多媒体文件的元数据信息,比如视频或音频流的信息。
-
-v error-v error:设置日志的详细程度级别为 "error",表示只输出错误信息,其他级别的信息(如警告或调试信息)将被抑制,确保输出的结果中只有你关心的数据(视频的宽度和高度)。
-
-select_streams v:0-
-select_streams v:0:指定选择第一个视频流。这里的
表示选择第一个(索引为 0)视频流。
v:指的是视频流(与a表示音频流相对)。:0:表示第一个流(流的索引从 0 开始),如果视频文件有多个视频流(例如多个角度或语言版本),你可以通过这个选项来选择特定的视频流。
-
execSync( `ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 ./mp4-2/video-filter.mp4`, { stdio: 'inherit', } ); // 我的输出视频的宽高 720,1280 -
3.算出文字的位置
const videoWidth = 720; // 视频的宽度
const videoHeight = 1280; // 视频的高度
const textWidth = 300; // 每个字体50px 仅供学习使用 6个字 50 *6 =300px
const textHeight = 50; // 文字高度
const X = (videoWidth - textWidth) / 2; // 计算中心位置的x坐标
const Y = (videoHeight - textWidth) / 2; // 计算中心位置的y坐标
execSync(
`ffmpeg -i ./mp4-2/video-filter1.mp4 -vf delogo=w=${textWidth}:h=${textHeight}:x=${X}:y=${Y} ./mp4-2/video-no-filter1.mp4`,
{
stdio: 'inherit',
}
);
4.手动算的很麻烦,我们可以用node插件使OpenCV
- OpenCV 是一个流行的开源计算机视觉库,它提供了许多强大的图像处理工具,可以用来检测水印。可以通过
opencv4nodejs插件在 Node.js 中使用 OpenCV。 - 这里就不过多介绍其他插件了详情可查看opencv4nodejs地址
4.视频裁剪 + 控制大小
1.时间格式
-
-ss起始时间- ss写在 -i的前面可能会导致精度问题,因为视频还没解析就跳转到了相关位置,但是解析速度快
- ss写在 -i后面精度没问题,但是解析速度会变慢
-
-to结束事件 -
时间格式
-
hh:mm:ss[.xxx]格式:表示 小时:分钟:秒.毫秒,可以精确到毫秒级别(.xxx为可选项)。 -
hh: 小时(可选)mm: 分钟(可选)ss: 秒xxx: 毫秒(可选) -
例如:
00:01:30:表示 1 分钟 30 秒00:00:15.500:表示 15 秒 500 毫秒
-
-
-ss:设置视频的开始时间 -
-ss 10:表示从视频的第 10 秒开始。 -
时间格式可以是
10(秒)或者00:00:10(时:分:秒)。
-to:设置视频的结束时间
-to 20:表示视频处理到第 20 秒结束(从-ss开始,到-to为止)。- 这里也可以使用
00:00:20的格式
2.开始截取
const {execSync} = require('child_process')
execSync(`ffmpeg -ss 00 -t 8 -i ./mp4-2/test.mp4 ./mp4-2/tailor.mp4`, {
stdio: 'inherit',
});
这样我们就把14秒的视频 截取到 8 秒了