开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1726|回复: 9
收起左侧

[分享] ffmpeg常用命令总汇

[复制链接]
结帖率:95% (21/22)
发表于 2022-10-23 09:22:59 | 显示全部楼层 |阅读模式   河南省新乡市
本帖最后由 若昕 于 2022-10-23 09:25 编辑

FFmpeg
选项
一、主要选项

1、-f fmt (input/output) 指定输入或者输出文件格式。常规可省略而使用依据扩展名的自动指定,但一些选项需要强制明确设定。

2、-i filename (input) 指定输入文件。

3、-y (global) 默认自动覆盖输出文件,而不再询问确认。

4、-n (global) 不覆盖输出文件,如果输出文件已经存在则立即退出。

5、-t duration(input/output) 限制输入/输出的时间。如果是在 -i 前面,就是限定从输入中读取多少时间的数据;如果是用于限定输出文件,则表示写入多少时间数据后就停止。duration可以是以秒为单位的数值或者 hh:mm:ss[.xxx] 格式的时间值。 注意 -to 和 -t 是互斥的,-t 有更高优先级。

6、-to position (output) 只写入position时间后就停止,position可以是以秒为单位的数值或者 hh:mm:ss[.xxx]格式的时间值。 注意 -to 和 -t 是互斥的,-t 有更高优先
7、-ss position (input/output)
当在 -i 前,表示定位输入文件到position指定的位置。注意可能一些格式是不支持精确定位的,所以ffmpeg可能是定位到最接近position(在之前)的可定位点。position可以是以秒为单位的数值或者 hh:mm:ss[.xxx] 格式的时间值。

8、-itsoffset offset (input) 设置输入文件的时间偏移。offset 必须采用时间持续的方式指定,即可以有-号的时间值(以秒为单位的数值或者 hh:mm:ss[.xxx] 格式的时间值)。偏移会附加到输入文件的时间码上,意味着所指定的流会以时间码+偏移量作为最终输出时间码。

9、-timestamp date (output) 设置在容器中记录时间戳。

10、-codec[:stream_specifier] codec (input/output,per-stream) 为特定的文件选择编/解码模式,对于输出文件就是编码器,对于输入或者某个流就是解码器。选项参数中 codec 是编解码器的名字,或者是 copy(仅对输出文件)则意味着流数据直接复制而不再编码。

二、视频选项

1、-vframes number (output) 设置输出文件的帧数,是 -frames:v 的别名。

2、-r[:stream_specifier] fps (input/output,per-stream) 设置帧率(一种Hz值,缩写或者分数值)。

3、-s[:stream_specifier] size (input/output,per-stream) 设置帧的尺寸。

4、-vn (output) 禁止输出视频。

5、-vcodec codec (output) 设置视频编码器,这是 -codec:v 的一个别名。

6、aspect[:stream_specifier] aspect (output,per-stream) 指定视频的纵横比(长宽显示比例)。aspect 是一个浮点数字符串或者num:den格式字符串(其值就是num/den),例如"4:3","16:9","1.3333"以及"1.7777"都是常用参数值。

三、音频选项

1、-aframes number (output) 设置 number 音频帧输出,是 -frames:a 的别名。

2、-ar[:stream_specifier] freq (input/output,per-stream) 设置音频采样率。默认是输出同于输入。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。对于输出则可以强制设置音频量化的采用率。

3、-aq q (output) 设置音频品质(编码指定为VBR),它是 -q:a 的别名。

4、-ac[:stream_specifier] channels (input/output,per-stream) 设置音频通道数。默认输出会有输入相同的音频通道。对于输入进行设置,仅仅通道是真实的设备或者raw数据分离出并映射的通道才有效。

5、-an (output) 禁止输出音频。

6、-acode codec (input/output) 设置音频解码/编码的编/解码器,是 -codec:a 的别名。

四、字幕选项

1、-scodec codec(input/output) 设置字幕解码器,是 -codec:s 的别名。

2、-sn (output) 禁止输出字幕。

3、-fix_sub_duration 修正字幕持续时间。

4、-canvas_size size 设置字幕渲染区域的尺寸(位置)。

FFmpeg命令示例

1、转化格式

ffmpeg -i input_test.mp4 -vn -acodec copy output_test.flv

