ffmpeg命令2
视频裁剪
裁剪图(学习使用侵删)描述:将输入视频帧的宽度和高度从 x 和 y 值表示的位置裁剪到指定的宽度和高度;x 和 y 是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。如果使用了可选的 keep_aspect 参数,将会改变输出 SAR(样本宽比)以补偿新的DAR(显示长宽比)
语法:crop=ow[:oh[:x[:y[:keep_aspect]]]]
变量 | 用于 ow 和 oh 参数的表达式中的可用变量 |
---|---|
x,y | 对 x 的计算值(从左上角水平方向的像素个数)和 y(垂直像素的数量),对每个帧进行评估,x的默认值为(iw - ow)/2, y 的默认值为(ih - oh)/2 |
in_w,iw | 输入的宽度 |
in_h,ih | 输入的高度 |
out_w,ow | 输出(裁剪)宽度,默认值= iw |
out_h,oh | 输出(裁剪)高度,默认值= ih |
a | 纵横比,与 iw/ih 相同 |
sar | 输入样本比例 |
dar | 输入显示宽比,等于表达式 a*sar |
hsub,vsub | 水平和垂直的色度子样本值,对于像素格式 yuv422p, hsub 的值为 2,vsub 为 1 |
n | 输入帧的数目,从 0 开始 |
pos | 位置在输入框的文件中,如果不知道则为NAN |
t | 时间戳以秒表示,如果输入时间戳未知 |
例如:ffplay -i input.jpg -vf crop=2/3in_w:2/3in_h
添加水印
文字水印
在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译 FFmpeg 时需要支持 FreeType、FontConfig、iconv,系统中需要有相关的字库,在 FFmpeg 中增加纯字母水印可以使用 drawtext滤镜进行支持
FFmpeg drawtext滤镜参数:
参数 | 类型 | 说明 |
---|---|---|
text | 字符串 | 文字 |
textfile | 字符串 | 文字文件 |
box | 布尔 | 文字区域背景框(缺省 false) |
boxcolor | 色彩 | 展示字体区域块的颜色 |
font | 字符串 | 字体名称(默认为 Sans 字体) |
fontsize | 整数 | 显示字体的大小 |
x | 字符串 | 调整水印从左往右的像素位置,缺省为 0 |
y | 字符串 | 调整水印从上往下的像素位置,缺省为0 |
alpha | 浮点数 | 透明度(默认为 1),值从 0~1 |
例1: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=60:fontfile=FreeSerif.ttf:text='%{localtime:%Y-%m-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow"
图片水印
为视频添加图片水印可以使用 movie 滤镜
FFmpeg movie 滤镜的参数
参数 | 类型 | 说明 |
---|---|---|
filename | 字符串 | 输入的文件名,可以是文件,协议,设备 |
format_name, f | 字符串 | 输入的封装格式 |
stream_index, si | 整数 | 输入的流索引编号 |
seek_point, sp | 浮点数 | Seek 输入流的时间位置 |
streams, s | 字符串 | 输入的多个流的流信息 |
loop | 整数 | 循环次数 |
discontinuity | 时间差值 | 支持跳动的时间戳差值 |
例1:ffplay -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]"
生成画中画
在 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) |
例1:ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"
例2:生成4宫格视频:
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