当前位置: 首页 > news >正文

ffmpeg filter的理解

ffmpeg filter的理解


filter的简介

从整体看,filte rgraph包含filter chain,而filter chain又包含了filter,所以可以分为是三个层次去理解。

  • filter
  • filter chain
  • filter graph

filter graph是链接多个filter的有向图。它可以包含循环,各个Filter之间也可以有多个链接。每个链接有一个input pad连接到一个filter并从那里获取输入,有一个output pad连接到另一个filter提供输出。所有的Filter都是已经注册在程序中的。没有输入的filter叫source,没有输出的filter叫sink。

每个Filtergraph都有对应的结构化的文本表示:

  • 对于命令ffmpeg来说有-filter, -vf, -affilter_complex这些选项
  • 对于命令ffplay来说有-vf, -af这些选项

filter chain:是由一个或多个filter线性连接而成,filter之间使用逗号,来分隔

filter graph:是由一个或多个filter chain组成,filter chain之间使用分号;来分隔


filter的语法

filter的语法格式为:

[in_link_1]...[in_link_N]filter_name@id=arguments[out_link_1]...[out_link_M]
  • filter_name就是你所要使用的filter的名称
  • 后面的@id是可选的(基本没用到)
  • Filter的名称和参数前后是允许放置一个或多个链接标签(link label: 别名
    • 放在前面的链接标签in_link_1in_link_N被关联到Filter的input pad
    • 后面的out_link_1out_link_M被关联到Filter的output pad
    • 如果一个filter的output pad没被标记链接标签,则它会被默认链接到后续的filter中第一个未标记链接标签的input pad
  • =arguments也是可选填的(有些filter并不需要参数)
    • arguments通常有如下格式:
      • :来分隔一系列值
      • :来分隔一系列的key=value的键值对
      • :来分隔一系列值,之后跟着一系列的key=value的键值对,值必须在键值对前面
      • 有时候value本身就是要填一系列参数值的,那么需要用|来拼接
  • 对于一个完整可用的filter chain来说,所有匿名的链接标签必须有被链接。
  • 在处理filter graph过程中当遇到有格式转换的时候会自动插入scale这个filter,所以在filter graph描述中的可能会隐式包含scale的地方前面,需要加上要指定的缩放参数:sws_flags=flags

如:

nullsrc, split[L1], [L2]overlay, nullsink

从所有filter里面找到nullsink:

ffmpeg -filters | grep nullsink

列出split的说明:

$ ffmpeg -h filter=split
Filter splitPass on the input to N video outputs.Inputs:#0: default (video)Outputs:dynamic (depending on the options)
split AVOptions:outputs           <int>        ..FVA...... set number of outputs (from 1 to INT_MAX) (default 2)

ffmpeg的命令行输出比较有限,了解filter怎么用,还是得从官网的文档里面学习:
比如,split的用法:

  • Create two separate outputs from the same input:
[in] split [out0][out1]
  • To create 3 or more outputs, you need to specify the number of outputs, like in:
[in] asplit=3 [out0][out1][out2]

视频合并淡入淡出效果


ffmpeg -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 \
-filter_complex "\
[0:v]setpts=PTS-STARTPTS[v1]; \
[1:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(4/TB)[v2];
[2:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(8/TB)[v3];
[3:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(12/TB)[v4];
[4:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(16/TB)[v5];
[v1][v2]overlay[v12];
[v12][v3]overlay[v123];
[v123][v4]overlay[v1234];
[v1234][v5]overlay,format=yuv420p[v]" \
-map [v] result.mp4

加上audio,并且使用acrossfade:

ffmpeg -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 \
-filter_complex "\
[0:v]setpts=PTS-STARTPTS[v1]; \
[1:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(4/TB)[v2];
[2:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(8/TB)[v3];
[3:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(12/TB)[v4];
[4:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(16/TB)[v5];
[v1][v2]overlay[v12];
[v12][v3]overlay[v123];
[v123][v4]overlay[v1234];
[v1234][v5]overlay,format=yuv420p[v]; \
[1][2]acrossfade=d=1[a12];
[a12][3]acrossfade=d=1[a123];
[a123][4]acrossfade=d=1[a]" \
-map [v] -map [a] result.mp4

这里的audio直接用[1],[2],[3],[4]表示,为了更直观点,应该写成:

ffmpeg -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 -i dog3.mp4 \
-filter_complex "\
[0:v]setpts=PTS-STARTPTS[v1]; \
[1:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(4/TB)[v2];
[2:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(8/TB)[v3];
[3:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(12/TB)[v4];
[4:v]format=yuva420p,fade=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+(16/TB)[v5];
[v1][v2]overlay[v12];
[v12][v3]overlay[v123];
[v123][v4]overlay[v1234];
[v1234][v5]overlay,format=yuv420p[v]; \
[1:a][2:a]acrossfade=d=1[a12];
[a12][3:a]acrossfade=d=1[a123];
[a123][4:a]acrossfade=d=1[a]" \
-map [v] -map [a] result.mp4

前面的命令[0][1]直接写意思是input 0, input 1

[0:v] input 0 video stream
[0:a] input 0 audio stream

注意,在前面的filter_complex的最后一个标签后不能跟分号,跟了分号就报错,因为分号以为这后面还有filter chain,但是后面却是空的:

[AVFilterGraph @ 0x55a826aa5a60] No such filter: ''
Error initializing complex filters.
Invalid argument

FFmpeg Filters翻译文档
FFmpeg filter简介

http://www.lryc.cn/news/9061.html

相关文章:

  • 炔活化的生物素化试剂773888-45-2,Alkyne-Biotin,炔基生物素
  • 了解僵尸网络攻击:什么是僵尸网络,它如何传播恶意软件以及如何保护自己?
  • 大学生博主-14天学习挑战赛活动-CSDN
  • 如何自学芯片设计?
  • 通过中断控制KUKA机器人暂停与再启动的具体方法示例
  • pandas基本操作
  • 论文笔记NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
  • 花3个月面过京东测开岗,拿个20K不过分吧?
  • Leetcode DAY 35:柠檬水找零and根据身高重建队列 and用最少数量的箭引爆气球
  • java-spring_bean实例化
  • 微信中如何接入机器人才比较安全(不会收到警告或者f号)之第三步正式接入
  • 高通平台开发系列讲解(Sensor篇)IAM20680驱动程序的使用
  • 【VictoriaMetrics】VictoriaMetrics集群伪分布式部署(二进制版)
  • 华为手表开发:WATCH 3 Pro(7)获取电量信息
  • 【数据结构】动态顺序表的接口实现(附图解和源码)
  • L2-003 月饼
  • volatile不等于原子操作
  • 每天10个前端小知识 【Day 15】
  • 异构数据库同步方案
  • MySQL-系统信息函数
  • Windows环境下使用Pycharm运行sh文件
  • Flutter启动流程浅析
  • 004:NumPy的应⽤-2
  • 一文了解JAVA中同步、异步、阻塞和非阻塞
  • 查询股票交易日接口可以用C++实现查询当日成交吗?
  • java中常见的json库以及对应的用法
  • 德赛西威NAV75*-SV731*导航升级(凯立德J30)实战
  • [USACO2023-JAN-Bronze] T1 LEADERS 题解
  • 第二章:unity性能优化之drawcall优化-1
  • 【2341. 数组能形成多少数对】