ffmpeg-命令使用汇总-不断更新中

转mp4格式

ffmpeg -i input.mp4 output.avi
FFMPEG  -i  uploadfile/video/test.wmv -c:v libx264 -strict -2 uploadfile/mp4/test.mp4
FFMPEG  -i  uploadfile/video/test.wmv -c:v libx264 -strict -2 -s 1280x720 -b 1000k uploadfile/mp4/test.mp4

截取一张图片

使用说明
测试视频
66666.MP4
2155秒

请问视频1秒播放几帧图像,使用ffmpeg反复在同一秒截取图片是否截取的是同一帧图像?
答案是:是同一张图片

【通过】截取一张图片
ffmpeg -ss 00:00:30 -i input.mp4 -f image2 -y 66666-1.jpg

参数说明

-i 设定输入流
-f 设定输出格式 【网上说一般不用,会更加后缀名自动识别,但是我还是每次都加上】
image2 表示输出jpg格式
-ss 开始时间【时间格式:允许毫秒】 从视频哪里开始处理
比如下面的格式都是有效的
‘55’
55 seconds

‘12:03:45’
12 hours, 03 minutes and 45 seconds

‘23.189’
23.189 seconds


-y 覆盖输出文件 同名 不需要询问直接覆盖
【备注】 建议把ss参数放在 -i参数之前使用

截取多张图片

ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg

-r 表示每一秒几帧
-q:v 表示存储jpeg的图像质量,一般2是高质量
如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来.假设有60s,那会有60张 [如果视频特别长就会截取很多图片来,所以要设置一个时间段儿]

设置开始的时间,和你想要截取的时间,每秒1帧

ffmpeg -ss 00:00:30 -t 10 -i input.mp4  -r 1 -q:v 2 -f image2 -y pic-%03d.jpeg

-t 表示共要多少时间

ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧

其他
每秒2帧
ffmpeg -ss 00:00:30 -t 10 -i 66666.mp4 -r 2 -q:v 2 -f image2 -y pic-%03d.jpeg

每秒23帧 持续40秒 920张
ffmpeg -ss 00:00:30 -t 40 -i 66666.mp4 -r 23 -q:v 2 -f image2 -y pic-%03d.jpeg

每秒25帧 持续2秒 【默认25帧】
ffmpeg -ss 00:00:07 -t 2 -i 66666.mp4 -r 25 -q:v 2 -f image2 -y pic-%03d.jpeg

可以设置1.5吗
每秒24帧 持续1.5秒 36张图
ffmpeg -ss 00:00:07 -t 1.500 -i 66666.mp4 -r 24 -q:v 2 -f image2 -y pic-%03d.jpeg

最终:视频9秒 6个场景 每个场景1.5秒 持续截取1.5秒 开始在7.5秒左右 每秒24帧图像 一共36张图片

ffmpeg -ss 00:00:07.500 -t 1.500 -i input.mp4  -r 24 -q:v 2 -f image2 -y pic-%03d.jpeg

下面这个不清楚-r 0.2

假如影片第10分钟到第20分钟之间,每隔5秒截一张 共计120张
ffmpeg -ss 10:00 -t 10:00 -i 66666.mp4 -r 0.2 -q:v 2 -f image2 -y pic2-%03d.jpeg
ffmpeg -ss 10:00 -i input -f image2 -r 0.2 -t 10:00 %3d.jpg

设置输出帧大小 -s 480X270 300X168

ffmpeg -ss 00:00:07.500 -t 1.500 -i input.mp4  -r 24 -q:v 2 -f image2 -y -s 480X270 pic-%03d.jpeg

提取视频

ffmpeg -i "A_File.mp4" -ss 00:00:0.0 -t 10 -an "B_File.mp4"
-an 不处理音频

【通过】提取视频–默认方式
ffmpeg -ss 00:00:07.500 -t 1.500 -i 66666.mp4 -y -an B_File.mp4

【通过】提取视频–指定尺寸
ffmpeg -ss 00:00:07.500 -t 1.500 -i 66666.mp4 -y -an -s 480X270 B_File.mp4

【通过】提取视频–缩放方式
ffmpeg -ss 00:00:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=480:-1 B_File.mp4

ps: 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。【但是必须保证一定的比率】,否则就会向下面这样报错

【不通过】 height not divisible by 2 (300×169)
ffmpeg -ss 00:00:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=300:-1 B_File.mp4

【通过】
ffmpeg -ss 00:00:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=300:168 B_File.mp4

通过设置高度168 可以解决

提取视频【实际使用】

在实际使用中我使用下面的命令提取视频

ffmpeg -i 88888.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 cutout1.mp4 -y
ffmpeg -i 88888.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 -ss 00:01:30 -to 00:01:50 cutout1.mp4 -y
ffmpeg -ss 00:46:28 -i "Morning_News.asf" -acodec copy -vcodec copy -t 00:03:25 output.asf

