FFmpeg 命令:从入门到精通 | ffmpeg filter(过滤器 / 滤镜)

FFmpeg 命令:从入门到精通 | ffmpeg filter(过滤器 / 滤镜)

  • FFmpeg 命令:从入门到精通 | ffmpeg filter(过滤器 / 滤镜)
    • ffmpeg fliter 基本内置变量
    • 视频裁剪
    • 文字水印
    • 图片水印
    • 画中画
    • 视频多宫格处理

FFmpeg 命令:从入门到精通 | ffmpeg filter(过滤器 / 滤镜)

本节主要介绍了ffmpeg filter,列举了一些常用的滤镜及其使用方法。

ffmpeg 滤镜种类非常多,这也是 ffmpeg 学习的重难点。

ffmpeg fliter 基本内置变量

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

视频裁剪

输入图像大小:iw * ih,起始坐标 (x, y),裁剪输出大小:ow * oh。

在这里插入图片描述

直接显示:

ffplay -i input.jpg -vf crop=ow:oh:x:y

输出图片:

ffmpeg -i input.jpg -vf crop=ow:oh:x:y output.jpg

裁剪中间区域,大小为 100 * 100:

ffmpeg -i input.jpg -vf crop=100:100 output.jpg

裁剪中间区域,大小为输入视频的 2/3:

ffmpeg -i input.flv -vf crop=2/3*in_w:2/3*in_h output.flv

裁剪中间区域的正方形,大小为输入视频的高:

ffmpeg -i input.flv -vf crop=out_w=in_h output.flv

ffmpeg -i input.flv -vf crop=in_h output.flv

示例1:

ffmpeg -i input.jpg -vf crop=iw/3:ih:iw/3:0 output.jpg

从坐标 (iw/3, 0) 开始裁剪出一个宽度为 iw/3、高度为 ih 的图片,命名为 output.jpg 并保存。

input.jpg:

input.jpg

output.jpg:

output.jpg

示例2:

ffplay -i input.jpg -vf crop=iw/3:ih/2:0:0

从坐标 (0, 0) 开始裁剪出一个宽度为 iw/3、高度为 ih/2 的图片,并显示:

在这里插入图片描述

文字水印

在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译 FFmpeg 时需要支持 FreeType、FontConfig、iconv,系统中需要有相关的字库,在 FFmpeg 中增加纯字母水印可以使用 drawtext滤镜进行支持,下面就来看一下 drawtext 的滤镜参数:

参数类型说明
text字符串文字内容
textfile字符串存储文字内容的文件
box布尔值文字区域背景框,默认为 false
boxcolor色彩展示字体区域块的颜色
font字符串字体名称,默认为 Sans 字体
fontsize整数字体大小
x 和 y字符串文字水印出现的位置,以视频左上角为起始坐标,默认都为0
alpha浮点数透明度,值为 0 ~ 1 的浮点数,默认为 1

示例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"

文字水印还可以增加一个框,然后给框加上背景颜色:

ffplay -i cuc_ieschool.mkv -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='hello  world':fontcolor=green:box=1:boxcolor=yellow"

效果:

在这里插入图片描述

注意:引号中间是整个滤镜的,每个参数用冒号隔开。

示例2:以本地时间作为水印内容

有些时候文字水印希望以本地时间作为水印内容,可以在 drawtext 滤镜中配合一些特殊用法来完成,在 text 中显示本地当前时间,格式为年月日时分秒的方式。

ffplay -i cuc_ieschool.mkv -vf "drawtext=fontsize=20:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow"

效果:

在这里插入图片描述

注:时间会实时显示,不断变动。

在使用 ffmpeg 转码存储到文件时需要加上-re(表示按照时间戳来打水印,因为是在转码,1s会有多帧,按照当前时间显示会有异常),否则时间不对。

ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=30:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" output.mp4

在个别场景中,需要定时显示水印,定时不显示水印,这种方式同样可以配合 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,否则时间不对。

表达式参考:FFmpeg Utilities Documentation 3 Expression Evaluation

  • lt(x, y):Return 1 if x is lesser than y, 0 otherwise。x 小于 y 返回 1,否则返回 0
  • mod(x, y):Compute the remainder of division of x by y。x 对 y 取余。

示例3:跑马灯效果

跑马灯是指文字水印在视频界面上波动,也是根据 mod 公式动态的修改水平的 x, y 坐标达到跑马灯的效果。