ffmpeg -i input_test.aac -vn -acodec copy output_test.mp3

2、抽取画面中的音频

ffmpeg -i input_test.mp4 -vn -y -acodec copy output_test.aac

ffmpeg -i input_test.mp4 -vn -y -acodec copy output_test.mp3

ffmpeg -i input_test.mp4 -acodec copy -vn output_test.mp3

3、抽取画面中的视频

ffmpeg -i input_test.mp4 -vcodec copy -an output_test.avi

ffmpeg -i input_test.mp4 -vcodec copy -an output_test.mp4

4、音频+视频合成

ffmpeg -i input_test_1.mp4 -i input_test_2.mp3 -vcodec copy -acodec copy output_test.mp4

ffmpeg -i input_test_1.mp4 -itsoffset 10 -i input_test_2.mp3 -vcodec copy -acodec copy output_test.mp4

ffmpeg -ss 20 -t 5 -i input_test_1.mp4 -i input_test_2.aac -vcodec copy -acodec copy output_test.mp4
音乐持续播放,视频只播放5秒

ffmpeg -ss 20 -t 5 -i input_test_1.mp3 -i input_test_2.mp4 -vcodec copy -acodec copy output_test.mp4
视频持续播放,音乐只播放5秒

5、音频+音频合成

ffmpeg -i input_test_1.mp3 -i input_test_2.mp3 -filter_complex amix=inputs=2:duration=shortest output_test.mp3

ffmpeg -i input_test_1.mp3 -i input_test_2.mp3 -filter_complex amix=inputs=2:duration=longest output_test.mp3

ffmpeg –i input_test_1.mp3 –i input_test_2.mp3 –vcodec copy –acodec copy output_test.mp3

格式:ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT

6、视频分离成图片

ffmpeg -i input_test.mp4 -r 1 -f image2 output_image-%03d.jpeg

7、图片合成视频

ffmpeg -f image2 -i output_image-%03d.jpeg output_test.mp4

8、改变音量大小
ffmpeg -i input_test.mp3 -af 'volume=0.5' output_test.mp3

9、音效淡入淡出效果

ffmpeg -i input_test.mp3 -filter_complex afade=t=in:ss=0:d=4 output_test.mp3

淡入效果:把 input_test.mp3 文件的前5s做一个淡入淡出效果,输出到 output_test.mp3
文件中

ffmpeg -i input_test.mp3 -filter_complex afade=t=out:st=20:d=6 output_test.mp3

淡出效果:将 input_test.mp3 文件从20s开始,做6s的淡出效果,输出到 output_test.mp3 文件中

10、截取音频

ffmpeg -ss 10 -i input_test.mp3 -to 20 -vcodec copy -acodec copy output_test.mp3

ffmpeg -ss 10 -i input_test.mp3 -t 5 -vcodec copy -acodec copy output_test.mp3

ffmpeg -i input_test.mp3 -c copy -t 10 -output_ts_offset 120 output_test.mp3

11、容器时长获取
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i input_test.mp3

12、网络资源下载
ffmpeg -i https://xxx.xxx.xxxxxx -c copy -f mp3 output_test.mp3

13、播放音频视频
ffplay input_test.mp3
14、图片生成gif动图
ffmpeg -i input_image_%03d.png -r 5 output_test.gif

15、抽取PCM数据
ffmpeg -i input_test.mp4 -vn -ar 44100 -ac 2 -f s16le output_test.pcm


签到天数: 13 天

发表于 2024-3-26 06:08:35 | 显示全部楼层   福建省龙岩市
这个很全,要是有示例就跟更好了
回复 支持 反对

使用道具 举报

发表于 2022-12-13 16:02:56 | 显示全部楼层   浙江省台州市
若昕 发表于 2022-10-29 17:18
【FFmpeg 基本用法】
本课要解决的问题
1.FFmpeg的转码流程是什么?

感谢作者
回复 支持 反对

使用道具 举报

结帖率:87% (41/47)
发表于 2022-12-9 14:42:55 | 显示全部楼层   广东省汕头市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:84% (27/32)

签到天数: 4 天

发表于 2022-12-4 22:05:22 | 显示全部楼层   吉林省白城市
多个音频按规定时间合并成一个音频 类似根据字幕时间去拼接音频,但是音频会逐渐变大或者变小怎么破
回复 支持 反对

