内容简介:FFmpeg 除了具有强大的封装/解封装、编/解码功能外,还包含了一个非常强大的组建---滤镜avfilter。avfilter组建经常用于进行多媒体的处理与编辑,FFmpeg中包含多种滤镜在使用Filter时,经常会用到根据时间轴进行操作的需求,在使用FFmpeg的Filter时可以使用Filter的时间相关的内置变量,下面先来了解下这些相关的变量,如下表,在下面可以使用到FFmpeg可以为视频添加水印,水印可以时文字,也可以时图片,主要用来标记视频归属
FFmpeg 除了具有强大的封装/解封装、编/解码功能外,还包含了一个非常强大的组建---滤镜avfilter。avfilter组建经常用于进行多媒体的处理与编辑,FFmpeg中包含多种滤镜
1.FFmpeg 滤镜filter的参数排列方式
为了便于理解Filter,下面用最简单的方式来描述Filter使用时的参数排列方式: [输入流或标记名]滤镜参数[临时标记名];[输入流或标记名]滤镜参数[临时标记名]... 文字描述的排列方式很明确,接下来列举一个简单的例子:输入两个文件,一个视频input.mp4,一个图片logo.png,将logo进行缩放,然后放在视频的左上角 复制代码
ffmpeg -i test.mp4 -i logo.png -filter_complex "[1:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0" filter.mp4 将logo.png的图像六缩放为176*144分辨率,然后定义一个临时标记名logo,最后将缩放后的图像[logo]铺在输入的视频test.mp4的视频流[0:v]的左上角 复制代码
2.FFmpeg 滤镜filter时间内置变量
在使用Filter时,经常会用到根据时间轴进行操作的需求,在使用FFmpeg的Filter时可以使用Filter的时间相关的内置变量,下面先来了解下这些相关的变量,如下表,在下面可以使用到
变量 | 说明 |
---|---|
t | 时间戳以秒表示,如果输入的时间戳时位置的,则是NAN |
n | 输入帧的顺序编号,从0开始 |
pos | 输入帧的位置,如果位置则是NAN |
w | 输入视频帧的宽度 |
h | 输入视频帧的高度 |
3.FFmpeg 为视频添加水印
FFmpeg可以为视频添加水印,水印可以时文字,也可以时图片,主要用来标记视频归属
3.1 文字水印
在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译FFmpeg时需要支持FreeType、FontConfig、iconv,系统中需要有相关的字库,在FFmpeg中增加纯字母水印可以使用drawtext滤镜进行支持,下面就是drawtext的滤镜参数 复制代码
参数 | 类型 | 说明 |
---|---|---|
fontfile | 字符串 | 字体文件 |
text | 字符串 | 文字 |
textfile | 字符串 | 文字文件 |
fontcolor | 字符串 | 字体颜色 |
box | 字符串 | 文字区域背景框 |
boxcolor | 字符串 | 展示字体颜色的区域快的颜色 |
fontsize | 字符串 | 显示字体的大小 |
font | 字符串 | 字体名称(默认为Sans字体) |
x | 字符串 | 文字显示的x坐标 |
y | 字符串 | 文字显示的y坐标 |
使用举例
ffmpeg -i out2.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world ':x=20:y=20" waterfont.mp4 执行后即可在视频左上角增加hello world 文字水印,文字颜色为纯黑,为了让水印更柔和,可以通过drawtext滤镜的fontcolor参数调节颜色,比如设为绿色 ffmpeg -i out2.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world ':x=20:y=20:fontcolor=green" waterfont.mp4 还可以调用一些系统数据,比如水印按当前时间来显示 ffmpeg -re -i out2.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':x=20:y=20:fontcolor=green" waterfont4.mp4 复制代码
3.2 图片水印
FFmpeg除了可以向视频添加文字水印外,还可以向视频添加图片水印,视频跑马灯等,为视频添加水印可以使用movie滤镜,下面就是movie滤镜的一些参数
参数 | 类型 | 说明 |
---|---|---|
filename | 字符串 | 输入的文件名,可以是文件、协议、设备 |
format_name_,f | 字符串 | 输入的封装格式 |
stream_index,f | 整数 | 输入的流索引编号 |
seek_point,sp | 浮点数 | Seek输入流的时间位置 |
stream,s | 字符串 | 输入的多个流的流信息 |
loop | 整数 | 循环次数 |
discontinuity | 时间差值 | 支持跳动的时间戳差值 |
下面举例说明,在FFmpeg中加入图片水印有两种方式,一是通过movie指定水印文件路径,另外一种方式是通 filter
读取输入文件的流并指定为水印,这里重点介绍如何读取movie图片文件作为水印
ffmpeg -i out2.mp4 -vf "movie=water_pic.png[wm];[in][wm]overlay=30:10[out]" waterPic.mp4 图片就会出现在视频的左上角 也可以用movie与colorkey滤镜配合做成半透明效果,例如 ffmpeg -i out2.mp4 -vf "movie=water_pic.png,colorkey=black:1.0:1.0 [wm];[in][wm]overlay=30:10[out]" waterPicAlpha.mp4 此时图片以30%透明度显示在左上角,[wm]作用为给前面命名 复制代码
overlay又称视频叠加技术,overlay视频技术使用非常广泛,常见的例子有上面的图片水印以及下面会提到的画中画功能,画中画功能值得是在一个大视频播放窗口中还存在一个小播放窗口,两个窗口不同的视频内容同时播放。 overlay 技术中设计两个窗口,通常把较大的窗口称为背景窗口,较小的窗口称为前景窗口,两者皆可以播放视频或显示图片.
overlay滤镜说明如下
描述 | 说明 |
---|---|
语法 | overlay[=x:y[[:rgb={0, 1}]]参数x和y是可选的,其默认值为0 rgb参数是可选的,其值为0或1 |
x | 从左上角开始的水平坐标,默认为0 |
y | 从左上角开始的垂直坐标,默认为0 |
rgb | rgb = 0…输入的颜色空间不改变,默认值rgb = 1…输入的颜色空间设置为RGB |
main_w 或者 W | 主输入(背景窗口)宽度 |
main_h 或者 H | 主输入(背景窗口)高度 |
overlay_w 或者 w | overlay输入(前景窗口)宽度 |
overlay_h或者h | overlay输入(前景窗口)高度 |
eof_action | 遇到eof标志时的处理方式。默认为重复 repeat(值为0) :重复前一帧 endall(值为1) :停止所有帧 pass(值为2) :保留主图层 |
format | 设置output的像素格式。默认为yuv420 yuv420(值为0) yuv422(值为1) yuv444(值为2) rgb(值为3) |
shortest | 布尔值,终止最短视频时全部终止(默认关闭) |
overlay滤镜用法
使用overlay命令行基本格式如下:
ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output 使用一个简单例子,将图片叠在视频的右上角,效果如下图 ffmpeg -i test.mp4 -i chenyao.png -filter_complex overlay=W-w:56 -max_muxing_queue_size 1024 overlay.mp4 复制代码
3.4 FFmpeg生成画中画
除了上述overlay添加图标在视频上外,在使用FFmepg处理流媒体文件时,有时需要使用画中画效果。在FFmpeg中,可以通过overlay将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画效果。在前面的滤镜使用中和以后的滤镜使用中,与视频操作相关的处理,大多数会与overlay滤镜配合使用,尤其时用在图层处理与合并场景中
从上面3.3的参数列表中可以看到,主要参数并不多,但实际上在overlay滤镜使用中,还有很多组合的参数可以使用,可以使用一些内部变量,例如overlay图层的宽、高、坐标等,下面列举几个画中画的例子
ffmpeg -re -i out2.mp4 -vf "movie=output.avi,scale = 480*320[test]; [in][test] overlay [out]" -vcodec libx264 videoInvideo.mp4 复制代码
上图为显示画中画的最基本方式,如果希望子视频显示在指定位置,例如显示在画面右下角,则需要用到overlay中x坐标与y坐标的内部变量,如同上面图片叠加视频的用法
ffmpeg -re -i out2.mp4 -vf "movie=output.avi,scale = 480*320[test]; [in][test] overlay=x=main_w-500:main_h-500 [out]" -vcodec libx264 videoInvideo.mp4 复制代码
以上两种视频画中画的处理均为静态位置处理,使用overlay还可以配合正则表达式进行跑马灯进行画中画处理
ffmpeg -re -i out2.mp4 -vf "movie=output.avi,scale = 480*320[test]; [in][test] overlay=x='if(gte(t,2),-w+(t-2)*20,NAN)':y=0 [out]" -vcodec libx264 videoInvideo.mp4 图片就不上了,效果为一个视频从左到右缓缓移动 复制代码
3.4 FFmpeg 滤镜图,滤镜链,滤镜之间的关系
滤镜图(filtergraph):跟在 -vf 之后的就是一个滤镜图 滤镜链(filterchain):一个滤镜图包含多个滤镜链 滤镜(filter):一个滤镜链包含多个滤镜 概括来说就是:滤镜 ∈ 滤镜链 ∈ 滤镜图 FFmpeg支持多种滤镜,查看全部滤镜 $ ffmpeg -filters
一个滤镜图的例子如下:
ffmpeg -i out2.mp4 -vf [in]scale=640.0:480.0[wm]; movie='logo.png',scale=92.25:30.0[logo]; [wm][logo]overlay=main_w-overlay_w-24.0:24.0[out] output.mp4 复制代码
在该示例中,有三个滤镜链:
- [in]scale=640.0:480.0[wm]
- movie='logo.png',scale=92.25:30.0[logo]
- [wm][logo]overlay=main_w-overlay_w-24.0:24.0[out] 可以看到,滤镜链是使用分号 ";" 来分隔,滤镜链中的滤镜使用逗号 "," 来分隔;滤镜链没有指定输入或者输出,默认使用前面的滤镜链的输出为输入,并输出给后面的滤镜链作为输入,
简单滤镜和复杂滤镜(Simple filtergraphs 和 Complex filtergraphs)
- Simple filtergraphs(简单滤镜) :该滤镜只有一个输入和一个输出,实际就是添加在解码和编码步骤之间的操作,如下图所示。
简单filtergraphs配置了每个流的筛选器选项(与视频和音频分别-vf和-af别名)。
- Complex filtergraphs(复杂滤镜) :复杂filtergraphs是那些不能被描述为简单的线性处理链的滤镜组。例如,当滤镜组具有多个输入和/或输出,或当输出流的类型是不同于输入。它们可以被表示为以下图:
复杂滤镜图使用
-filter_complex
选项来表示,与-vf
不同在于他有多个输入。该选项是全局的, -lavfi 选项等同于-filter_complex
,一个具体的例子就是,overlay
滤镜,该滤镜有两个视频输入,一个视频输出,输出视频是一个输入视频覆盖在另一个视频之上的结果,音频有同等的amix
滤镜
-map :-vf、-filter_complex合并
有事会遇到有的使用 -vf
,有的又必须使用 -filter_complex
,怎样将这两项整合起来呢,下面有几个示例,总体的思路就是将单输入输出的 -vf
整合到 -filter_complex
中去,这时会用到 第三条中的媒体流选择 -map
示例(该示例我未验证过)
************************* vf 与 filter_complex结合·示例一 ************************** ffmpeg -i input.mp4 -vf "crop='if(gte(iw,ih),ih,iw):if(gte(ih,iw),iw,ih)', scale=720x720" -an -c:v libx264 -profile:v high -level 4.1 -preset superfast -crf 20 output.mp4 ======================================== ffmpeg -i input.mp4 -filter_complex \ "[0:v]trim=0:4.95,setpts=PTS-STARTPTS[v1]; \ [0:v]trim=4.95:6.75,setpts=PTS-STARTPTS[v2]; \ [0:v]trim=6.75:8,setpts=PTS-STARTPTS[v3]; \ [v2]setpts=PTS/0.1[vslow2]; \ [v1][vslow2][v3]concat=n=3:v=1:a=0[out]" \ -map [out] -an -c:v libx264 -profile:v high -level 4.1 \ -preset superfast -crf 20 -r 30 output.mp4 =================合成==================== ffmpeg -i input.mp4 -filter_complex \ "[0:v]crop='if(gte(iw,ih),ih,iw):if(gte(ih,iw),iw,ih)',scale=720x720,split=3[1v][2v][3v]; \ [1v]trim=0:4.95,setpts=PTS-STARTPTS[v1]; \ [2v]trim=4.95:6.75,setpts=(PTS-STARTPTS)/0.1[v2]; \ [3v]trim=6.75:8,setpts=PTS-STARTPTS[v3]; \ [v1][v2][v3]concat=n=3:v=1:a=0[out]" \ -map [out] -an -c:v libx264 -profile:v high -level 4.1 \ -preset superfast -crf 20 -r 30 output.mp4 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 14-《ARKit by Tutorials》读书笔记1:开始入门
- 从零开始-Machine Learning学习笔记(23) - 决策树总结
- GraphQL:从头开始
- 开始编写GO
- [译]后台模式教程:开始
- 【译】如何开始CI
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python科学计算(第2版)
张若愚 / 清华大学出版社 / 2016-4-29 / 118
本书介绍如何用 Python 开发科学计算的应用程序,除了介绍数值计算之外,还着重介绍了如何制作交互式二维、三维图像,如何设计精巧的程序界面,如何与 C 语言编写的高速计算程序结合,如何编写声音、图像处理算法等内容。本书采用 IPython notebook 编写,所有的程序均能在本书提供的运行环境中正常运行,书中所印刷的图表以及程序输出为均为自动运行的结果,保证了书中所有程序的正确性以及可读性。......一起来看看 《Python科学计算(第2版)》 这本书的介绍吧!