ffplay -i input.mp4 -vf "drawtext=fontsize=30: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='liaoqingfu':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"

效果:

在这里插入图片描述

图片水印

FFmpeg 除了可以向视频添加文字水印之外,还可以向视频添加图片水印、视频跑马灯等。

为视频添加图片水印可以使用 movie 滤镜,下面就来熟悉一下 movie 滤镜的参数:

参数类型说明
filename字符串输入文件名,可以是文件、协议、设备等
format_name 或 f字符串输入文件的封装格式
stream_index整数输入文件的流索引编号
seek_point 或 sp浮点数输入流的时间位置
streams 或 s字符串输入的多个流的流信息
loop整数循环次数
discontinuity时间差值支持跳动的时间戳差值
ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=10:y=10[out]" output.mp4

参数:

  • -i:原始视频文件路径
  • 水印图片路径:logo.png
  • 水印位置:(x, y) = (10, 10) <= (left, top),距离左侧、顶部各 10 像素
  • 输出文件路径:output.mp4
  • in:表示的是 input.mp4,名字可以随便定
  • watermark:表示待叠加的 logo.png,名字可以随便定

如何确定图片水印的位置?

在这里插入图片描述

参数说明
main_w视频单帧图片宽度
main_h视频单帧图片高度
overlay_w视频单帧图片宽度
main_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-10

Tips:如果水印图片是透明背景的,效果会更好。

同样的,我们也可以加上跑马灯效果:

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 的参数:

参数类型说明
x字符串x 坐标
y字符串y 坐标
eof_action整数遇到 eof 表示时的处理方式。repeat(值为0):重复前一帧,子画面保存前一帧;endcall(值为1):停止所有的流,主画面和子画面全部停止;pass(值为2):保留主画面,子画面关闭。默认为repeat(值为0)
shortest布尔值值为 true 时,最短的视频终止时全部视频终止。默认值为 false
format整数设置 output 的像素格式。有以下几种格式:yuv420(值为0)、yuv422(值为1)、yuv444(值为2)、rgb(值为3).默认值为yuv420(值为0)

显示画中画效果:

ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"

图解:

在这里插入图片描述

参数:

  • [sub]:表示要叠加的子画面
  • [in]:表示输入的视频
  • [in][sub]overlay=x=20:y=20[out]:表示输入和 sub 子画面叠加,叠加的位置由 x, y 决定,out 表示输出,sub 子画面的名字可以随意修改

效果:

在这里插入图片描述

子画面停止退出显示,主画面正常播放:

ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=2[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]"

跑马灯效果:

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

看到这么长的命令可能已经晕了,其实将命令拆分解析一下就很简单了,对命令进行拆分解析:

ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 #所有输入
-filter_complex "nullsrc=size=640x480[base];   #创建了一个base的画面,大小640*480
[0:v] setpts=PTS-STARTPTS,scale=320x240[upperleft];   #视频1命令为upperleft,缩放为320x240
[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];   #视频2命令为upperright,缩放为320x240
[2:v]setpts=PTS-STARTPTS, scale=320x240[lowerleft];   #视频3命令为lowerleft,缩放为320x240
[3:v]setpts=PTS-STARTPTS,scale=320x240[lowerright];   #视频4命令为lowerright,缩放为320x240
[base][upperleft]overlay=shortest=1[tmp1];    # [base][upperleft]叠加生成[tmp1],upperleft没设置就是叠加在(0,0)位置
[tmp1][upperright]overlay=shortest=1:x=320[tmp2];     #[tmp1][upperright]叠加生成[tmp2],叠加在(320,0)位置
[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];		#[tmp2][lowerleft]叠加生成[tmp3]
[tmp3][lowerright]overlay=shortest=1:x=320:y=240" 		#[tmp3][lowerright]叠加生成最终的输出
out.mp4

说明:

  • 1.mp4、2.mp4、3.mp4、4.mp4 为文件路径
  • out.MP4 为输出文件路径
  • 通过 nullsrc 创建 overlay 画布,画布大小 640:480
  • 使用[0:v][1:v][2:v][3:v]将输入的 4 个视频流去除,分别进行缩放处理
  • 基于 nullsrc 生成的画布进行视频平铺,命令中自定义 upperleft, upperright, lowerleft, lowerright 进行不同位置平铺。

图解:

在这里插入图片描述