使用道具 举报

结帖率:95% (21/22)
 楼主| 发表于 2022-11-27 19:25:52 | 显示全部楼层   河南省新乡市
FFmpeg 音频 调节音量 剪切 合成 拼接 视频命令:
--------------------------------------------------------------
a.音频调节音量大小
String cmd = "-y -i " + input.mp3+" -af volume=-10dB "+ outpath.mp3;

b.音频拼接
String cmd1 = "-y -i " + "concat:"+ inputone.mp3+"|"+ inputtwo.mp3+" -acodec copy "+outpath.mp3;
c.音频截取
String cmd2 = "-y -i " +  input.mp3+" -ss 00:00:00 -t 00:00:05 "+outpath.mp3;
d.音频合成
String cmd3 = "-y -i " + inputone.mp3 + " -i " + inputtwo.mp3 + " -filter_complex     amix=inputs=2:duration=first:dropout_transition=4 "
         + outpath.mp3;
f.视频压缩
String cmd = "-y -i " + invideoPath+ " -strict -2 -vcodec libx264 -preset ultrafast " + "-crf 30 -acodec aac -ar 44100 -ac 2 -b:a 96k -vf scale=-2:800 " + outputPath;
以上命令自己项目亲身写的,一定OK,下面视频的做一个记录方便后面查找

1. 视频转换
比如一个avi文件,想转为mp4,或者一个mp4想转为ts。
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts

2. 提取音频
ffmpeg -i test.mp4 -acodec copy -vn output.aac
上面的命令,默认mp4的audio codec是aac,如果不是,可以都转为最常见的aac。
ffmpeg -i test.mp4 -acodec aac -vn output.aac

3. 提取视频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4

4. 视频剪切
下面的命令,可以从时间为00:00:15开始,截取5秒钟的视频。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
-ss表示开始切割的时间,-t表示要切多少。上面就是从15秒开始,切5秒钟出来。

5. 码率控制
码率控制对于在线视频比较重要。因为在线视频需要考虑其能提供的带宽。

那么,什么是码率?很简单:
bitrate = file size / duration
比如一个文件20.8M,时长1分钟,那么,码率就是:
biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音频的码率只有固定几种,比如是128Kbps,
那么,video的就是
video biterate = 2831Kbps -128Kbps = 2703Kbps。

那么ffmpeg如何控制码率。
ffmpg控制码率有3种选择,-minrate -b:v -maxrate
-b:v主要是控制平均码率。
比如一个视频源的码率太高了,有10Mbps,文件太大,想把文件弄小一点,但是又不破坏分辨率。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
上面把码率从原码率转成2Mbps码率,这样其实也间接让文件变小了。目测接近一半。
不过,ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize
-bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好)
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4

-minrate -maxrate就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4

6. 视频编码格式转换
比如一个视频的编码是MPEG4,想用H264编码,咋办?
ffmpeg -i input.mp4 -vcodec h264 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

7. 只提取视频ES数据
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264

8将输入的1920x1080缩小到960x540输出:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//ps: 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。

9. 截取视频图像
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒几帧
-q:v表示存储jpeg的图像质量,一般2是高质量。
如此,ffmpeg会把input.mp4,每隔一秒,存一张图片下来。假设有60s,那会有60张。


可以设置开始的时间,和你想要截取的时间。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-ss 表示开始时间
-t 表示共要多少时间。
如此,ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。

10. 序列帧与视频的相互转换
把darkdoor.[001-100].jpg序列帧和001.mp3音频文件利用mpeg4编码方式合成视频文件darkdoor.avi:
$ ffmpeg -i 001.mp3 -i darkdoor.%3d.jpg -s 1024x768 -author fy -vcodec mpeg4 darkdoor.avi
————————————————
版权声明:本文为CSDN博主「振天决」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhenzhen525/article/details/83104877
回复 支持 反对

使用道具 举报

结帖率:100% (26/26)

签到天数: 9 天

发表于 2022-11-10 22:08:16 | 显示全部楼层   广东省中山市
学习了 谢谢
回复 支持 反对

使用道具 举报

结帖率:95% (21/22)
 楼主| 发表于 2022-10-29 17:18:46 | 显示全部楼层   河南省新乡市
