Bootstrap

Windows环境 ffmpeg 命令使用介绍

记录一下纯命令操作ffmpeg的用法!

目录

一、FFmpeg查询命令帮助文档

1.ffmpeg、ffplay、ffprobe的区别

2.ffmpeg命令查看帮助文档

3.ffplay命令查看帮助文档

4.ffprobe命令查看帮助文档

二、FFmpeg音视频处理流程

三、FFmpeg命令分类查询

1.命令参数

2.查看具体分类所支持的参数

四、ffplay操作

1.ffplay播放控制

2.ffplay命令参数

3.ffplay命令播放媒体文件

(1).基础命令

(2).入门命令

4.ffplay简单过滤器

五、FFmpeg命令参数

1.主要参数

2.音频参数

3.视频参数

六、提取音视频数据

1.保留编码格式

2.提取视频

3.提取音频

七、提取像素格式

1.提取YUV

2.提取RGB

3.RGB和YVU之间转换

4.提取PCM

八、修改封装格式

1.保持编码格式

2.改变编码格式

3.修改帧率

4.修改视频码率

5.修改音频码率

6.修改音视频码率

7.修改音频采样率

九、视频合并

1.提取素材视频(裁剪视频片段)

2.视频拼接

3.注意事项

十、图片和视频互转

1.截取一张图片

2.截取多张图片(一帧一张图)

3.图片转为视频

4.视频生成gif

5.gif转为视频

十一、FFmpeg 视频录制

1.基础录制(默认参数)

2.查看可选参数

3.指定参数录制音视频

十二、FFmpeg直播拉流

1.拉流播放

2.拉流保存

十三、FFmpeg过滤器 - 视频 | 图片 裁剪

十四、FFmpeg添加水印

1.添加文字水印

2.添加时间水印

十五、FFmpeg添加图片水印

十六、FFmpeg画中画

1.画中画

2.多宫格


一、FFmpeg查询命令帮助文档

1.ffmpeg、ffplay、ffprobe的区别

ffmpeg:Hyper fast Audio and Video encoder 超快音视频编码器(类似爱剪辑)

ffplay:Simple media player 简单媒体播放器

ffprobe:Simple multimedia streams analyzer 简单多媒体流分析器

2.ffmpeg命令查看帮助文档

基本信息:ffmpeg -h

高级信息:ffmpeg -h long

所有信息:fmpeg -h full

  • 当在命令行窗口打印所有信息时,查阅比较麻烦,可以通过重定向到一个文件中,然后打开这个文件查看即可, 这样就更加方便阅读了,例如:
  • ffmpeg -h full > ffmpeg_h_full.txt

可以通过字符处去查找:ffmpeg -h full |  findstr 264

3.ffplay命令查看帮助文档

所有信息:ffplay -h

4.ffprobe命令查看帮助文档

所有信息:ffprobe -h

二、FFmpeg音视频处理流程

ffmpeg -i t_1280x720.mp4 -acodec copy -vcodec libx264 -s t_680x480.flv

解析:使用 ffmpeg 工具将 t_1280x720.mp4视频转换成libx264格式的680x480分辨率的视频;

转换流程图如下:

三、FFmpeg命令分类查询

1.命令参数

命令参数内容命令参数内容
-version显示版本-bsfs显示可用比特流filter
-buildconf显示编译配置-protocols显示可用的协议
-formats

显示可用格式

(muxers+demuxers)

-filters显示可用的过滤器
-muxers显示可用的解复用器-pix_fmts显示可用的像素格式
-demuxers显示可用的复用器-layouts显示标准声道名称
-codecs显示可用编解码器
(decoders+encoders)
-sample_fmts显示可用的音频采样格式
-decoders显示可用解码器-colors显示可用的颜色名称
-encoders显示可用编码器

例:

ffmpeg -version
ffmpeg -formats | findstr h264
ffmpeg -pix_fmts | findstr yuv

2.查看具体分类所支持的参数

语法ffmpeg  -h  type=name

type就是上面表格命令参数没有加上s

例如:

ffmpeg -h muxer=flv

ffmpeg -h filter=atempo

ffmpeg -h encoder=libx264

如果不知道当前参数支不支持name,例如不知道encoder支不支持libx264,可以通过命令去查找:ffmpeg -encoders | findstr x264

如果有显示查找出来又libx264,那么说明就是支持的!

四、ffplay操作

1.ffplay播放控制

选项说明
q、ESC退出播放
f全屏切换
p、SPC暂停
m静音切换
9、09减少音量,0增加音量
a循环切换音频流
v循环切换视频流
t循环切换字幕流
c循环切换节目
w循环切换过滤器或显示模式
left / right向后 / 向前 拖动10秒
down / up向后 / 向前拖动1分钟
鼠标右键单击拖动与显示宽度对应百分比的文件进行播放
鼠标左键双击全屏切换