效果:

在这里插入图片描述

当画面的某部分没有视频时,那块背景显示为绿色。如下所示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/125058.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序的停车场预约收费小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

OpenCV 15(SIFT/SURF算法)

一、SIFT Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。 尺度…

阿里云ECS和轻量服务器有什么区别?

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;轻量和ECS优缺点对比&#xff0c;云服务器ECS是明星级云产品&#xff0c;适合企业专业级的使用场景&#xff0c;轻量应用服务器是在ECS的基础上推出的轻量级云服务器&#xff0c;适合个人开发者单机应用访问量不高的网站…

Echarts 教程二

Echarts 教程二 Echarts 常用配置篇柱状图常用配置折线图常用配置散点图常用配置饼图常用配置地图常用配置 Echarts 常用配置篇 柱状图常用配置 配置柱状图的最大最小值 平均值 显示柱状图文字 柱状图宽度 折线图常用配置 配置最大最小值 平均值 标记区域 线的平滑 线的样式 等…

STM32复习笔记(六):STM32远程升级BootLoader相关

目录 Preface&#xff1a; &#xff08;一&#xff09;STM32上电启动流程 &#xff08;二&#xff09;BootLoader相关 &#xff08;三&#xff09;Clion配置 Preface&#xff1a; 有关STM32的BootLoader主要还是参考了许多大佬的文章&#xff0c;这里只是简单地列举一下&am…

用OpenCV(Python)获取图像的SIFT特征

import cv2 as cv import numpy as np import matplotlib.pyplot as plt imgcv.imread("../Lena.png") img_graycv.cvtColor(img,cv.COLOR_BGR2GRAY)#创建一个SIFI对象 siftcv.SIFT_create()#使用SIFT对象在灰度图像img_gray中检测关键点&#xff0c;结果存储在变量k…

这可能是最全的反爬虫及应对方案,再也不怕爬不到数据了

一、什么是反爬虫 网络爬虫&#xff0c;是一个自动提取网页的程序&#xff0c;它为搜索引擎从万维网上下载网页&#xff0c;是搜索引擎的重要组成。但是当网络爬虫被滥用后&#xff0c;互联网上就出现太多同质的东西&#xff0c;原创得不到保护。于是&#xff0c;很多网站开始…

数据结构 1.1 初学数据结构

数据结构的基本概念 数据结构在学什么&#xff1f; 如何用程序代码把现实世界的问题信息化 如何用计算机高效处理信息从而创造价值 数据&#xff1a; 数据元素、数据项&#xff1a; 数据元素——描述一个个体 数据对象——数据元素之间具有同样的性质 同一个数据对象里的数…

桥梁模板人工费多少钱?

桥梁模板是桥梁工程中不可或缺的一部分&#xff0c;它起到支撑和固定混凝土浇筑的作用。在桥梁建设中&#xff0c;模板人工费用是一个重要的成本因素。那么&#xff0c;桥梁模板人工费到底是多少呢&#xff1f;下面我们来详细了解一下。 首先&#xff0c;需要明确的是&#xff…

(五)正点原子STM32MP135移植——烧录

一、概述 这里用的烧录方式是使用STM32CubeProgrammer USB方式烧录 二、文件准备 还记得FIP_artifacts文件夹吗&#xff0c;里面存放了TF-A、optee、u-boot编译输出的东西&#xff0c;以及最后的fip-stm32mp135-atk-optee.bin文件 烧写程序需要准备这些&#xff1a; 1. …

二、互联网技术——网络协议

文章目录 一、OSI与TCP/IP参考模型二、TCP/IP参考模型各层功能三、TCP/IP参考模型与对应协议四、常用协议与功能五、常用协议端口 一、OSI与TCP/IP参考模型 二、TCP/IP参考模型各层功能 三、TCP/IP参考模型与对应协议 例题&#xff1a;TCP/IP模型包含四个层次&#xff0c;由上至…

国庆中秋特辑(八)Spring Boot项目如何使用JPA

目录 一、Spring Boot 项目使用 JPA 的步骤二、Spring Boot 项目使用 JPA 注意事项三、Spring Boot 项目使用 JPA 常用语法 Spring Boot项目如何使用JPA&#xff0c;具体如下 一、Spring Boot 项目使用 JPA 的步骤 添加依赖 在项目的 pom.xml 文件中添加 Spring Boot JPA 和数…