【FFmpeg 基本用法】
本课要解决的问题
1.FFmpeg的转码流程是什么?
2.常见的视频格式包含哪些内容吗?
3.如何把这些内容从视频文件中抽取出来?
4.如何从一种格式转换为另一种格式?
5.如何放大和缩小视频?
6.如何旋转,翻转,填充,裁剪,模糊,锐化视频?
7.如何给视频加logo,删除logo?
8.如何给视频加文本,动态文本?
9.如何处理图片?
10.如何录像,添加动态logo,截图,马赛克视频?
第一部分
一基础术语
容器(Container)
容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
流(Stream)
是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
帧(Frame)
帧代表一幅静止的图像,分为I帧,P帧,B帧。
编×××(Codec)
是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
复用/解复用(mux/demux)
把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)
二简介
FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。
FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。
三组成
1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;
2、libavcodec:用于各种类型声音/图像编解码;
3、libavutil:包含一些公共的工具函数;
4、libswscale:用于视频场景比例缩放、色彩映射转换;
5、libpostproc:用于后期效果处理;
6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;
7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;
8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

四FFmpeg处理流程
过滤器(Filter)
在多媒体处理中,filter的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。
语法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…
过滤器图link label :是标记过滤器的输入或输出的名称
1.视频过滤器 -vf
如testsrc视频按顺时针方向旋转90度
ffplay -f lavfi -i testsrc -vf transpose=1
如testsrc视频水平翻转(左右翻转)
ffplay -f lavfi -i testsrc -vf hflip
2.音频过滤器 -af
实现慢速播放,声音速度是原始速度的50%
ffplay p629100.mp3 -af atempo=0.5
如何实现顺时针旋转90度并水平翻转?
过滤器链(Filterchain)
基本语法
Filterchain = 逗号分隔的一组filter
语法:“filter1,filter2,filter3,…filterN-2,filterN-1,filterN”
顺时针旋转90度并水平翻转
ffplay -f lavfi -i testsrc -vf transpose=1,hflip
如何实现水平翻转视频和源视频进行比较? 看过滤器链是如何实现的。
过滤器链(Filterchain)
第一步: 源视频宽度扩大两倍。
ffmpeg -i jidu.mp4 -t 10 -vf pad=2*iw output.mp4
第二步:源视频水平翻转
ffmpeg -i jidu.mp4 -t 10 -vf hflip output2.mp4
第三步:水平翻转视频覆盖output.mp4
ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
是不是很复杂?
用带有链接标记的过滤器图(Filtergraph)只需一条命令。
基本语法
Filtergraph = 分号分隔的一组filterchain
“filterchain1;filterchain2;…filterchainN-1;filterchainN”
Filtergraph的分类
1、简单(simple) 一对一
2、复杂(complex)多对一, 多对多
过滤器图(Filtergraph)
用ffplay直接观看结果:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w




F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]
F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].
F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].
F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.
五选择媒体流
一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流,如何从容器中抽取各种流呢?
语法:
-map file_number:stream_type[:stream_number]
这有一些特别流符号的说明:
1、-map 0 选择第一个文件的所有流
2、-map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等。
3、特殊参数-an,-vn,-sn分别排除所有的音频,视频,字幕流。
注意:文件序号和流序号从0开始计数。
第二部分
查看帮助
FFmpeg工具有一个巨大的控制台帮助。下表描述了可用的一些选项,斜体字表示要被替换的项,ffplay和ffprobe也有一些类似的选项。
可用的bit流 :ffmpeg –bsfs
可用的编×××:ffmpeg –codecs
可用的×××:ffmpeg –decoders
可用的编码器:ffmpeg –encoders
可用的过滤器:ffmpeg –filters
可用的视频格式:ffmpeg –formats
可用的声道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的协议:ffmpeg -protocals

第三部分
码率、帧率和文件大小
概述
        码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。
帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。
帧率
1、用 -r 参数设置帧率
ffmpeg –i input –r fps output
2、用fps filter设置帧率
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
帧率的预定义值:
例如设置码率为29.97fps,下面三种方式具有相同的结果:
ffmpeg -i input.avi -r 29.97 output.mpg
ffmpeg -i input.avi -r 30000/1001 output.mpg
ffmpeg -i input.avi -r netsc output.mpg
码率、文件大小
设置码率 –b 参数
-b
ffmpeg -i film.avi -b 1.5M film.mp4
音频:-b:a     视频: - b:v
设置视频码率为1500kbps
ffmpeg -i input.avi -b:v 1500k output.mp4
控制输出文件大小
-fs (file size首字母缩写)
ffmpeg -i input.avi -fs 1024K output.mp4
计算输出文件大小
(视频码率+音频码率) * 时长 /8 = 文件大小K

第四部分
调整视频分辨率
调整视频分辨率
1、用-s参数设置视频分辨率,参数值wxh,w宽度单位是像素,h高度单位是像素
ffmpeg -i input_file -s 320x240 output_file
2、预定义的视频尺寸
下面两条命令有相同效果
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi
下表列出了所有的预定义尺寸
Scale filter调整分辨率
Scale filter的优点是可以使用一些额外的参数
语法:
Scale=width:height[:interl={1|-1}]
下表列出了常用的额外参数
举例
下面两条命令有相同效果
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4
对输入视频成比例缩放
改变为源视频一半大小
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
改变为原视频的90%大小:
ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4
举例
在未知视频的分辨率时,保证调整的分辨率与源视频有相同的横纵比。
宽度固定400,高度成比例:
ffmpeg -i input.avi -vf scale=400:400/a
ffmpeg -i input.avi -vf scale=400:-1
相反地,高度固定300,宽度成比例:
ffmpeg -i input.avi -vf scale=-1:300
ffmpeg -i input.avi -vf scale=300*a:300

第五部分
裁剪/填充视频
裁剪视频crop filter
从输入文件中选取你想要的矩形区域到输出文件中,常见用来去视频黑边。
语法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]
举例
裁剪输入视频的左三分之一,中间三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output
裁剪帧的中心
当我们想裁剪区域在帧的中间时,裁剪filter可以跳过输入x和y值,他们的默认值是
Xdefault  = ( input width - output width)/2
Ydefault  = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file
裁剪中间一半区域:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
举例
比较裁剪后的视频和源视频比较
ffplay -i jidu.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2*iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w*2.4:40
自动检测裁剪区域
cropdetect  filter 自动检测黑边区域
ffplay jidu.mp4 -vf cropdetect
然后用检测到的值来裁剪视频
ffplay jidu.mp4 –vf crop=672:272:0:54
填充视频(pad)
在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比
语法:pad=width[:height:[:x[:y:[:color]]]]
举例
创建一个30个像素的粉色宽度来包围一个SVGA尺寸的图片:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
?
同理可以制作testsrc视频用30个像素粉色包围视频
ffplay  -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink
4:3到16:9
一些设备只能播放16:9的横纵比,4:3的横纵比必须在水平方向的两边填充成16:9,

高度被保持,宽度等于高度乘以16/9,x(输入文件水平位移)值由表达式(output_width - input_width)/2来计算。
4:3到16:9的通用命令是:
ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output
举例
ffplay  -f lavfi -i testsrc -vf pad=ih*16/9:ih:(ow-iw)/2:0:pink
16:9到4:3
为了用4:3的横纵比来显示16:9的横纵比,填充输入文件的垂直两边,宽度保持不变,高度是宽度的3/4,y值(输入文件的垂直偏移量)是由一个表达式(output_height-input_height)/2计算出来的。
16:9到4:3的通用命令:
ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output
举例
ffplay  -f lavfi -i testsrc=size=320x180 -vf pad=iw:iw*3/4:0:(oh-ih)/2:pink


