记录一下纯命令操作ffmpeg的用法!
目录
[十一、FFmpeg 视频录制](#十一、FFmpeg 视频录制)
[十三、FFmpeg过滤器 - 视频 | 图片 裁剪](#十三、FFmpeg过滤器 - 视频 | 图片 裁剪)
一、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音视频处理流程
bash
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 | 显示可用编码器 |
例:
bash
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分钟 |
鼠标右键单击 | 拖动与显示宽度对应百分比的文件进行播放 |
鼠标左键双击 | 全屏切换 |
案例
bash
# 播放视频
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).基础命令
①.播放本地文件
bash
ffplay -window_title "窗口标题" -ss 3 -t 15 -autoexit xxx.mp4
ffplay xxx.mp3
②.播放网络流
bash
ffplay -window_title "rtmp stream" rtmp://xxx/xxx/xxx
③.强制解码器
bash
# mpeg4解码器
ffplay -vcodec mpeg4 xxx.mp4
# h264解码器
ffplay -vcodec h264 xxx.mp4
④.禁用音频或视频
bash
# 播放视频时 禁用音频
ffplay xxx.mp4 -an
# 播放视频时 禁用视频
ffplay xxx.mp4 -vn
(2).入门命令
①.播放YUV数据
(播放yuv数据时,需要指定视频的格式 和像素大小;-pixel_format -video_size)
bash
ffplay -pixel_format yuv420p -video_size 960x544 -framerate 30 xxx.yuv
②.播放RGB数据
-f rawvideo 告诉ffplay这个rgb文件是原始数据,是没有压缩过的文件数据。
bash
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数据
bash
ffplay -ar 48000 -ac 2 -f f32le xxx.pcm
4.ffplay简单过滤器
(1).视频旋转
bash
ffplay -i xxx.mp4 -vf transpose=1 # 参数0 - 4
(2).视频反转
bash
ffplay xxx.mp4 -vf hflip # 水平
ffplay xxx.mp4 -vf vflip # 垂直
(3).视频旋转和翻转
bash
ffplay xxx.mp4 -vf hflip, transpose=1
(4).音频变速播放
bash
ffplay -i xxx.mp4 -af atempo=2
(5).视频变速播放
bash
ffplay -i xxx.mp4 -vf setpts=PTS/2
(6).音视频同时变速
bash
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
bash
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
bash
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
bash
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:禁用视频,即不处理视频,不拷贝视频;
bash
ffmpeg -i xxx.mp4 -acodec copy -vn audio.mp4
#ffmpeg -i xxx.mp4 -codec:a copy -vn audio.mp4
只剩下一个音频流,但他还是mp4格式的。
(2).提取视频
说明: -vcodec copy:拷贝视频,即保留视频原有编码格式;-an:禁用音频,即不处理音频,不拷贝音频;
bash
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:禁用音频,即不处理音频,不拷贝音频;
bash
ffmpeg -i xxx.mp4 -vcodec copy -an test1.h264
# 纯h264视频数据,没有封装格式
(2).指定格式
说明: -vcodec libx264:指定视频编码格式为libx264;-an:禁用音频,即不处理音频,不拷贝音频;
bash
ffmpeg -i xxx.mp4 -vcodec libx264 -an test2.h264
3.提取音频
(从输入的视频中提取)
(1)保留编码格式
说明: -acodec copy:拷贝音频,即保留音频原有编码格式;-vn:禁用视频,即不处理视频,不拷贝视频;
bash
ffmpeg -i xxx.mp4 -acodec copy -vn test.aac
(2).指定格式
说明: -vcodec libmp3lame:指定视频编码格式为libmp3lame;-vn:禁用视频,即不处理视频,不拷贝视频;
bash
ffmpeg -i xxx.mp4 -acodec libmp3lame -vn test.mp3
七、提取像素格式
(播放可以参考上面第四章节的 (2).入门命令)
1.提取YUV
(1).提取10秒数据,分辨率和原视频一致
bash
ffmpeg -i xxx.mp4 -t 10 -pix_fmt yuv420p yuv420p_orig.yuv
(2).提取10秒数据,分辨率转为320x240
bash
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
bash
ffmpeg -i xxx.mp4 -t 10 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb
3.RGB和YVU之间转换
(1).将一个分辨率为320x240的yuv格式的视频,转换为分辨率大小为1280x720的rgb格式视频
bash
# 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 参数的,否则会报错。
bash
# 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播放,不需要指定编码,采样率,通道数等参数。
bash
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数据
bash
ffmpeg -i xxx.mp4 -t 10 -vn -ar 48000 -ac 2 -f f32le 48000_f32le.pcm
(3).查找命令
bash
ffmpeg -muxers | findstr s16
ffmpeg -sample_fmts
ffmpeg -encoders | findstr pcm
八、修改封装格式
1.保持编码格式
将mp4文件转换为ts文件,保持原来编码格式
bash
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
bash
ffmpeg -i xxx.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
3.修改帧率
bash
ffmpeg -i xxx.mp4 -r 10 xxx.mp4 # 注意,不能加 codec copy 否之转换无效
4.修改视频码率
bash
ffmpeg -i xxx.mp4 -b:v 100k xxx.mkv # -b 等效于 -b:v
注意,转换后的.mkv文件,音频格式也是会被转换的,因为封装格式不一样了,就是用了mkv默认的音频格式,如果不希望音频格式被修改,则需要加上 -acodec copy 参数即可。
5.修改音频码率
bash
ffmpeg -i xxx.mp4 -b:a 192k xxx.mp4
注意,如果不加上 -vcodec copy 参数,视频码率也会随之被修改(重新编码)!
6.修改音视频码率
bash
ffmpeg -i xxx.mp4 -b:v 400k -b:a 192k xxx.mp4
7.修改音频采样率
bash
ffmpeg -i xxx.mp4 -ar 44100 xxx.mp4
九、视频合并
提醒,合并的视频需要格式都一致!!!
且推荐将视频转为 ts 格式进行合并!!!
1.提取素材视频(裁剪视频片段)
我这里是在同一个视频中进行裁剪,所以格式都是一样的,不需要考虑格式问题
bash
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,如果是其他格式需要转相应的格式)
bash
ffmpeg -i xxx.mp4 -ss 00:02:02 -t 5 -vcodec libx264 -acodec aac x.mp4
另外,新建3个txt文件,写下 file '文件名.格式' 字样用于视频合并,如下图:
2.视频拼接
(1).以mp4格式拼接
bash
ffmpeg -f concat -i mp4list.txt -codec copy out_mp4.mp4
(2).以ts格式拼接
bash
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格式拼接
bash
ffmpeg -f concat -i flvlist.txt -codec copy out_flv.flv
推荐将视频都转为ts格式后在进行拼接,且都推荐使用方式二进行拼接!
3.注意事项
(1).统一封装格式,把每个视频的封装封装格式统一为 ts ,然后拼接输出的格式可以指定需要的格式,例如 .mp4或者flv等。
(2).分辨率可以不同,但是编码格式需要统一;
(3).音频编码格式需要统一,音频参数(采样率、声道等)也需要统一。
十、图片和视频互转
1.截取一张图片
bash
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.截取多张图片(一帧一张图)
bash
ffmpeg -i xxx.mp4 -t 10 -ss 00:00:05 -s 1280x720 -r 20 frame%003d.jpg
会截取200张图片,名字为 frame001.jpg - frame200.jpg
3.图片转为视频
bash
ffmpeg -f image2 -i frame%003d.jpg -r 25 video.mp4
也是需要使用C语言格式指定输入多张图片
4.视频生成gif
bash
ffmpeg -i xxx.mp4 -t 10 -r 30 -ss 00:00:10 -s 1280x720 image.gif
可以使用 -t 指定时间长度,-ss 指定起始位置, -r 帧数,-s 画面大小
转后缩减内存大小:
bash
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转为视频
bash
ffmpeg -f gif -i image.gif vimage.mp4
主要需要加上**-f gif**参数
十一、FFmpeg 视频录制
需要安装软件:Screen Capturer Recorder
下载后直接安装即可!
Screen Capturer Recorder是一款功能强大的屏幕录像录音工具,它可以对桌面进行录制,对声音进行录制,对于学习还是很有帮助的。
使用命令查看电脑录屏设备
bash
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).录制视频
①录制桌面
bash
ffmpeg -f dshow -i video="screen-capture-recorder" -y out.flv
②录制摄像头(注意替换自己摄像头名字)
bash
ffmpeg -f dshow -i video="USB2.0 HD UVC WebCam" out2.flv
(2).录制声音
①录制系统声音 (注意替换自己设备的名字)
bash
ffmpeg -f dshow -i audio="virtual-audio-capturer" -y out.aac
②录制麦克风声音 (注意替换自己设备的名字)
bash
ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -y out.aac
③录制系统声音和麦克风声音(注意替换自己设备的名字)
bash
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).同时录制声音和视频
bash
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
如果不需要系统声音或者麦克风声音,删除相应的输入即可,例如。
bash
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -y out.flv
2.查看可选参数
(1).查看视频录制设备的可选参数
bash
ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"
(2).查看音频设备的可选参数
bash
# 系统声音
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.指定参数录制音视频
bash
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 拉流地址
bash
ffplay rtmp://xxx -codec copy xxx.flv
ffplay http://xxx xxx.flv
注意,如果不是rtmp的拉流地址,需要慎用 -codec copy 参数
http是ts流,使用ts后缀保存视频,可以使用 -codec copy 参数,例如
bash
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大小的视频
bash
ffmpeg -i xxx.mp4 -vf crop=640:480:10:20 out.mp4
案例二,裁剪300x300大小视频,视频位于原视频中间位置
bash
ffmpeg -i xxx.mp4 -vf crop=300:300:(iw-300)/2:(ih-300)/2 -t 10 -y out.mp4
小技巧,如果只是想要查看效果,可以使用ffplay裁剪后显示出来,并不会保存于本地
bash
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 |
[ffmpeg文字滤镜参数] |
(2).将文字添加到视频左上角 fontfile=FreeSerif.ttrf 意思是设置字体文件
bash
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
bash
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
bash
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).添加时间水印,本地时间
bash
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取余数。
bash
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
bash
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 参数结合,定时显示消失水印。
bash
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的位置中添加图片水印
bash
ffplay -i xxx.mp4 -vf "movie=15.png[logo];[in][logo]overlay=x=50:y=30[out]"
2.在视频左上右下添加图片水印测试代码
bash
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.跑马灯效果
bash
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表示时的处理方式,默认为重复 * repeat(值为0):重复前一帧(画中视频播放完毕后一直停停留在哪里) * endcall(值为1):停止所有的流(画中视频播放完毕后所有视频停止播放) * pass(值为2):保留主图层(画中视频播放完毕后消失,只剩下主视频在播放) |
shortest | 布尔 | 最短的视频播放结束时,全部视频终止播放(默认false) |
format | 整数 | 设置output的像素格式,默认为yuv420 * yuv420 (值为0) * yuv422 (值为1) * yuv444 (值为2) * rgb (值为3) |
scale | 大小 | 设置子画面(画中画)的视频大小 scale=480x270 |
[FFmpeg滤镜overlay基本参数] |
画中画组成示意图
例:
普通例子
bash
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]"
跑马灯
bash
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建立一个画布,也可以使用默认的画布。如果想以多宫格的方式展现,则可以自己建立一个足够大的画布。
案例,四宫格
bash
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
命令拆解说明:
bash
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 # 将第四个视频添加到画布右下角
案例,三宫格
bash
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
完!