这行命令解释为:从文件 Morning_News.asf 第 46:28 分秒开始,截取 03: 25 的时间,其中视频和音频解码不变,输出文件名为 output.asf

这样提取出来的视频和原始视频一样的编码

视频合并

首先提前截取各个场景

480
ffmpeg -ss 00:00:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=480:-1 B_File1.mp4
ffmpeg -ss 00:06:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=480:-1 B_File2.mp4
ffmpeg -ss 00:12:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=480:-1 B_File3.mp4
ffmpeg -ss 00:18:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=480:-1 B_File4.mp4
ffmpeg -ss 00:24:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=480:-1 B_File5.mp4
ffmpeg -ss 00:30:07.500 -t 1.500 -i 66666.mp4 -y -an -vf scale=480:-1 B_File6.mp4

合并视频

ffmpeg -f concat -i files.txt -c copy -y output.mp4

files.txt格式如下

file 'B_File1.mp4'
file 'B_File2.mp4'
file 'B_File3.mp4'
file 'B_File4.mp4'
file 'B_File5.mp4'
file 'B_File6.mp4'

再看一个例子

264秒
ffmpeg -ss 00:00:07.500 -t 1.500 -i 88888.mp4 -y -an -vf scale=480:-1 B_File1.mp4
ffmpeg -ss 00:00:51.500 -t 1.500 -i 88888.mp4 -y -an -vf scale=480:-1 B_File2.mp4
ffmpeg -ss 00:01:35.500 -t 1.500 -i 88888.mp4 -y -an -vf scale=480:-1 B_File3.mp4
ffmpeg -ss 00:02:19.500 -t 1.500 -i 88888.mp4 -y -an -vf scale=480:-1 B_File4.mp4
ffmpeg -ss 00:03:03.500 -t 1.500 -i 88888.mp4 -y -an -vf scale=480:-1 B_File5.mp4
ffmpeg -ss 00:03:47.500 -t 1.500 -i 88888.mp4 -y -an -vf scale=480:-1 B_File6.mp4
ffmpeg -f concat -i files.txt -c copy -y output2.mp4

视频转码

一个视频的编码是MPEG4,想用H264编码,咋办?

ffmpeg -i c.mp4 -vcodec h264 c_output.mp4

相反也一样

ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

当然了,如果ffmpeg当时编译时,添加了外部的x265或者X264,那也可以用外部的编码器来编码。