第六部分
翻转和旋转
翻转
水平翻转语法: -vf hflip
ffplay -f lavfi -i testsrc -vf hflip
垂直翻转语法:-vf vflip
ffplay -f lavfi -i testsrc -vf vflip
旋转
语法:transpose={0,1,2,3}
0:逆时针旋转90°然后垂直翻转
1:顺时针旋转90°
2:逆时针旋转90°
3:顺时针旋转90°然后水平翻转
第七部分
模糊,锐化
模糊语法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
ffplay -f lavfi -i testsrc -vf  boxblur=1:10:4:10
注意:luma_r和alpha_r半径取值范围是0~min(w,h)/2, chroma_r半径的取值范围是0~min(cw/ch)/2
锐化
语法:-vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
所有的参数是可选的,默认值是5:5:1.0:5:5:0.0
l_msize_x:水平亮度矩阵,取值范围3-13,默认值为5
l_msize_y:垂直亮度矩阵,取值范围3-13,默认值为5
l_amount:亮度强度,取值范围-2.0-5.0,负数为模糊效果,默认值1.0
c_msize_x:水平色彩矩阵,取值范围3-13,默认值5
c_msize_y:垂直色彩矩阵,取值范围3-13,默认值5
c_amount:色彩强度,取值范围-2.0-5.0,负数为模糊效果,默认值0.0
举例
使用默认值,亮度矩阵为5x5和亮度值为1.0
ffmpeg -i input -vf unsharp output.mp4
高斯模糊效果(比较强的模糊):
ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2

第八部分
覆盖(画中画)
覆盖
语法:overlay[=x[:y]
所有的参数都是可选,默认值都是0

举例
Logo在左上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

举例
右上角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w  pair2.mp4
左下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h  pair2.mp4
右下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h  pair2.mp4

删除logo
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h  logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0.
ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0
第九部分
添加文本
添加文本
语法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的参数值
x:离左上角的横坐标
y: 离左上角的纵坐标
fontcolor:字体颜色
fontsize:字体大小
text:文本内容
textfile:文本文件
t:时间戳,单位秒
n:帧数开始位置为0
draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数
简单用法
1、在左上角添加Welcome文字
ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央添加Good day
ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"
3、设置字体颜色和大小
ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"

动态文本
用 t (时间秒)变量实现动态文本
1、顶部水平滚动
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"
2、底部水平滚动
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"
3、垂直从下往上滚动
ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“
想实现右上角显示当前时间?


动态文本
在右上角显示当前时间 localtime
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'“

每隔3秒显示一次当前时间
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}':enable=lt(mod(t\,3)\,1)"

第十部分
图片处理
图片支持
FFmpeg支持绝大多数图片处理, 除LJPEG(无损JPEG)之外,其他都能被解码,除了EXR,PIC,PTX之外,所有的都能被编码。
截取一张图片使用 –ss(seek from start)参数.
ffmpeg -ss 01:23:45 -i jidu.mp4 p_w_picpath.jpg
从视频中生成GIF图片
ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif
转换视频为图片(每帧一张图)
ffmpeg -i clip.avi frame%4d.jpg
图片转换为视频
ffmpeg -f p_w_picpath2 -i img%4d.jpg -r 25 video.mp4

裁剪、填充
和视频一样,图片也可以被裁剪和填充
裁剪
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
填充
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg

翻转,旋转,覆盖
和视频一样图片同样能翻转,旋转和覆盖
翻转
ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
旋转
ffmpeg -i p_w_picpath.png -vf transpose=1 p_w_picpath_rotated.png
覆盖
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2  rgb_smpte.png

第十一部分
其他高级技巧
屏幕录像
显示设备名称
ffmpeg -list_devices 1 -f dshow -i dummy
调用摄像头
ffplay -f dshow  -i video="Integrated Camera"
保存为文件
ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4

添加字幕subtitles
语法 –vf subtitles=file

ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
视频颤抖、色彩平衡
视频颤抖
ffplay –i jidu.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)

色彩平衡
ffplay -i jidu.mp4 -vf curves=vintage
色彩变幻
ffplay -i jidu.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1“
彩色转换黑白
ffplay -i jidu.mp4 -vf lutyuv="u=128:v=128"
设置音频视频播放速度
3倍视频播放视频
ffplay -i jidu.mp4 -vf setpts=PTS/3
?速度播放视频
ffplay -i jidu.mp4  -vf setpts=PTS/(3/4)
2倍速度播放音频
ffplay -i speech.mp3 -af atempo=2

问题:视频和音频同时3/4慢速播放
截图
每隔一秒截一张图
ffmpeg -i input.flv -f p_w_picpath2 -vf fps=fps=1 out%d.png
每隔20秒截一张图
ffmpeg -i input.flv -f p_w_picpath2 -vf fps=fps=1/20 out%d.png

