1 FFmpeg
命令查看帮助文档
1.1 ffmpeg/ffplay/ffprobe
简介
FFmpeg
是一套开源的计算机程序,主要用于记录、转换数字音频、视频,并能将其转化为流。它提供了录制、转换以及流化音视频的完整解决方案,包含了非常先进的音频/视频编解码库libavcodec
。ffplay
是FFmpeg
提供的一个简单的音视频媒体播放器,由ffmpeg
库和SDL
库开发。它可以用于音视频播放、可视化分析,提供音视频显示和播放相关的图像信息、音频的波形等信息。ffprobe
是另一个由FFmpeg
提供的工具,它可以从媒体流收集媒体信息,并打印出开发人员可以读的格式。我们可以将ffprobe
理解为流媒体的分析工具,使用它可以查看流媒体中包含的容器,以及容器中包含的流媒体的格式和类型。这对于我们理解并处理多媒体数据非常有帮助。
1.2 命令查看帮助文档
ffmpeg
# 基本信息
ffmpeg -h
# 高级信息
ffmpeg -h long
# 所有信息
ffmpeg -h full
usage:
ffmpeg [options] [[input options] -i input]... {[output options] output}...
ffplay
ffplay -h
usage:
ffplay [options] input
ffprobe
ffprobe -h
usage:
ffprobe [options] [input]
1.3 处理流程
首先了解一些常用参数
主要参数
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数
-b 设定视频流量(码率),默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
解析来看两个例子
# cpoy表示不重新编码,直接复制原来的流
ffmpeg -i input_1920*1080.mp4 -acodec copy -vcodec libx264 -s 1280×720 output_1280*720.flv
ffmpeg -i input_1920*1080.mp4 -acodec copy -vcodec libx265 -s 1280×720 output_1280*720.mkv
![](https://img-blog.csdnimg.cn/direct/790278950a7745bc8c1e78df3759bf2d.png)
1.4 ffmpeg
分类查询
命令参数 | 内容 |
---|---|
-version | 显示版本 |
-buildconf | 显示编译配置 |
-formats | 显示可用的格式 |
-muxers | 显示可用的封装 |
-demuxers | 显示可用的解封装 |
-codecs | 显示可用的编解码器 |
-decoders | 显示可用的解码器 |
-encoders | 显示可用的编码器 |
-bsfs | 显示可用比特流fliter |
-protocols | 显示可用的协议 |
-filters | 显示可用的过滤器 |
-pix-fmts | 显示可用的像素格式 |
-layouts | 显示标准声道名称 |
-sample_fmts | 显示可用的音频采样格式 |
-color | 显示可用的颜色名称 |
想查看具体某个具体的参数
# 语法
ffmpeg -h type=name
# 比如
ffmpeg -h muxer=flv
ffmpeg -h filter=atempo
ffmpeg -h encoder=libx264
2 ffplay
命令
均来自ffplay.html
2.1 播放中选项
选项 | 说明 | 选项 | 说明 |
---|---|---|---|
q、ESC | 退出播放 | t | 循环切换字幕流 |
f | 全屏切换 | c | 循环切换节目 |
p、space | 暂停 | w | 循环切换过滤器或显示模式 |
m | 静音切换 | s | 逐帧播放 |
9、0 | 9增加音量、0减小音量 | left/right | 向后、向前拖动10s |
down/up | 向后、向前拖动1min | ||
a | 循环切换音频流 | 鼠标右键单击 | 拖动与显示宽度百分比的文件进行播放 |
v | 循环切换视频流 | 鼠标左键单击 | 全屏切换 |
2.2 主要选项
-x width # 强制显示宽度
-y height # 强制显示高度
-fs # 以全屏模式启动
-an # 禁用音频
-vn # 禁用视频
-sn # 禁用字幕
-ss pos # 根据设置的秒进行定位拖动
-t duration # 播放时长
-bytes # 按字节进行定位拖动
-seek_interval interval # 设置左右键定位拖动间隔
-nodisp # 关闭图形化显示,视频将被关闭
-noborder # 无边框
-alwaysontop # 窗口总是在上面。适用于:X11, SDL >= 2.0.5, Windows SDL >= 2.0.6。
-volume # 设置音量【0~100】
-f fmt # 强制使用设置的格式解析
-window_title title # 设置窗口标题,默认是输入文件名
-loop number # 设置循环播放次数,0是无限
-showmode mode # 设置显示模式,可用的模式值:0视频、1音频波形、2音频频谱。缺省0,不存在则是2
-vf filtergraph # 视频滤镜
-af filtergraph # 音频滤镜
-framerate #设置帧率
# ============通用选项===========
-pix_fmts # 设置像素格式或者查看支持的像素格式
2.3 高级选项
-stats
#打印多个播放统计数据,特别是显示流持续时间,编解码器参数,流中的当前位置和音频/视频同步差值。
#默认情况下显示,除非日志级别低于info。要禁用它,需要指定-nostats。
-fast
#非标准化规范的多媒体优化.
-genpts
#生成 pts.
-sync type
#设置主时钟为 audio (type=audio), video (type=video) or external (type=ext). 默认是音频
-ast audio_stream_specifier
# 指定音频流索引,比如-ast 3,播放流索引为3的音频流
-vst video_stream_specifier
# 指定视频流索引,用法同上
-sst subtitle_stream_specifier
# 指定字幕流索引,用法同上
-autoexit
# 视频播放完毕,自动退出
-exitonkeydown
# Exit if any key is pressed.
-exitonmousedown
# Exit if any mouse button is pressed.
-codec:media_specifier codec_name
# 强制使用设置的多媒体解码器,media_specifier 可用值为a (audio), v (video), and s
# 比如-codec:v h264_qsv强制视频采用h264_qsv解码
-acodec codec_name
Force a specific audio decoder.
-vcodec codec_name
Force a specific video decoder.
-scodec codec_name
Force a specific subtitle decoder.
-autorotate
# 根据文件元数据自动旋转视频. Enabled by default, use -noautorotate to disable it.
-framedrop
# 如果视频不同步则丢弃视频帧. 当主时钟非视频时钟时默认开启, use -noframedrop to disable it.
-infbuf
# 不限制输入缓冲区大小。尽可能快地从输入中读取尽可能多的数据。
# 播放实时流时默认启用,如果未及时读取数据,则可能会丢弃数据,此选项
# 将不限制缓冲区的大小。 use -noinfbuf to disable it.
-filter_threads nb_threads
# 定义用于处理过滤器管道的线程数.
# 每个管道会产生一个线程池,里边有许多线程用于并行处理.
# 0代表由可用cpu的数量决定
-enable_vulkan
# 使用vulkan渲染器而不是SDL内置渲染器。取决于libplacebo。
-vulkan_params
Vulkan configuration using a list of key=value pairs separated by ":".
-hwaccel
# 使用HW加速解码。启用此选项将自动启用vulkan渲染器。
2.4 练习讲解
- 播放本地文件
# 解:设置视频标题为hello, 从第2s开始播放,持续10s,完事自动退出
ffplay -window_title "hello" -ss 2 -t 10 -autoexit test.mp4
# 解:播放shijie.mp4文件
ffplay shijie.mp4
- 播放网络流
# 设置标题为rtmp
ffplay -window_title "rtmp" rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid
- 强制解码器
# mpeg解码器:
ffplay -vcodec mpeg4 input.mp4
# h264解码器
ffplay -vcodec h264 input.mp4
- 禁用音频或视频
# 禁用音频
ffplay test.mp4 -an
# 禁用视频
ffplay test.mp4 -vn
- 播放
YUV
数据
# video_size 设置显示帧存储(WxH格式),仅适用于类似原始YUV等没有包含帧大小的视频
ffplay -pixel_format yuv420p -video_size 320×240 -framerate 5 yuv420p_320×240.yuv
- 播放
RGB
数据
ffplay -pixel_format rgb24 -video_size 320×240 -i rgb24_320×240.rgb
ffplay -pixel_format rgb24 -video_size 320×240 -framerate 5 -i rgb24_320×240.rgb
- 播放
PCM
数据
ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
-ar 设置音频采样率(Hz)(从0到INT_MAX)
-ac 设置音频通道数(从0到INT_MAX)
2.5 简单过滤器
# 视频旋转90°
ffplay -i test.mp4 -vf transpose=1
# 视频反转
ffplay -i test.mp4 -vf hflip
ffplay -i test.mp4 -vf vflip
# 视频反转加旋转
ffplay test.mp4 -vf hflip, transpose=1
# 音频变速播放
ffplay -i test.mp4 -af atempo=2
# 视频变速播放
ffplay -i test.mp4 -vf setpts=PTS/2
# 音视频同时变速
ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2
3 ffmpeg
命令
3.1 ffmpeg
常用选项
3.1.1 Main options
-f fmt # 设定输入输出文件格式,输入不常用,一般都自动检测。
-i input # 设定输入流
-y # 不询问直接覆盖已有文件
-n # 不覆盖已有文件,如果存在立即退出
-c(或codec) # 为一个或多个流选择
-c
-codec
# 为一个或多个流选择编码器(输出文件)或解码器(输入文件)
# example 1
# 使用x264为所有的视频流编码,并直接复制音频流
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
# example 2
# 使用x264为第二个视频流编码,使用libvorbis为138th音频流编码,其余的直接复制
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a137 libvorbis OUTPUT
-t duration # 设定时长
-ss position # 设定开始时间
-fs limit_size # 设定输出文件大小上限
-timestamp date # 设定输出文件时间戳
#
-metadata[:metadata_specifier] key=value (output,per-metadata)
# 设置文件元数据
-metadata[:metadata_specifier] key=value (output,per-metadata)
# example 1 设置文件标题
ffmpeg -i in.avi -metadata title="my title" out.flv
# example 2 设置首个音频流的语言
ffmpeg -i in.avi -metadata:s:a:0 language=eng out.avi
# 其他key
comment、encoder
3.1.2 Video Options
# 设置输出的视频帧数。这是-frames:v的过时别名,应该替换它
-vframes number
-b #设定视频码率
-b:v #视频码率
-r fps # 设置帧速率
-s size # 设置画面的宽和高,格式是 ‘wxh’ ,其实就是分辨率
-aspect aspect # 设置视频长宽比(16:9、4:3、1.333)
-vn # 不处理视频
-vcodec codec # 设定视频编解码器,这是 -codec:v的别名
-vf # 视频过滤器
-pass n #择处理遍数(1或者2)。两遍编码非常有用。
#第一遍生成统计信息,第二遍生成精确的请求的码率
ffmpeg -i test.mp4 -vframes 300 -b:v 300k -r 30 \
-s 640x480 -aspect 16:9 -vcodec libx265
# 输入文件test.mp4 输出300帧 码率300k 帧率30
# 画面宽高640*480 长宽比16:9 265编解码
## 注意:如果-s 640x480这里总报错,可以改成640:480试试,
## 虽然文档写的是用乘号
3.1.3 Advanced Video options
-pix_fmt format # 设置像素格式,
#用ffmpeg -pix_fmts查看支持的格式
# 如果设置了不支持的,ffmpeg会自动选择最合适的
-
3.1.4 Audio Options
-aframes num # 设置输出音频帧数,是-frames:a的过时别名
-ar # 设定采样率
-aq # 设置音频质量,是-q:a的别名
-ac # 设置通道数
-an # 不处理音频
-acodec # 声音编解码器
-sample_fmt # 设置音频样本格式
-af # 音频过滤器,是-fliter:a的别名
# example
ffmpeg -i test.mp4 -aframes 200 -b:a 192k -ar 48000 \
-ac 2 -acodec libmp3lame out2.mp3
3.2 ffmpeg
命令练习
3.2.1 提取音视频数据
保留封装格式
ffmpeg -i test.mp4 -acodec copy -vn audio.mp4
ffmpeg -i test.mp4 -vcodec copy -an audio.mp4
提取视频
# 保留编码格式
ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264
# 强制格式
ffmpeg -i test.mp4 -vcodec libx264 -an test.h264
提取音频
# 保留编码格式
ffmpeg -i test.mp4 -acodec copy -vn test.aac
# 强制格式
ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3
3.2.2 提取像素格式和PCM数据
提取YUV
# 提取三秒数据,分辨率和源视频一致
ffmpeg -i test_1280×720.mp4 -t 3 -pix_fmt yuv420p
# 提取3秒数据,分辨率转为320×240
ffmpeg -i test_1280×720.mp4 -t 3 -pix_fmt yuv420p -s 320:240 out.yuv
Tip:忘了yuv420p
是啥了这里查了一下 @handy周
提取RGB
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320:240 out.rgb
YUV转RGB
ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320xx240.yuv \
-pix_fmt rgb24 rgb24_320x240_2.rgb
提取PCM
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
3.2.3 转封装
保持编码格式
# 可以看出封装格式一般不用指定 -f,可以通过文件扩展名推测
ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test.mp4 -codec copy copy2.ts
改变编码格式
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out.mkv
修改帧率
ffmpeg -i test.mp4 -r 15 output.mp4
修改视频码率
# 此时音频也被重新编码
ffmpeg -i test.mp4 -b 400k output.mkv
修改视频码率
# 只对视频编码,音频不变
ffmpeg -i test.mp4 -b:v 400k output.mkv
修改音频码率
# 不像对video重新编码,需要加上vcodec copy
ffmpeg -i tset.mp4 -b:a 192k out.mp4
修改音视频码率
ffmpeg -i tset.mp4 -b:a 192k -b:v 400k out.mp4
修改视频分辨率
ffmpeg -i tset.mp4 -s 480:270 out.mp4
修改音频采样率
ffmpeg -i tset.mp4 -ar 44100 out.mp4
3.2.4 裁剪和合并视频
-
生成测试文件
a. 找三个不同的视频,每个视频截取10s内容# 如果格式不统一则强制统一-vcodec libx264 -acodec aac ffmpeg -i test1.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4 ffmpeg -i test2.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4 ffmpeg -i test3.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4
b. 将上述1.mp4/2.mp4/3.mp4转成ts格式
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
c. 转成flv格式
ffmpeg -i 1.mp4 -codec copy 1.flv ffmpeg -i 2.mp4 -codec copy 2.flv ffmpeg -i 3.mp4 -codec copy 3.flv
分离某些封装格式(e.g: MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS从而无法播放。H.264码流中的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为h264_mp4toannexb的bitstream filter处理。
-
开始拼接文件
a. 以MP4格式拼接# 方式1 ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -c copy output.mp4 # 方式2:将他们放在一起,然后内容如下 file '1.mp4' file '2.mp4' file '3.mp4' # 执行命令 ffmpeg -f concat -i video.txt -c copy concat.mp4
b. 以TS格式进行拼接
# 方式1 ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4 # 方式2:将他们放在一起,同上 # 执行命令 ffmpeg -f concat -i video.txt -c copy outts2.mp4
c. 以FLV格式进行拼接
# 方式1 ffmpeg -i "concat:1.flv|2.flv|3.flv" -c copy outflv.mp4 # 方式2:将他们放在一起,同上 # 执行命令 ffmpeg -f concat -i video.txt -c copy outflv2.mp4
不是所有格式都能用方法1拼接,优先第二种方式
-
测试不同编码拼接
a. 修改音频编码ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4 # 第二段没声音
b. 修改音频采样率
ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4 # 第二段异常
c. 修改视频编码格式
ffmpeg -i 1.mp4 -vcodec libx265 -acodec copy 1.ts ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4
d. 修改视频分辨率
ffmpeg -i 1.mp4 -vcodec libx265 -s 800:472 -acodec copy -vbsf h264_mp4toannexb 1.ts ffmpeg -i "concat:1.ts|2.ts|3.ts" -c copy outts.mp4
- 把每个视频封装成统一的ts格式,拼接输出的时候再输出你需要的封装格式,比如MP4
- 视频分辨率可以不同,但是编码格式需要统一
- 音频编码格式需要统一,音频参数也需要统一
- 拼接视频时,一般都需要按照第一个视频参数为准,后边的不一样会出问题
3.2.5 图片与视频互转
- 截取一张图片
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640:360 test.jpg ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640:360 test.bmp # -i 输入 # -y 覆盖 # -f 格式 # image2 一种格式 # ss 起始时间 # -vframes 帧数,如果大于1,输出加%03d. test%03d.jpg # -s 分辨率
- 转换视频为图片(每帧一张)
ffmpeg -i test.mp4 -t 5 -s 640:480 -r 15 frmae%03d.jpg
- 图片转化为视频
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
- 从视频中生成gif图片
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif ffmpeg -i test.mp4 -t 5 -r 25 -s 640:480 image2.gif
- 将gif转化为视频
ffmpeg -f gif -i image2.gif image2.mp4
3.2.6 视频录制
3.2.4.1 Ubuntu
# 1. 获取屏幕分辨率
xrandr
# 2. 设置分辨率、帧率、输出格式、偏移量
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab
-i :0.0+100,00 output.mp4
# 3. 全屏录制
ffmpeg -video_size 1920:1080 -framerate 25 -f x11grab
-i :0.0+0,00 output.mp4
3.2.4.2 Windows
需要安装dshow软件(dshow最新目前只支持4.7版本,最新的6不行,但是在其configuration/vendor/ffmpegbin目录下有编译好的可以用)
-
查看可用设备的名字
-
ffmpeg -list_devices true -f dshow -i dummy
录制视频(默认参数)
-
桌面
ffmpeg -f dshow -i video="screen-capture-recoder" v-out.mp4
-
摄像头
ffmpeg -f dshow -i video="自己的摄像头名字" -y v-out2.flv
录制音频(默认参数)
-
系统声音
ffmpeg -f dshow -i audio="virtual-audio-capture" a-out.aac
-
系统+麦克风声音
ffmpeg -f dshow -i audio="麦克风(Realtek Audio)" -f dshow -i audio="virtual-audio-capture" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 a-out2.aac
同时录制声音和视频(默认参数)
-
ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -i video="screen-capture-recorder" -y av-out
查看视频录制的可选参数
-
ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"
查看音频录制的可选参数
-
ffmpeg -f dshow -list_options true -i audio="virtual-audio-capture" ffmpeg -f dshow -list_options true -i audio="麦克风(Realtek Audio)"
指定参数录制音视频
-
# ffmpeg -f dshow -i audio="麦克风(Realtek Audio)" -f dshow -i audio="virtual-audio-capture" -fliter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -video_size 1920:1080 -framerate 15 -pixel_format yuv420p -i video="screen-capture-recorder" -vcodec h264_qsv -b:v 3M -y a-out.flv
-
# ffmpeg -f dshow -i audio="麦克风(Realtek Audio)" -f dshow -i audio="virtual-audio-capture" -fliter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -i video="screen-capture-recorder" -vcodec h264_qsv -b:v 3M -r 15 -y av-out2.mp4
-
# ffmpeg -f dshow -i audio="麦克风(Realtek Audio)" -f dshow -i audio="virtual-audio-capture" -fliter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -framerate 15 -pixel_format yuv420p -i video="screen-capture-recorder" -vcodec h264_qsv -b:v 3M -r 15 -y a-out.flv
3.2.7 直播
-
ffmpeg拉流
-
直播拉流
ffplay rtmp://server/live/streamName ffmpeg -i rtmp://server/live/streamName -c copy dump.flv # 对于不是rtmp的协议 -c copy谨慎使用
-
可用地址
-
直播推流
ffmpeg -re -i out.mp4 -c copy flv rtmp://server/live/streamName # -re表示按照时间戳读取文件
3.2.8 过滤器
3.2.8.1 filter分类
-
按照处理数据的类型,通常多媒体的filter分为:
- 音频filter
- 视频filter
- 字幕filter 另一种按照处理编解码器的位置划分
- prefilters: used before encoding
- intrafilters: used while encoding (and are thus an integral part of a video codec)
- postfilters: used after decoding FFmpeg 中 filter 分为:
- source filter (只有输出)
- audio filter
- video filter
- Multimedia filter
-
sink filter (只有输入)
除了 source 和 sink filter,其他 filter 都至少有一个输入、至少一个输出。
3.2.8.2 视频裁剪
![](https://img-blog.csdnimg.cn/direct/06eefe9b0ddb41bcbfb3d72d609e8eaa.png)
将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度;
x 和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。
如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显
示长宽比)
注:起点默认在中心
语法: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
# 裁剪掉左右10像素,上下20像素
crop=in_w-2*10:in_h-2*20
#裁剪中心区域,大小为输入视频的2/3
crop=2/3*in_w:2/3*in_h
3.2.8.3 滤镜Filter 内置变量
变量 | 说明 |
---|---|
t | 以秒表示的时间戳,如果输入的时间是未知的则是NAN |
n | 输入帧的顺序编号,从0开始 |
pos | 输入帧的位置,如果未知的则是NAN |
w | 输入视频帧的宽度 |
h | 输入视频帧的高度 |
3.2.8.4 添加水印
- 文字水印
在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译FFmpeg时需要
支持FreeType、FontConfig、iconv,系统中需要有相关的字库,在FFmpeg中增加纯字母水印可以使用drawtext滤镜进行支持,下面就来看一下drawtext的滤镜参数
-
练习
-
1.将文字的水印加在视频的左上角
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20" 将字体的颜色设置为绿色: ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green" 如果想调整文字水印显示的位置,调整x与y参数的数值即可。 ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200" 修改透明度 ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=400:y=200:alpha=0.5"
-
2.文字水印还可以增加一个框,然后给框加上背景颜色
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"
-
3.有些时候文字水印希望以本地时间作为水印内容,可以在drawtext滤镜中配合一些特殊用法来
完成,在text中显示本地当前时间,格式为年月日时分秒的方式ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H%M-%S}':fontcolor=green:box=1:boxcolor=yellow" #在使用ffmpeg转码存储到文件时需要加上-re,否则时间不对。 ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" out.mp4
-
4.在个别场景中,需要定时显示水印,定时不显示水印,这种方式同样可以配合drawtext滤镜进
行处理,使用drawtext与enable配合即可,例如每3秒钟显示一次文字水印:ffplay -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)" # 在使用ffmpeg转码存储到文件时需要加上-re,否则时间不对。 # 表达式参考:http://www.ffmpeg.org/ffmpeg-utils.html 3 Expression Evaluation # lt(x, y) Return 1 if x is lesser than y, 0 otherwise. # mod(x, y) Compute the remainder of division of x by y.
-
5.跑马灯效果
ffplay -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7" #修改字体透明度,修改字体颜色 ffplay -i input.mp4 -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='超winter':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"
- 图片水印
为视频添加图片水印可以使用movie滤镜,下面就来熟悉一下movie滤镜的参数
ffmpeg -i input -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" output
# 原始视频文件路径:input.mp4
# 水印图片路径:logo.png
# 水印位置:(x,y)=(10,10)<=(left,top)距离左侧、顶部各10像素;
# 输出文件路径:output.mp4
![](https://img-blog.csdnimg.cn/direct/82c753fd7fe34128a1f5f76f01718ceb.png)
![](https://img-blog.csdnimg.cn/direct/337ea9969e5d4d699eb6459ed9958903.png)
在FFmpeg 中加入图片水印有两种方式,一种是通过movie指定水印文件路径,另外一种方式是通过
filter 读取输入文件的流并指定为水印,这里重点介绍如何读取movie图片文件作为水印。
(1)图片logo.png将会打入到input.mp4视频中,显示在x坐标50、y坐标20的位置
ffplay -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=50:10[out]"
由于 logo.png 图片的背景色是白色,所以显示起来比较生硬,如果水印图片是透明背景的,效果会更好,
下面找一张透明背景色的图片试一下:
ffplay -i input.mp4 -vf "movie=logo2.png[watermark];[in][watermark]overlay=50:10[out]"
感觉这个方法也不错,可以使用 overlay 滤镜
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10:alpha=0.5" output.mp4
(2) 显示位置
# 开始坐标(10,10)
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:10[out]"
# main_w既代表了帧宽度,也代表了右上角坐标
# 开始坐标(main_w-overlay_w-10,10)
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]"
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:main_h-overlay_h-10[out]"
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:main_hoverlay_h-10[out]"
(3)跑马灯
ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"
- 画中画
在使用FFmpeg处理流媒体文件时,有时需要使用画中画的效果。在FFmpeg中,可以通过overlay将
多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果。在前面的滤镜
使用中,以至于以后的滤镜使用中,与视频操作相关的处理,大多数都会与overlay滤镜配合使用,尤其是
用在图层处理与合并场景中,下面就来了解一下overlay的参数
从参数列表中可以看到,主要参数并不多,但实际上在overlay滤镜使用中,还有很多组合的参数可以
使用,可以使用一些内部变量,例如overlay图层的宽、高、坐标等。
(1)显示画中画效果
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest =1[out]"
#缩放子画面尺寸
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20[out]"
(2)跑马灯效果
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[test];[in][test]overlay= x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"
- 视频多宫格
视频除了画中画显示,还有一种场景为以多宫格的方式呈现出来,除了可以输入视频文件,还可以输入视
频流、采集设备等。从前文中可以看出进行视频图像处理时,overlay 滤镜为关键画布,可以通过FFmpeg建立一个画布,也可以使用默认的画布。如果想以多宫格的方式展现,则可以自己建立一个足够大的画布,
下面就来看一下多宫格展示的例子:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.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" out.mp4
1.2.3.4.mp4 为文件路径,out.MP4 为输出文件路径,通过nullsrc创建overlay画布,画布大小640:480,
使用[0:v][1:v][2:v][3:v]将输入的 4 个视频流去除,分别进行缩放处理,然后基于 nullsrc 生成的画布进行视
频平铺,命令中自定义upperleft,upperright,lowerleft,lowerright 进行不同位置平铺。
只叠加左上右上的命令:
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTS-STARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320" out2.mp4