(不知道什么是X265,可以 Google一下,简单的说,就是她不包含在ffmpeg的源码里,是独立的一个开源代码,用于编码HEVC,ffmpeg编码时可以调用它。当然 了,ffmpeg自己也有编码器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4

R软件教程-宝塔面板批量建站操作步骤

准备母程序

先新建一个WordPress网站,各项都修改好

修改wp-config.php文件的配置信息

  • 数据库名字 DB_NAME
  • 数据库用户名 DB_USER
  • 数据库密码 DB_PASSWORD

在数据库中修改域名,替换成新的域名

重点:需要通过命令行的方式导出脚本

/www/server/mysql/bin/mysqldump -h localhost -u root -pd18460cc22453db0 wp_goodbrook > /root/wp_goodbrook.sql

然后下载做好的母程序

新建一个文件夹 母程序

在文件夹下新建三个文件夹

  • sql
  • wp_master
  • wp_sql

wp_sql文件夹下 存放用命令导出的脚本 “mysqldump.sql”

准备ok 上传到 root 目录下 并解压

开启宝塔面板API

进入宝塔面板设置,开启API接口选项

复制密钥

添加白名单IP,通过百度 IP关键字 查询你的上网IP

复制你面板的url访问地址

复制你mysql root 总的访问密码

这些信息会添加到第三步骤的配置文件中

修改配置文件和添加域名

由六项信息修改

  • api_addsite
  • api_btSign
  • bt_mysql_newpwd
  • wpmaster_domain
  • wpmaster_dbname
  • wpmaster_oldpwd

运行命令脚本

1.1 命令代号 开始宝塔批量建站

输入 C:\Users\Administrator\Desktop\Work

work工作目录

是否创建FTP 0

是否创建数据库 1

开始生成

ffmpeg-gif-图片合成Gif命令-秋名山

命令如下

C:\Users\Administrator\AppData\Local\Temp\ScreenToGif\Recording\
ffmpeg.exe -f image2 -i C:\Users\Administrator\AppData\Local\Temp\ScreenToGif\Recording\G1006\%d.png -vcodec libx264 -r 10 G1006.mp4

ffmpeg.exe -f image2 -i C:\Users\Administrator\AppData\Local\Temp\ScreenToGif\Recording\G1015\%d.png -vcodec libx264 -r 10 G1015.mp4

ffmpeg支持很多中视频格式,想知道ffmpeg支持哪些编码格式,可以用 ffmpeg -codecs 命令来查看

你的图片可以是jpg, 可以bmp,可以是tiff。其他的格式可以自己测试

假如你的图片在c:\temp\下面。那么通过下面的命令就可以将这个目录下面的图片转换成视频。这里面有个要求就是你的图片全部是自然数为文件名, 001, 002, 003这样的。前面要几个0取决于你的图片的个数,如109张,那么就是3-1=2个0,从001 到109,如果是1009张就是0001到1009

ffmpeg -f image2 -i c:\temp\d.jpg test.mp4

你可以指定编码格式:

ffmpeg -f image2 -i c:\temp\d.jpg -vcodec libx264 test.mp4

也许你还想指定输出帧率:

ffmpeg -f image2 -i c:\temp\d.jpg -vcodec libx264 -r 10  test.mp4

这样输出的test.mp4就是每秒播放10帧了

如果你要指定码率:

ffmpeg -f image2 -i c:\temp\d.jpg -vcodec libx264 -r 10 -b 200k  test.mp4

注意这里的200k的单位bit/s.

最后生成的文件的参数都是什么样子,比如我们刚才设置的参数,还有我们没有设置的参数:

那么这个命令就可以帮你搞定:

ffmpeg -i test.mp4

前面是你用的ffmpeg的基本信息:

包括版本,编译时间,用的编译器,配置选项。

重点看绿色部分,这也是你会关心的东西:

duration告诉视频时长,这里是10秒, bitrate是码率。

video: 视频编码格式。 帧率是10fps。

【思路】-GIF加水印

GIF加水印
目的:实现GIF加水印的效果,实现水印文字在GIF移动的效果


脑补知识:帧,GIF是一组帧的集合,帧是一张张图片按照顺序进行展示,每张帧有自己的延迟时间,所以整体来看GIF播放效果就是每张帧延迟一定的时间,最终看到GIF播放的效果
关于帧延迟:该帧的延迟时间就是下一帧的间隔时间

实现思路


通过2345看图王发现一个保存帧的功能,保存之后在一个文件夹下发现了一组静态的图片
也就说明可以从GIF中提取帧
第一步:从GIF提取帧
第二步:对提取之后的帧,也就是每张图单独的使用GDI编程加水印
第三步:关键点:合成,合成不是我来做的用到一个开源的组件Gif.Components,这个组件提供了这个功能
通过给这个组件输入一组按一定顺序的Image对象,并设置一个延迟,最终输出一个GIF图片 实现我们加水印的功能

提取帧


GIF通过绝对路径的方式初始化系统中的一个Image对象,该对象可以获取到GIF所有的帧GetFrameCount
循环遍历,并激活当前帧,在使用gif.Save(fileName, ImageFormat.Jpeg);把帧提取出来最终完成帧的提取工作

下一步就是逐个加水印


WaterMark 来自于别人写的类,可以实现文字水印和图片水印
既然加水印,就可以设置水印的位置,对于提取之后的每张帧,我们在处理完第一张帧是之后,让第二张帧偏移指定的像素,这样合成之后就可以实现文字的移动效果
通过控制x-y 两个方向上的偏移,文字可以实现各种移动的效果

批量加水印


多线程的使用:对此有几点说明
1.在线程上调用方法,所谓多线程,其实就是在线程上调用方法,并且传递你自定义的数据对象【我觉得学习多线程入门这一点一定要记住:方法是在线程上调用的,线程一开启方法就会执行】
2.包:就是传递给线程指定方法的自定义的参数对象

所以我将整个处理GIF加水应的写在一个总的函数里面,GifRun(object gd) 该函数接收一个自定义参数,包括了该函数所需要的全部数据
通过外面的循环实例化线程对象,开始执行每一个加水印的任务【一个GIF的处理就是一个任务,就需要一个线程对象来处理】
注意点:所有的都使用实例对象来完成,暂时不适用静态的方法和字段
美中不足
GIF合成的组件处理完成之后GIf的效果和原始的GIF多少还有些差别,这个地方暂时无法解决

X小知识-Win10 如何查找当前文件夹被哪个进程占用

删除文件夹的时候经常出现文件夹被占用的情况,那么到底是被哪个进程占用呢?

总的来说就是资源监视器中查看关联的句柄

1、在win10系统桌面上,任务栏,右键,单击任务管理器。

2、单击性能。

3、单击打开资源监视器。

4、在单击CPU标签,然后再“关联的句柄”右侧的搜索框中输入要删除的文件夹名。例:tre文件夹名。

5、找到关于要删除的文件夹名目录。然后右键,结束进程。