记录一下纯命令操作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、0 | 9减少音量,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,如果视频不存在则自动选着2 | ffplay -showmode 1 xxx.mp4 |
-stats | 打印多个回放统计信息,包括显示流持续时间,编解码器参数,流中的当前位置,以及音频/视频同步差值。默认情况下处于启用状态,要显示禁用它则需要指定 -nostats | ffplay -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:v | ffplay -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.mp4ffmpeg -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.tsffmpeg -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= 44100Last 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时支持,系统也需要有相关的字体库才可以。
参数 | 类型 | 说明 |
---|---|---|
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滤镜将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果。
参数 | 类型 | 说明 |
---|---|---|
x | 字符串 | X坐标 |
y | 字符串 | Y坐标 |
eof_action | 整数 | 遇到eof表示时的处理方式,默认为重复
|
shortest | 布尔 | 最短的视频播放结束时,全部视频终止播放(默认false) |
format | 整数 | 设置output的像素格式,默认为yuv420
|
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
完!