案例

# 播放视频
ffplay  xxx.mp4

然后根据上面的选项即可实现相应的操作!!!

2.ffplay命令参数

常用命令参数如下:

选项说明案例:命令
-x width强制显示宽度ffplay -x 800 -y 480 xxx.mp4
-y height强制显示高度ffplay -x 800 -y 480 xxx.mp4
-video_size size帧尺寸,设置显示帧存储(W * H格式),仅用于类似原始YUV等没有包含帧大小(W * H)的视频ffplay -pixel_format yuv420p -video_size 3220x240 xxx.yuv
-pixel_format format格式设置像素格式ffplay -pixel_format yuv420p -video_size 3220x240 xxx.yuv
-fs以全屏模式启动ffplay -fs xxx.mp4
-an禁用音频(不播放声音)ffplay -an xxx.mp4
-vn禁用视频(不播放视频)ffplay -vn xxx.mp4
-sn禁用字幕(不显示字幕)ffplay -sn xxx.mp4
-ar

                   设置音频采样率

ffplay -ar 48000 -ac 2 -f f32le xxx.pcm
-ac设置音频通道数ffplay -ar 48000 -ac 2 -f f32le xxx.pcm
-f设置音频格式ffplay -ar 48000 -ac 2 -f f32le xxx.pcm
-ss pos根据设置的秒进行定位播放,或者以时间的单位进行播放ffplay -ss 10 xxx.mp4 
或者
ffplay -ss 00:05:11 xxx.mp4
-t duration设置播放视频或者音频长度,时间单位如 -ss 选项ffplay -t 10 xxx.mp4
或者
ffplay -t 00:00:10 xxx.mp4
-bytes按字节进行播放定位拖动(0关闭,1开启,-1自动(默认)ffplay -bytes 1 xxx.flv
-nodisp关闭图像化显示窗口,视频将不再显示ffplay -nodisp xxx.mp4
-noborder无边框窗口ffplay -noborder xxx.mp4
-volume vol设置起始音量。因为范围[0 - 100]ffplay -volume 11 xxx.mp4
-f fmt强制使用设置的格式进行解析。比如:-f s16le
-window_tilte title设置窗口标题(默认为输入文件名)ffpaly -window_title "自定义名字" xxx.mp4
-loop number设置循环播放次数ffplay -t 5 -loop 2 xxx.mp4
-showmode mode设置显示模式,可用的模式值:0显示视频,1显示音频波形,2显示音频频谱。缺省为0,如果视频不存在则自动选着2ffplay -showmode 1 xxx.mp4
-stats打印多个回放统计信息,包括显示流持续时间,编解码器参数,流中的当前位置,以及音频/视频同步差值。默认情况下处于启用状态,要显示禁用它则需要指定 -nostatsffplay -nostats xxx.mp4
-sync type同步类型将主时钟设置为audio(type=audio),video(type=video)或external(type=ext);默认是audio为时钟。
-ast  audio_stream_specifier指定音频流索引,比如 -ast 3,播放流索引为3的音频流ffplay -ast 3 xxx.ts
-vst video_stream_specifier指定视频流索引,比如 -vst 4,播放流索引为4的视频流ffplay -vst 4 xxx.ts
-sst subtitle_stream_specifier指定字符流索引,比如-sst 5,播放流索引为5的字幕流ffplay -sst 5 xxx.ts
-autoexit视频播放完毕后退出ffplay -autoexit xxx.mp4
-exitonkeydown键盘按下任何键退出播放ffplay -exitonkeydown xxx.mp4
-exitonmousedown鼠标按下任何键退出播放ffplay -exitonmousedown xxx.mp4
-codec:media_specifier codec_name强制使用设置的多媒体解码器,media_specifier可使用为a(音频),v(视频),和s(字幕)。-codec:v等同于-vcodec,其他类同。ffplay -codec:v h264 xxx.flv
-acodec codec_name强制使用设置的音频解码器进行音频解码;可写为 -codec:a
-vcodec code_name强制使用设置的视频解码器进行视频解码;可写为 -codec:vffplay -vcodec h264 xxx.flv
-scodec code_name强制使用设置的字幕解码器进行字幕解码;可写为 -codec:s
-autorotate根据文件元素据自动旋转视频。值为0或1,默认值1
-framedrop如果视频不同步则丢弃视频帧。当主时钟非视频时钟时默认开启。若需禁用则使用 -noframedrop
-infbuf不限制输入缓冲区大小。尽可能快的从输入中读取尽可能多的数据。播放实时流时默认启用,如果未及时读取数据,则可能回丢弃数据。此选项将不再限制缓冲区的大小。若需要禁用则使用 -noiinfbuf

3.ffplay命令播放媒体文件

以下是一下案例,可以结合上面的命令参数进行理解。

(1).基础命令

①.播放本地文件

ffplay -window_title "窗口标题" -ss 3 -t 15 -autoexit xxx.mp4
ffplay xxx.mp3

②.播放网络流

ffplay -window_title "rtmp stream" rtmp://xxx/xxx/xxx

③.强制解码器

# mpeg4解码器
ffplay -vcodec mpeg4 xxx.mp4
# h264解码器
ffplay -vcodec h264 xxx.mp4

④.禁用音频或视频

# 播放视频时 禁用音频
ffplay xxx.mp4 -an
# 播放视频时 禁用视频
ffplay xxx.mp4 -vn

(2).入门命令

①.播放YUV数据

(播放yuv数据时,需要指定视频的格式像素大小;-pixel_format  -video_size

ffplay -pixel_format yuv420p -video_size 960x544 -framerate 30 xxx.yuv

②.播放RGB数据

-f rawvideo   告诉ffplay这个rgb文件是原始数据,是没有压缩过的文件数据。

ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -i xxx.rgb
ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -framerate 10 -i xxx.rgb

③.播放PCM数据

ffplay -ar 48000 -ac 2 -f f32le xxx.pcm

4.ffplay简单过滤器

(1).视频旋转

ffplay -i xxx.mp4 -vf transpose=1 # 参数0 - 4

(2).视频反转

ffplay xxx.mp4 -vf hflip    # 水平

ffplay xxx.mp4 -vf vflip    # 垂直

(3).视频旋转和翻转

ffplay xxx.mp4 -vf hflip, transpose=1

(4).音频变速播放

ffplay -i xxx.mp4 -af atempo=2

(5).视频变速播放

ffplay -i xxx.mp4 -vf setpts=PTS/2

(6).音视频同时变速

ffplay -i xxx.mp4 -vf setpts=PTS/2 -af atempo=2

更多过滤器参考:FFmpeg Filters Documentation

五、FFmpeg命令参数

1.主要参数

选项说明
-i设置输入流
-f设定输出格式(format)
-ss开始时间
-t时间长度

例,从一个视频中,在10s位置开始截取,截取12s,输出格式为flv格式,输出名字为out.mp4

ffmpeg -i xxx.mp4 -ss 10 -t 12 -f flv out.mp4

使用MediaInfo软件打开输出的视频,可以看到,确实是FLV格式,且是12s.

2.音频参数

选项说明
-aframes设置要输出的音频帧数
-b:a音频码率
-ar设定采样率
-ac设定声音的Channel数
-acodec设定声音编码器,如果为copy,表示原始编解码数据必须被拷贝(-acodec copy)
-an不处理音频
-af音频过滤器

例,在一个视频中提取音频,输出400帧音频,音频编码率为192k,采样率为48k,通道数为2,音频编码为libmp3lame,输出名字为out.mp3

ffmpeg -i out.mp4 -aframes 400 -b:a 192k -ar 48000 -ac 2 -acodec libmp3lame out.mp3

3.视频参数

选项说明
-vframes设置要输出的视频帧数
-b设置视频编码率
-b:v视频码率
-r设定帧速率
-s设定画面的宽与高
-vn不处理视频
-aspect  aspect设置横纵比 4:3 16:9 或 1.3333:1.7777
-vcodec设定视频编解码器,如果用copy,表示原始编码解码数据必须被拷贝(-vcodec  copy)
-vf视频过滤器

例,从一个mp4视频中,输出视频400帧数,视频编码为300k,帧速率为60,画面大小为640x480,纵横比为16:9,视频编码为libx265,输出名字为out.h265

ffmpeg -i xxx.mp4 -vframes 400 -b:v 300k -r 60 -s 640x480 -aspect 16:9 -acodec copy -vcodec libx265 out.h265

六、提取音视频数据

1.保留编码格式

(从输入的视频中提取)

(1).提取音频

说明:-acodec copy:拷贝音频,即保留音频原有编码格式;-vn:禁用视频,即不处理视频,不拷贝视频;

ffmpeg -i xxx.mp4 -acodec copy -vn audio.mp4
#ffmpeg -i xxx.mp4 -codec:a copy -vn audio.mp4

只剩下一个音频流,但他还是mp4格式的。 

(2).提取视频

说明:-vcodec copy:拷贝视频,即保留视频原有编码格式;-an:禁用音频,即不处理音频,不拷贝音频;

ffmpeg -i xxx.mp4 -vcodec copy -an video.mp4
#ffmpeg -i xxx.mp4 -codec:v copy -an video.mp4

只剩下一个视频流 ,但他还是mp4格式的。 

2.提取视频

(从输入的视频中提取)

(1).保留编码格式

说明:-vcodec copy:拷贝视频,即保留视频原有编码格式;-an:禁用音频,即不处理音频,不拷贝音频;

ffmpeg -i xxx.mp4 -vcodec copy -an test1.h264
# 纯h264视频数据,没有封装格式

(2).指定格式

说明:-vcodec libx264:指定视频编码格式为libx264;-an:禁用音频,即不处理音频,不拷贝音频;

ffmpeg -i xxx.mp4 -vcodec libx264 -an test2.h264

3.提取音频

(从输入的视频中提取)

(1)保留编码格式

说明:-acodec copy:拷贝音频,即保留音频原有编码格式;-vn:禁用视频,即不处理视频,不拷贝视频;

ffmpeg -i xxx.mp4 -acodec copy -vn test.aac

(2).指定格式

说明:-vcodec libmp3lame:指定视频编码格式为libmp3lame;-vn:禁用视频,即不处理视频,不拷贝视频;

ffmpeg -i xxx.mp4 -acodec libmp3lame -vn test.mp3

七、提取像素格式

(播放可以参考上面第四章节的 (2).入门命令)

1.提取YUV

(1).提取10秒数据,分辨率和原视频一致

ffmpeg -i xxx.mp4 -t 10 -pix_fmt yuv420p yuv420p_orig.yuv

(2).提取10秒数据,分辨率转为320x240

ffmpeg -i xxx.mp4 -t 10 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv

播放yuv视频可以使用yuv播放器,可以通过下面链接进行下载。(注意播放时,需要设置大小与视频一直,否则是显示乱码的)

https://yuv-player-deluxe.software.informer.com/

https://download.csdn.net/download/cpp_learner/89861682

也可以使用命令播放,参考上面ffplay播放介绍。

2.提取RGB

(1).提取10秒数据,分辨率转为320x240

ffmpeg -i xxx.mp4 -t 10 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb

3.RGB和YVU之间转换

(1).将一个分辨率为320x240的yuv格式的视频,转换为分辨率大小为1280x720的rgb格式视频

# yuv转rgb
ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24 -s 1280x720 rgb24_1280x720p.rgb

(2).将一个分辨率为960x544的rgb格式的视频,转换为分辨率相同的yuv格式视频

注意,如果是原始数据,即没有压缩过的数据,是需要加上 -f rawvideo 参数的,否则会报错。

# rgb转yuv
ffmpeg -f rawvideo -s 960x544 -pix_fmt rgb24 -i rgb24_960x544.rgb -pix_fmt yuv420p  yuv420p_960x544.yuv

4.提取PCM

(1). mp3文件提取pcm数据

wav数据只是比pcm数据多了个文件头,其余数据一样。所以播放wav文件时,可以直接ffplay播放,不需要指定编码,采样率,通道数等参数。 

ffmpeg -i xxx.mp3 -ar 48000 -ac 2 -f s16le 48000_s16le.pcm
ffmpeg -i xxx.mp3 -ar 48k -ac 2 -sample_fmt s16 s16.wav
ffmpeg -i xxx.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le sl6le.wav
ffmpeg -i xxx.mp3 -ar 48k -ac 2 -f  f32le 48000_f32le.pcm
# -f s16le 与 -sample_fmt s16 格式一致
# 48000 等于 48k

(2).mp4文件提取pcm数据

ffmpeg -i xxx.mp4 -t 10 -vn -ar 48000 -ac 2 -f f32le 48000_f32le.pcm

(3).查找命令

ffmpeg -muxers | findstr s16
ffmpeg -sample_fmts
ffmpeg -encoders | findstr pcm

八、修改封装格式

1.保持编码格式

将mp4文件转换为ts文件,保持原来编码格式

ffmpeg -i xxx.mp4 -vcodec copy -acodec copy test.ts
ffmpeg -i xxx.mp4 -codec copy test.ts
# codec 等于 vcodec 和 acodec

2.改变编码格式

将mp3文件转换为mkv文件,视频编码转为libx265,音频编码转为libmp3lame

ffmpeg -i xxx.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv

3.修改帧率

ffmpeg -i xxx.mp4 -r 10 xxx.mp4		# 注意,不能加 codec copy 否之转换无效

4.修改视频码率

ffmpeg -i xxx.mp4 -b:v 100k xxx.mkv	# -b 等效于 -b:v 

注意,转换后的.mkv文件,音频格式也是会被转换的,因为封装格式不一样了,就是用了mkv默认的音频格式,如果不希望音频格式被修改,则需要加上 -acodec copy 参数即可。

5.修改音频码率

ffmpeg -i xxx.mp4 -b:a 192k xxx.mp4

注意,如果不加上 -vcodec copy 参数,视频码率也会随之被修改(重新编码)!

6.修改音视频码率

ffmpeg -i xxx.mp4 -b:v 400k -b:a 192k xxx.mp4

7.修改音频采样率

ffmpeg -i xxx.mp4 -ar 44100 xxx.mp4

九、视频合并

提醒,合并的视频需要格式都一致!!!

且推荐将视频转为 ts 格式进行合并!!!

1.提取素材视频(裁剪视频片段)

我这里是在同一个视频中进行裁剪,所以格式都是一样的,不需要考虑格式问题

ffmpeg -i xxx.mp4 -ss 00:00:02 -t 5 -codec copy 1.mp4
ffmpeg -i xxx.mp4 -ss 00:01:02 -t 5 -codec copy 2.mp4
ffmpeg -i xxx.mp4 -ss 00:02:02 -t 5 -codec copy 3.mp4

ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts

ffmpeg -i 1.mp4 -codec copy 1.flv
ffmpeg -i 2.mp4 -codec copy 2.flv
ffmpeg -i 3.mp4 -codec copy 3.flv

如果格式不一致,建议加上参数 -vcodec libx264 -acodec aac 将格式转为一致。(这里针对的是MP4,如果是其他格式需要转相应的格式)

ffmpeg -i xxx.mp4 -ss 00:02:02 -t 5 -vcodec libx264 -acodec aac x.mp4

另外,新建3个txt文件,写下 file '文件名.格式' 字样用于视频合并,如下图:

2.视频拼接

(1).以mp4格式拼接

ffmpeg -f concat -i mp4list.txt -codec copy out_mp4.mp4

(2).以ts格式拼接

ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.ts    # 方式一
ffmpeg -f concat -i tslist.txt -codec copy out_ts.ts       # 方式二

推荐使用方式二进行拼接。

(3).以flv格式拼接

ffmpeg -f concat -i flvlist.txt -codec copy out_flv.flv

推荐将视频都转为ts格式后在进行拼接,且都推荐使用方式二进行拼接!

3.注意事项

(1).统一封装格式,把每个视频的封装封装格式统一为 ts ,然后拼接输出的格式可以指定需要的格式,例如 .mp4或者flv等。

(2).分辨率可以不同,但是编码格式需要统一;

(3).音频编码格式需要统一,音频参数(采样率、声道等)也需要统一。

十、图片和视频互转

1.截取一张图片

ffmpeg -i xxx.mp4 -y -f image2 -ss 00:01:15 -vframes 1 -s 1280x720 test.jpg
ffmpeg -i xxx.mp4 -y -f image2 -ss 00:03:04 -vframes 1 -s 640x360 test.bmp

参数说明:

-f                 设置格式

iamge2        一种图片格式

-vframes         帧数,如果设置的值是大于1,那么输出图片的时候,名字需要加上 %2d ,这是C语言的格式,表示两位数字。例如,frame%3d.jpg,输出值范围是 frame001.jpg - frame300.jpg。注意,这样写并不是输出300张照片,多少张照片是依据输出秒数和帧数而定。

-ss                起始时间

-s                  图片大小

2.截取多张图片(一帧一张图)

ffmpeg -i xxx.mp4 -t 10 -ss 00:00:05 -s 1280x720 -r 20 frame%003d.jpg

会截取200张图片,名字为 frame001.jpg - frame200.jpg

3.图片转为视频

ffmpeg -f image2 -i frame%003d.jpg -r 25 video.mp4

也是需要使用C语言格式指定输入多张图片

4.视频生成gif

ffmpeg -i xxx.mp4 -t 10 -r 30 -ss 00:00:10 -s 1280x720 image.gif

可以使用 -t 指定时间长度,-ss 指定起始位置, -r 帧数,-s 画面大小

转后缩减内存大小:

ffmpeg -i xxx.mp4 -vf "fps=8,scale=640:-1:flags=lanczos" -f gif -t 9 output.gif
  • -vf 表示视频过滤器。

  • fps=8 表示将帧率降低到每秒8帧。

  • scale=640:-1:flags=lanczos 表示将输出的分辨率宽度缩小到640像素,高度自动调整以保持宽高比,使用Lanczos插值算法来平滑缩放。

  • -t 表示设置时长

5.gif转为视频

ffmpeg -f gif -i image.gif vimage.mp4

主要需要加上 -f gif 参数

十一、FFmpeg 视频录制

需要安装软件:Screen Capturer Recorder

下载链接:Screen Capturer Recorder

下载后直接安装即可!

Screen Capturer Recorder是一款功能强大的屏幕录像录音工具,它可以对桌面进行录制,对声音进行录制,对于学习还是很有帮助的。

使用命令查看电脑录屏设备

ffmpeg -list_devices true -f dshow -i dummy

USB2.0 HD UVC WebCam          这个是我笔记本的摄像头,用于录制视像头的画面的

screen-capture-recorder               刚才安装的屏幕捕获器,用于录制屏幕画面的

楹﹀厠椋?(Realtek High Definition Audio)        这个是录制麦克风声音的,乱码是“麦克风”,问号是“空格”,单纯使用这个录制的声音是没有系统声音的【麦克风 (Realtek High Definition Audio)

virtual-audio-capturer                        录制系统声音,单纯使用这个录制声音是没有麦克风录制的声音的

1.基础录制(默认参数)

(1).录制视频

①录制桌面

ffmpeg -f dshow -i video="screen-capture-recorder" -y out.flv

②录制摄像头(注意替换自己摄像头名字)

ffmpeg -f dshow -i video="USB2.0 HD UVC WebCam" out2.flv

(2).录制声音

①录制系统声音 (注意替换自己设备的名字)

ffmpeg -f dshow -i audio="virtual-audio-capturer" -y out.aac

②录制麦克风声音 (注意替换自己设备的名字)

ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -y out.aac

③录制系统声音和麦克风声音(注意替换自己设备的名字)

ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)"  -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -y out.aac

-filter_complex amix=inputs=2:duration=first:dropout_transition=2 :使用复杂滤镜 amix 将两个音频输入混合。

(3).同时录制声音和视频

ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="麦克风 (Realtek High Definition Audio)"  -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -y  out.flv

如果不需要系统声音或者麦克风声音,删除相应的输入即可,例如。

ffmpeg -f dshow -i video="screen-capture-recorder"  -f dshow -i audio="virtual-audio-capturer" -y  out.flv

2.查看可选参数

(1).查看视频录制设备的可选参数

ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"

(2).查看音频设备的可选参数

# 系统声音
ffmpeg -f dshow -list_options true -i audio="virtual-audio-capturer"
# 执行后效果如下
[dshow @ 0000013214798680] DirectShow audio only device options (from audio devices)
[dshow @ 0000013214798680]  Pin "Capture Virtual Audio Pin" (alternative pin name "1")
[dshow @ 0000013214798680]   min ch=2 bits=16 rate= 48000 max ch=2 bits=16 rate= 48000


# 麦克风 (注意替换自己的设备名)
ffmpeg -f dshow -list_options true -i audio="麦克风 (Realtek High Definition Audio)"
# 执行后效果如下
[dshow @ 000002566c9386c0] DirectShow audio only device options (from audio devices)
[dshow @ 000002566c9386c0]  Pin "Capture" (alternative pin name "Capture")
[dshow @ 000002566c9386c0]   min ch=1 bits=8 rate= 11025 max ch=2 bits=16 rate= 44100
    Last message repeated 22 times

3.指定参数录制音视频

ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -video_size 1920x1080 -framerate 30 -pixel_format yuv420p -i video="screen-capture-recorder" -vcodec libx264 -b:v 6M -r 30 -b:a 192k -ar 48k -ac 2 -acodec libmp3lame -y out.flv

-video_size  1920x1080               设置视频尺寸大小

-framerate  30                              设置视频输入帧率

-pixel_format  yuv420p                 设置视频像素格式

-vcodec  libx264                           设置视频编码格式

-b:v  6M                                        设置视频码率

-r  30                                             设置视频输出帧率(1秒30帧)

-b:a  192k                                     设置音频码率

-ar  48k                                         设置音频采样率

-ac  2                                            设置音频通道数

-acodec  libmp3lame                    设置音频编码格式

十二、FFmpeg直播拉流

一般都是 rtmp 和 http 等

1.拉流播放

ffplay  拉流地址

ffplay  rtmp://xxx

ffplay  http://xxx

没有拉流地址测试的朋友,可以在浏览器下载 《猫抓》插件,通过插件去快手直播间进行抓取拉流地址用于测试。

拉流地址获取教程,教你获取直播间的拉流地址._哔哩哔哩_bilibili

可以使用 -x -y 参数设置大小

2.拉流保存

ffmpeg -i 拉流地址

ffplay  rtmp://xxx  -codec copy  xxx.flv
ffplay  http://xxx  xxx.flv

注意,如果不是rtmp的拉流地址,需要慎用 -codec copy 参数

http是ts流,使用ts后缀保存视频,可以使用 -codec copy 参数,例如

ffplay  http://xxx -codec copy  xxx.ts
ffplay  http://xxx -acodec acc -vcodec libx264 xxx.flv

十三、FFmpeg过滤器 - 视频 | 图片 裁剪

这里说的裁剪,即裁剪画面中某一小块区域。

裁剪语法:

crop=裁剪的宽度:裁剪的高度:起始X位置:起始Y位置:裁剪比率

(裁剪比率是可选项)

ffmpeg -i xxx.mp4 -vf crop=裁剪的宽度:裁剪的高度:起始X位置:起始Y位置 out.mp4

可用变量:

iw         源视频的输入宽度

ih         源视频的输入高度

ow        输出视频的宽度,注意,只能在x和y的位置上使用

oh        输出视频的高度,注意,只能在x和y的位置上使用

案例一,在x为10,y为20的起点位置,裁剪一个宽为640,高位480大小的视频

ffmpeg -i xxx.mp4 -vf crop=640:480:10:20 out.mp4

案例二,裁剪300x300大小视频,视频位于原视频中间位置

ffmpeg -i xxx.mp4 -vf crop=300:300:(iw-300)/2:(ih-300)/2 -t 10 -y out.mp4

小技巧,如果只是想要查看效果,可以使用ffplay裁剪后显示出来,并不会保存于本地

ffplay -i xxx.mp4 -vf crop=300:300:(iw-300)/2:(ih-300)/2

# 只能在x和y的位置上使用ow和oh变量
ffplay -i xxx.mp4 -vf crop=300:300:ow:oh

另外,图片也是一样的裁剪方式

十四、FFmpeg添加水印

内置变量介绍

变量说明
t以秒表示的时间戳,如果输入的时间是位置的则是NAN
n输入帧的顺序编号,从0开始
pos输入帧的位置,如果是位置的则是NAN
w输入视频帧的宽度
h输入视频真的高度

1.添加文字水印

(1).文字滤镜参数

在ffmpeg中添加文字水印,可以使用ffmpeg自带的 drawtext 滤镜进行添加,需要系统支持FreeType、FontConfig、iconv等字体,这些都是需要在编译ffmpeg时支持,系统也需要有相关的字体库才可以。

ffmpeg文字滤镜参数
参数类型说明
text字符串文字
textfile字符串文件,读取文件中的文字用于水印
box布尔值文字区域背景框(缺省false)
boxcolor色彩展示字体区域块的颜色
font字符串字体名称(默认为Sans字体)
fontsize整数显示字体的大小
x字符串缺省为0
y字符串缺省为0
alpha浮点数透明度(默认为1),取值范围0~1

(2).将文字添加到视频左上角        fontfile=FreeSerif.ttrf  意思是设置字体文件

ffmpeg -i xxx.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='HelloWorld':fontcolor=red:x=20:y=100" -t 10 -vcodec libx264 -acodec aac -y out.mp4

扩展:ttf是字体文件,可以替换为一个可以支持显示中文的字体文件,就可以显示中文水印了,具体可以上网多了解一下。

(3).修稿透明度        alpha=0.3

ffmpeg -i xxx.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='HelloWorld':fontcolor=red:x=20:y=100:alpha=0.3" -t 15 -y out.mp4

(4).给水印添加一个背景框                box=1:boxcolor=yellow

ffmpeg -i xxx.mp4 -vf "drawtext=fontsize=50:fontfile=FreeSerif.ttf:text='shuiyin':fontcolor=blue:x=100:y=100:alpha=0.4:box=1:boxcolor=yellow" -t 10 -y out.mp4

2.添加时间水印

(1).添加时间水印,本地时间

ffmpeg -re -i xxx.mp4 -vf "drawtext=fontsize=50:fontcolor=red:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow:x=100:y=100:alpha=0.8" -t 10 -y out.mp4

注意,一定要加上 -re 参数,否则时间戳对不上... 

(2).定时显示水印

每两秒钟显示依次水印。可以使用 drawtext 于 enable 结合处理实现。

enable=1时显示水印,enable=0时隐藏水印。

lt(x, y):函数,如果x小于y,返回1,否则返回0。

mod(x, y):函数,x对y取余数。

ffmpeg -i xxx.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='time...':fontcolor=green:x=20:y=50:box=1:boxcolor=yellow:enable=lt(mod(t\, 2)\, 1)" -t 10 -y out.mp4

也可以与时间结合。

(3).跑马灯水印

主要是使用函数对x和y的实时赋值。更多函数可以查看官方文档。

http://www.ffmpeg.org/ffmpeg-utils.html 3 Expression Evaluation

ffmpeg -i xxx.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='cpp_learners':x=mod(100*t\, w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white" -t 9 -y out.mp4

也可以与 enable 参数结合,定时显示消失水印。

ffmpeg -i xxx.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='cpp_learners':x=50*mod(t\, 10):y=t*10:alpha=0.5:fontcolor=white:enable=lt(mod(t\, 2)\, 1)" -t 30 -acodec copy -y out.mp4

十五、FFmpeg添加图片水印

使用movie滤镜添加图片,使用overlay滤镜设置显示坐标。

参数

类型

说明

filename

字符串

输入的文件名,可以是文件,协议,设备

format_name,  f

字符串

输入的封装格式

stream_index, si

整数

输入的流索引编号

seek_point, sp

浮点数

Seek输入流的时间位置

streams, s

字符串

输入的多个流的流信息

loop

整数

循环次数

discontinuity

时间差值

支持跳动的时间戳差值

格式:

ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" output.mp4

[watermark];[in][watermark]     [out]   这一坨固定写就好;

其中,watermark代表图片,in代表输入的视频,out代表输出;

watermark名字可以随便取,但是两个地方的名字必须一样,否则overlay无法识别;

可以使用 x=0:y=10 ,x和y可以省略 10:10

参数

说明

main_w

视频单帧图像宽度

main_h

视频单帧图像高度

overlay_w

水印图片的宽度

overlay_h

水印图片的高度

对应地可以将overlay参数设置成如下值来改变水印图片的位置:

水印图片位置

overlay

左上角

10:10

右上角  

main_w - overlay_w - 10:10

左下角  

10:main_h-overlay_h - 10

右下角

main_w-overlay_w - 10:main_h-overlay_h -1 0

案例:

1.在视频x坐标50、y坐标30的位置中添加图片水印

ffplay -i xxx.mp4 -vf "movie=15.png[logo];[in][logo]overlay=x=50:y=30[out]"

2.在视频左上右下添加图片水印测试代码

ffplay -i xxx.mp4 -vf "movie=15.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]"
ffplay -i xxx.mp4 -vf "movie=15.png[watermark];[in][watermark]overlay=10:main_h-overlay_h-10[out]"
ffplay -i xxx.mp4 -vf "movie=15.png[watermark];[in][watermark]overlay=main_w_overlay_w-10:main_h-overlay_h-10[out]"
ffplay -i xxx.mp4 -vf "movie=15.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out]"

3.跑马灯效果

ffplay -i xxx.mp4 -vf "movie=15.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"

十六、FFmpeg画中画

1.画中画

画中画,即在视频的画面中还有另一个视频在播放!

在FFmpeg中,可以通过overlay滤镜将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果。

FFmpeg滤镜overlay基本参数

参数

类型

说明

x

字符串

X坐标

y

字符串

Y坐标

eof_action

整数

遇到eof表示时的处理方式,默认为重复

  • repeat(值为0):重复前一帧(画中视频播放完毕后一直停停留在哪里)
  • endcall(值为1):停止所有的流(画中视频播放完毕后所有视频停止播放)
  • pass(值为2):保留主图层(画中视频播放完毕后消失,只剩下主视频在播放)

shortest

布尔

最短的视频播放结束时,全部视频终止播放(默认false)

format

整数

设置output的像素格式,默认为yuv420

  • yuv420 (值为0)
  • yuv422 (值为1)
  • yuv444 (值为2)
  • rgb (值为3)
scale大小设置子画面(画中画)的视频大小  scale=480x270

画中画组成示意图

例:

普通例子

ffplay -i xxx.mp4 -vf "movie=out.mp4,scale=320x270[sub];[in][sub]overlay=x=30:y=30[out]"
ffplay -i xxx.mp4 -vf "movie=out.mp4,scale=320x270[sub];[in][sub]overlay=x=30:y=30:eof_action=1[out]"
ffplay -i xxx.mp4 -vf "movie=out.mp4,scale=320x270[sub];[in][sub]overlay=x=30:y=30:eof_action=0[out]"
ffplay -i xxx.mp4 -vf "movie=out.mp4,scale=320x270[sub];[in][sub]overlay=x=30:y=30:eof_action=2[out]"
ffplay -i xxx.mp4 -vf "movie=out.mp4,scale=320x270[sub];[in][sub]overlay=x=30:y=30:shortest=1[out]"

跑马灯

ffplay -i xxx.mp4 -vf "movie=out.mp4,scale=480x270[pmd];[in][pmd]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"

2.多宫格

即多个视频同时在一个画布中同时播放,使用overlay滤镜为关键画布,可以通过FFmpeg建立一个画布,也可以使用默认的画布。如果想以多宫格的方式展现,则可以自己建立一个足够大的画布。

案例,四宫格

ffmpeg -i out.mp4 -i out.mp4 -i  out.mp4 -i  out.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" out1.mp4

命令拆解说明:

ffmpeg -i out.mp4 -i out.mp4 -i out.mp4 -i out.mp4                # 输入四个视频
-filter_complex "nullsrc=size=640x480[base];                      # 创建一个640x480空的视频画布
[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" out1.mp4        # 将第四个视频添加到画布右下角

案例,三宫格

ffmpeg -i out.mp4 -i out.mp4 -i out.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];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:x=180:y=240;" out1.mp4

完!

;