`

【冬察冬见】FFmpeg系列学习笔记二

 
阅读更多

近期处理视频时需要剪切视频右侧的聊天区,于是对这个场景下的命令进行了深入学习,笔记如下。

FFmpeg filter简介

FFmpeg filter提供了很多音视频特效处理的功能,比如视频缩放、截取、翻转、叠加等。

其中定义了很多的filter,例如以下常用的一些filter。

scale:视频/图像的缩放
overlay:视频/图像的叠加
crop:视频/图像的裁剪
trim:截取视频的片段
rotate:以任意角度旋转视频
支持的filter的列表可以通过以下命令获得。

ffmpeg -filters

以下是filter的一个简单的应用示例,对视频的宽和高减半。
ffmpeg -i input -vf scale=iw/2:ih/2 output

filter的使用方法

学习filter的使用,先需要了解一下filter的语法。
FFmpeg中filter包含三个层次,filter->filterchain->filtergraph。

说明:

第一层是 filter 的语法。
第二层是 filterchain的语法。
第三层是 filtergraph的语法。
filtergraph可以用文本形式表示,可以作为ffmpeg中的-filter/-vf/-af和-filter_complex选项以及ffplay中的-vf/-af和libavfilter/avfilter.h中定义的avfilter_graph_parse_ptr()函数的参数。

filter的语法

用一个字符串描述filter的组成,形式如下

[in_link_1]…[in_link_N]filter_name=parameters[out_link_1]…[out_link_M]

参数说明:

[in_link_N]、[out_link_N]:用来标识输入和输出的标签。in_link_N是标签名,标签名可以任意命名,需使用方括号括起来。在filter_name的前面的标签用于标识输入,在filter_name后面的用于标识输出。一个filter可以有多个输入和多个输出,没有输入的filter称为source filter,没有输出的filter称为sink filter。对输入或输出打标签是可选的,打上标签是为了连接其他filter时使用。
filter_name:filter的名称。
“=parameters”:包含初始化filter的参数,是可选的。
“=parameters”有以下几种形式

使用’:‘字符分隔的一个“键=值”对列表。如下所示。
ffmpeg -i input -vf scale=w=iw/2:h=ih/2 output
使用’:‘字符分割的“值”的列表。在这种情况下,键按照声明的顺序被假定为选项名。例如,scale filter的前两个选项分别是w和h,当参数列表为“iw/2:ih/2”时,iw/2的值赋给w,ih/2的值赋给h。如下所示。
ffmpeg -i input -vf scale=iw/2:ih/2 output
使用’:’ 字符分隔混合“值”和“键=值”对的列表。“值”必须位于“键=值”对之前,并遵循与前一点相同的约束顺序。之后的“键=值”对的顺序不受约束。如下所示。
ffmpeg -i input -vf scale=iw/2:h=ih/2 output
filter类定义了filter的特性以及输入和输出的数量,某个filter的使用方式可以通过以下命令获知。

ffmpeg -h filter=filter_name

filterchain的语法

用一个字符串描述filterchain的组成,形式如下

“filter1, filter2, … filterN-1, filterN”
说明:

由一个或多个filter的连接而成,filter之间以逗号“,”分隔。
每个filter都连接到序列中的前一个filter,即前一个filter的输出是后一个filter的输入。
比如示例

ffmpeg -i INPUT -vf “split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2” OUTPUT
示例说明:

crop、vflip在同一个filterchain中,

filtergraph的语法

用一个字符串描述filtergraph的组成,形式如下
“filterchain1;filterchain2;…filterchainN-1;fiterchainN”
说明:

由一个或多个filter的组合而成,filterchain之间用分号";"分隔。
filtergraph是连接filter的有向图。它可以包含循环,一对filter之间可以有多个连接。
当在filtergraph中找到两个相同名称的标签时,将创建相应输入和输出之间的连接。
如果输出没有被打标签,则默认将其连接到filterchain中下一个filter的第一个未打标签的输入。例如以下filterchain中。
nullsrc, split[L1], [L2]overlay, nullsink
说明:split filter有两个输出,overlay filter有两个输入。split的第一个输出标记为“L1”,overlay的第一个输入pad标记为“L2”。split的第二个输出将连接到overlay的第二个输入。

在一个filter描述中,如果没有指定第一个filter的输入标签,则假定为“In”。如果没有指定最后一个filter的输出标签,则假定为“out”。
在一个完整的filterchain中,所有没有打标签的filter输入和输出必须是连接的。如果所有filterchain的所有filter输入和输出pad都是连接的,则认为filtergraph是有效的[2]。
比如示例

ffmpeg -i INPUT -vf “split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2” OUTPUT
其中有三个filterchain, 分别是:

“split [main][tmp]”。它只有一个filter,即 split,它有一个默认的输入,即INPUT解码后的frame。有两个输出, 以 [main], [tmp] 标识。
“[tmp] crop=iw:ih/2:0:0, vflip [flip]”。它由两个filter组成,crop和vflip,crop的输入 为[tmp],vflip的输出标识为[flip]。
“[main][flip] overlay=0:H/2”。它由一个filter组成,即overlay。有两个输入,[main]和[flip]。有一个默认的输出。

视频的画面大小的剪切(crop filter)

将输入的视频的帧,以左上角为坐标的原点,剪切成x,y坐标开始的指定大小。
语法:

[]包裹的选项是可选的

crop= ow[:oh[:x[:y[:keep_aspect]]]]
​#example
​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
简单的解释:

x,y :是偏移量。
ow,oh :是输出的宽和高。
iw ih :还可以使用来表示输入的宽和高
a: 表示比例 ,和 iw/ih 一样
如果想从中间开始剪切,命令就编程了

ffmpeg -i input_file -vf crop=w:h output_file
视频的Padding(应该是增加内边距)(pad filter)

给视频添加一个内边距。通常是视频需要在不同显示比例的画面中显示时,需要的命令。
语法:

#[]中的同样是可选的#坐标系与之前相同pad=width[:height[:x[:y[:color]]]]​
#example
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink frame_photo.jpg

进一步举例:
ffmpeg -i C:\files\11.mp4 -vf crop=iw/2:ih/2 C:\files\111.mp4
将视频中间区域截取

ffmpeg -i C:\files\11.mp4 -vf crop=iw/5*4:ih:0:0 C:\files\112.mp4
将视频右侧20%部分处理掉

更常用的是将4:3的画面转换成16:9

如果不给color的话。默认将会是黑色的背景

将画面从4:3 切换成16:9

ffmpeg -i input -vf pad=ih*16/9:ih:(ow-iw)/2:0:color output

16:9 转换成 4:3

ffmpeg -i input -vf pad=iw:iw*3/4:0:(oh-ih)/2:color output
其实标准的公式如下

ar是画面的比例。如果是增加画面的宽度,则是

ffmpeg -i input -vf pad=ih*ar:ih:(ow-iw)/2:0:color output

如果是增加画面的高度,则是

ffmpeg -i input -vf pad=iw:iw*ar:0:(oh-ih)/2:color output
翻转和旋转视频(flip filter)

对视频进行翻转和旋转
语法:

#水平翻转(Horizontal flip)
-vf hfilp
#竖直翻转(Vertical flip)
-vf vfilp

旋转

#0 - 逆时针旋转+竖直翻转
#1- 顺时针旋转 90
#2- 逆时针旋转 90
#3- 顺时针旋转90 + 竖直的翻转
transpose={0,1,2,3}
模糊、锐化和其他添加噪点的滤镜

模糊滤镜

boxblur
语法:

r=radius p=powerboxblur=luma_r:luma_p[:chroma_r:chroma_p[:alpha_r:alpha_p]]

#example
ffmpeg -i input.mpg -vf boxblur = 1.5:1 output.mp4
smartblur
#t = threashold
smartblur = luma_r:luma_s:luma_t[:chroma_r:chroma_s:chroma_t]
#example
ffmpeg -i halftone.jpg -vf smartblur= 5:0.8:0 blurred_halftone.png

锐化

滤镜的名称竟然是 unsharp

语法:

l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
#all parameters are optional, if not set, the default is 5:5:1.0:5:5:0.0
默认的明亮度矩阵是5x5 而明亮度(luma)的效果强度是1.0.如果想创造高斯模糊的效果的话,可以使用一个负数的明亮度或者是浓度(chroma)

#高斯模糊的效果
ffmpeg -i input -vf unsharp= 6:6:-2 output.mp4

覆盖(Overlay)

可以实现画中画的功能。这里只是简单的覆盖的实例,更加复杂的例子需要在后面的进阶单元里看到。
语法:

overlay[=x:y[[:rgb={0,1}]]

x,y是可选的。默认参数是0 # rgb 也是可选的。它的值是 0或者1

命令行的构成

ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output
这里需要注意是的 filter_complex 来替代-vf,因为有两个输入源。但是如果使用flitergraph和 link labels.这样我们就可以使用 movie 视频源,囊括第二输入和使用-vf

使用 movie 和 -vf

ffmpeg -i input1 -vf movie=input2[logo];[in][logo] overlay=x:y output​#Logo in top-left corner
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

添加文字到视频上

video filter:drawtext
语法:

drawtext=fontfile = font_f:text=text1[:p3=v3[:p3=v4[…]]]​
#最简单的example就是。 此时需要注意的是,这个字体文件必须在当前目录下
ffmpeg -i input -vf drawtext=fontfile=arial.ttf:text=Welcome output
混音

amerge

ffmpeg -y -i video_bgm.mp4 -i src2.aac -filter_complex [0:a][1:a]amerge=inputs=2[a] -map 0:v -map [a] -c:v copy -c:a aac -ac 2 -shortest after_compose3.mp4
amix

ffmpeg -i test.aac -i test.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 mix.aac

参数

-shortest 取最短的时长

-shortest : duration = MIN(inputs)
实例:
ffmpeg -i test.mp4 -i test.mp3 -vcodec copy -acodec aac -map 0✌️0 -map 1

分享到:
评论

相关推荐

    ffmpeg 学习 笔记 文档 杂记

    ffmpeg学习笔记文档

    ffmpeg学习的笔记

    二、FFmpeg命令行使用 1. 转换格式:`ffmpeg -i input.mp4 output.webm`,此命令将MP4文件转换为WebM格式。 2. 裁剪与缩放:`ffmpeg -i input.mp4 -vf "crop=w:h:x:y, scale=width:height" output.mp4`,裁剪视频...

    ffmpeg多媒体框架的学习笔记与实践指南

    内容概要:本文是一份关于 ffmpeg 的学习笔记汇编,涵盖了 ffmpeg 命令使用指南、编译方法及其遇到问题的解决办法,以及实际运用 ffmpeg API 开展的具体操作,例如视频压制、解码和音频处理等等。深入研究了 ffmpeg ...

    ffmpeg学习资料合集

    在“ffmpeg学习资料合集”中,你可以找到一系列资源,帮助你从入门到精通地掌握 FFmpeg。这些资料可能包括: 1. **基础概念**:了解 FFmpeg 的基本架构和工作原理,例如其组件(如 libavcodec、libavformat 和 ...

    ffmpeg入门学习1

    1. **FFmpeg命令行工具**:FFmpeg 提供了一系列命令行工具,如`ffmpeg`、`ffprobe`和`ffplay`。其中,`ffmpeg`是主要的转换工具,可以用来转换、裁剪、合并视频;`ffprobe`用于分析多媒体文件的元数据;`ffplay`则是...

    ffmpeg最新版本学习笔记(解码h264为例, 代码在VS2010编译通过)

    ffmpeg最新版本学习笔记(解码h264为例, 代码在VS2010编译通过) 由于其他原因不能直接传工程,只能将工程中的源码提出来加上注释,写成文档上传,ffmpeg版本为2013.10.28号版,长期学习,欢迎一起交流

    QT学习笔记-初识FFmpeg

    ### QT学习笔记-初识FFmpeg #### 一、FFmpeg简介 ##### 1.1 什么是FFmpeg FFmpeg是一套开源的计算机程序,它主要用于记录、转换数字音频、视频,并能将其转化为流的形式。FFmpeg采用了LGPL或GPL许可证,这使得它...

    ffmpeg学习资料

    这个"ffmpeg学习资料"压缩包包含了一系列与FFmpeg相关的文档,可以帮助我们深入理解并掌握FFmpeg的使用和开发。 1. **FFmpeg SDK 开发手册**: FFmpeg SDK(Software Development Kit)提供了开发者需要的库、...

    FFmpeg 命令学习文档

    FFmpeg是一个非常强大的音视频处理框架,它允许用户通过命令行的方式对各种音视频文件进行转码、转封装、添加滤镜以及调整音视频参数等操作。该文档主要面向初学者,旨在帮助他们理解和使用FFmpeg的一些基础命令。 ...

    ffmpeg学习笔记2 编译x265(Win10+android-ndk-r22)生成的arm64-v8a动、静态库

    ffmpeg学习笔记2 编译x265(Win10+android-ndk-r22)生成的arm64-v8a动、静态库 https://blog.csdn.net/aggs1990/article/details/124576351 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者...

    手把手教你学习ffmpeg

    FFMPEG 学习真是一件头大的事,首先 FFMPEG 就够大了,没想到它还需要很多外部库提供相关功能,比如 H264 编码需要 x264 库, MP3...下一些学习笔记,一是自己备忘,二是让后来人少走些弯路。以上纯属发牢骚(遭了太多罪,呵呵)

    node ffmpeg jsmpeg 拉流 展示笔记

    在本篇笔记中,我们将探讨如何使用Node.js、FFmpeg和JSMPEG库来实现视频流的拉取和展示。FFmpeg是一款强大的音视频处理工具,而JSMPEG则是一个轻量级的JavaScript库,用于在浏览器中解码和播放MPEG1视频流。 首先,...

    FFMPEG完美入门资料_ffmpeg_

    FFmpeg主要包括四个部分:ffprobe用于分析多媒体文件,ffmpeg用于转换多媒体文件,ffplay用于播放多媒体文件,以及libav*系列库,如libavcodec(编码解码库)、libavformat(容器格式库)和libavfilter(滤镜库)等...

    FFmpeg学习资料

    5. **添加水印**:`ffmpeg -i input.mp4 -vf "drawtext=fontfile=Arial.ttf:text='Sample Watermark':x=(w-tw)/2:y=h-(lh/2):fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5" output.mp4`,在...

    ffmpeg学习笔记4 编译libmp3lame(Win10+android-ndk-r22)生成的arm64-v8a静态库

    ffmpeg学习笔记4 编译libmp3lame(Win10+android-ndk-r22)生成的arm64-v8a静态库 https://blog.csdn.net/aggs1990/article/details/124577449 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者...

    ffmpeg学习资料.rar

    FFmpeg 是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用 LGPL 或 GPL 许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方 案。它包含了非常先进的音频/视频编解码库 ...

    ffmpeg学习笔记1 编译x264(Win10+android-ndk-r22)生成的arm64-v8a动、静态库

    ffmpeg学习笔记1 编译x264(Win10+android-ndk-r22)生成的arm64-v8a动、静态库 https://blog.csdn.net/aggs1990/article/details/124575758 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者...

    ffmpeg-学习资料源代码

    在“ffmpeg-学习资料源代码”这个压缩包中,包含了丰富的学习资源,如播放器和服务器等,这些都是FFmpeg应用实例的绝佳参考资料。 FFmpeg 的核心功能包括: 1. **编码**:它支持多种音频和视频编码格式,例如 H.264...

    ffmpeg学习笔记3 编译fdk-aac(Win10+android-ndk-r22)生成的arm64-v8a动、静态库

    ffmpeg学习笔记3 编译fdk-aac(Win10+android-ndk-r22)生成的arm64-v8a动、静态库 https://blog.csdn.net/aggs1990/article/details/124577004 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者...

    FFmpeg 从入门到精通

    2. 了解 FFmpeg 的基本信息:读者需要了解 FFmpeg 的基本信息,包括 FFmpeg 的架构、配置文件等。 3. 使用 FFmpeg 命令行工具:FFmpeg 提供了命令行工具,读者可以使用这些工具来处理音视频文件。 4. 使用 FFmpeg 的...

Global site tag (gtag.js) - Google Analytics