注意:ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一张图。
多张截图合并到一个文件里(2x3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图
ffmpeg? -i jidu.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png

马赛克视频
马赛克视频
用多个输入文件创建一个马赛克视频:
ffmpeg -i jidu.mp4 -i jidu.flv -i "Day By Day SBS.mp4" -i "Dangerous.mp4" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv

Logo动态移动
1、2秒后logo从左到右移动:
ffplay -i jidu.mp4  -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0

2、2秒后logo从左到右移动后停止在左上角
ffplay -i jidu.mp4  -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0
3、每隔10秒交替出现logo。
ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4

-----------------------------------
ffmpeg 基本用法大全
https://blog.51cto.com/huangfu3342/1614055
回复 支持 反对

使用道具 举报

结帖率:95% (21/22)
 楼主| 发表于 2022-10-23 16:34:32 | 显示全部楼层   河南省新乡市
FFMPEG完美入门资料.rar (537.45 KB, 下载次数: 27)
回复 支持 反对

使用道具 举报

结帖率:95% (21/22)
 楼主| 发表于 2022-10-23 11:39:54 | 显示全部楼层   河南省新乡市
2.2 FFmpeg 参数说明
2.2.1  通用选项
-L license
-h  帮助
-fromats  显示可用的格式,编解码的,协议的。
-f fmt  强迫采用格式 fmt
-i filename  输入文件
-y  覆盖输出文件
-t duration  设置纪录时间   hh:mm:ss[.xxx]格式的记录时间也支持
-ss position  搜索到指定的时间  [-]hh:mm:ss[.xxx]的格式也支持
-title string  设置标题
-author string  设置作者
-copyright string  设置版权  
-comment string  设置评论
-target type  设置目标文件类型(vcd,svcd,dvd)  所有的格式选项(比特率,编解码以及缓

冲区大小)自动设置  ,只需要输入如下的就可以了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq  激活高质量设置 -itsoffset offset  设置以秒为基准的时间偏移,该选项影响所有后面的

输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了  offset 秒

。 [-]hh:mm:ss[.xxx]的格式也支持
2.2.2  视频选项 -b bitrate  设置比特率,缺省 200kb/s
-r fps  设置帧频  缺省 25
-s size  设置帧大小  格式为 WXH  缺省 160X128.下面的简写也可以直接使用:Sqcif   

128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect  设置横纵比  4:3 16:9  或  1.3333 1.7777
-croptop size  设置顶部切除带大小  像素单位
-cropbottom size –cropleft size –cropright size  底部,左边,右边切除带大小。
-padtop size  设置顶部补齐的大小  像素单位
-padbottom size–padleft size –padright size –padcolor color  设置补齐条大小和颜色

(hex,6 个 16 进制的数,红:绿:兰排列,比如  000000 代表黑色)
-vn  不做视频记录
-bt tolerance  设置视频码率容忍度 kbit/s
-maxrate bitrate 设置最大视频码率容忍度
-minrate bitreate  设置最小视频码率容忍度
-bufsize size  设置码率控制缓冲区大小
-vcodec codec  强制使用 codec 编解码方式。  如果用 copy 表示原始编解码数据必须被拷贝


-sameq  使用同样视频质量作为源(VBR)
-pass n  选择处理遍数(1 或者 2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精

确的请求的码率
-passlogfile file  选择两遍的纪录文件名为 file
2.2.3  高级视频选项
-g gop_size  设置图像组大小
-intra  仅适用帧内编码
-qscale q  使用固定的视频量化标度(VBR)
-qmin q    最小视频量化标度(VBR)
-qmax q  最大视频量化标度(VBR)
-qdiff q  量化标度间最大偏差  (VBR)
-qblur blur  视频量化标度柔化(VBR)
-qcomp compression  视频量化标度压缩(VBR)
-rc_init_cplx complexity  一遍编码的初始复杂度  
-qdiff q  -b_qfactor factor  在 p 和 b 帧间的 qp 因子
-i_qfactor factor  在 p 和 i 帧间的 qp 因子
-b_qoffset offset  在 p 和 b 帧间的 qp 偏差
-i_qoffset offset  在 p 和 i 帧间的 qp 偏差
-rc_eq equation  设置码率控制方程  默认 tex^qComp
-rc_override override  特定间隔下的速率控制重载
-me method  设置运动估计的方法  可用方法有  zero phods log x1 epzs(缺省) full
-dct_algo algo 设置 dct 的算法  可用的有  0 FF_DCT_AUTO 缺省的 DCT 1 FF_DCT_FASTINT 2

FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 设置 idct 算法。可用的有  0 FF_IDCT_AUTO 缺省的 IDCT 1 FF_IDCT_INT 2

FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB

7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 设置错误残留为 n 1 FF_ER_CAREFULL 缺省  2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4

FF_ER_VERY_AGGRESSIVE
-ec bit_mask 设置错误掩蔽为 bit_mask , 该值为如下值的位掩码  1 FF_EC_GUESS_MVS

(default=enabled) 2 FF_EC_DEBLOCK (default=enabled)   
-bf frames  使用 frames B  帧,支持 mpeg1,mpeg2,mpeg4
-mbd mode 宏块决策  0 FF_MB_DECISION_SIMPLE 使用 mb_cmp 1 FF_MB_DECISION_BITS 2

FF_MB_DECISION_RD
-4mv  使用 4 个运动矢量  仅用于 mpeg4
-part  使用数据划分  仅用于 mpeg4
-bug param  绕过没有被自动监测到编码器的问题
-strict strictness  跟标准的严格性
-aic  使能高级帧内编码  h263+
-umv  使能无限运动矢量  h263+
-deinterlace  不采用交织方法
-interlace  强迫交织法编码  仅对 mpeg2 和 mpeg4 有效。当你的输入是交织的并且你想要保

持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
-psnr  计算压缩帧的 psnr
-vstats  输出视频编码统计到 vstats_hhmmss.log
-vhook module  插入视频处理模块  module  包括了模块名和参数,用空格分开
2.2.4  音频选项
-ab bitrate  设置音频码率
-ar freq  设置音频采样率
-ac channels  设置通道  缺省为 1
-an  不使能音频纪录
-acodec codec  使用 codec 编解码  
2.2.5  音频/视频捕获选项
-vd device  设置视频捕获设备。比如/dev/video0
-vc channel  设置视频捕获通道  DV1394 专用
-tvstd standard  设置电视标准  NTSC PAL(SECAM)
-dv1394  设置 DV1394 捕获
-av device  设置音频设备  比如/dev/dsp
2.2.6  高级选项
-map file:stream  设置输入流映射
-debug  打印特定调试信息
-benchmark  为基准测试加入时间
-hex  倾倒每一个输入包
-bitexact  仅使用位精确算法  用于编解码测试
-ps size  设置包大小,以 bits 为单位
-re  以本地帧频读数据,主要用于模拟捕获设备
-loop  循环输入流。只工作于图像流,用于 ffserver 测试
2.2.7 FFmpeg 参数实例
./ffmpeg -y -i /rootVideoConverter/123.avi  -ab 56 -ar 22050 -b 1500 -r 15 -qscale 10

–s 480x350  /root/VideoConverter/234.flv ※※※※※※※※※※※※※※※※※※※※※

※※※※※※※※※※※※※※※
-y  (覆盖输出文件,即如果 1.***文件已经存在的话,不经提示就覆盖掉了)
-i    "1.avi"(输入文件是和 ffmpeg 在同一目录下的 1.avi 文件,可以自己加路径,改名字


-s  (输出的分辨率,注意片源一定要是 16:9 的不然会变形)
-r  (帧数,一般就用这个吧)
-b    1500(视频数据流量,用-b xxxx 的指令则使用固定码率,数字随便改,1500 以上没效果

;还可以用动态码率如:-qscale 4 和-qscale 6,4 的质量比 6 高)
-acodec    aac(音频编码用 AAC)
-ac    2  (声道数 1 或 2)
-ar    24000(声音的采样频率,好像 PSP 只能支持 24000Hz)
-ab    128  (  音频数据流量,一般选择 32、64、96、128)
-vol    200(200%的音量,自己改)
-f    psp  (输出 psp 专用格式)
-muxvb    768(给 PSP 机器识别的码率,一般选择 384、512 和 768)
-ab bitrate  设置音频码率 -ar freq    设置音频采样率
-ss  指定时间点开始转换任务,(time_off set the start time offset),-ss 后跟的时间单位

为秒  .
-s    320x240  指定分辨率  
-r 29.97  桢速率   
-bitexact  使用标准比特率  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表