首页 > 其他分享 >FFmpeg的split滤镜介绍

FFmpeg的split滤镜介绍

时间:2023-02-20 12:38:11浏览次数:57  
标签:FFmpeg frame avfilter 滤镜 实例 link split

本文介绍 split 滤镜的用法以及 ​​avfilter_link​​ 函数 的具体用法。

本文的代码下载地址:​​GitHub​​,编译环境是 Qt 5.15.2 跟 MSVC2019_64bit 。


上下文 这个词读起来不太通顺,​​context​​ 这个单词我后面把它翻译成实例吧,滤镜实例。


之前在 scale-1 项目留了一个问题,就是 ​​avfilter_link​​ 函数 的第二第四个参数的作用是什么。 ​​avfilter_link​​ 函数 的定义如下:

int avfilter_link(AVFilterContext *src, unsigned srcpad,
AVFilterContext *dst, unsigned dstpad)

为什么会有这两个参数 ​​srcpad​​ 跟 ​​dstpad​​,这是因为 FFmpeg 的滤镜是有很多种类型,各种各样。

例如之前的 scale 滤镜,只接受1个输入流,然后输出1个流。

但是 split 滤镜可以接受1个输入流,然后输出2个或者多个流。

而 overlay 滤镜可以接受2个输入流,但是只输出1个流。

因此 ​​srcpad​​ 参数是用来定位 滤镜实例 里面的第几个输出流,而 ​​dstpad​​ 参数是用来定位 滤镜实例 里面的第几个输入流。


下面就用 split-1 项目里面的代码来理解 ​​srcpad​​ 跟 ​​dstpad​​ 参数的作用。

FFmpeg的split滤镜介绍_滤镜

split 滤镜的参数是 ​​outputs=2​​ ,代表分出 两个流,你也可以把这个数字改大,分出多个流。

滤镜实例 创建之后,里面的 ​​nb_inputs​​ 跟 ​​nb_ouputs​​ 字段 就表明了这个 滤镜实例 有多少个输入,有多少个输出,下图是 split 滤镜实例的截图:

FFmpeg的split滤镜介绍_滤镜_02


接着讲解一下如何连接 ​​split​​ 滤镜实例 里面的输入跟输出。代码如下:

FFmpeg的split滤镜介绍_滤镜_03

由于 ​​split​​ 分出来两个流,只能用 接受两个流 ​​overlay​​ 滤镜来接收,中间使用了 ​​scale​​ 滤镜来进行缩放。

​overlay​​ 滤镜的规则是把第二个输入流覆盖到第一个输入流上面。可以通过 参数设置覆盖的位置。因此第二个流最好比第一个流画面要小。

因此 split-1 项目里面滤镜实例之间的连接过程图如下:

FFmpeg的split滤镜介绍_滤镜_04


从 split-1 项目的代码可以看出,这种一个一个滤镜实例创建,然后 ​​avfilter_link​​ 链接起来的操作非常繁琐。

下面演示一下,之前那种最简单的滤镜函数用法,就是 写好字符串的滤镜连接规则,然后丢进去 ​​avfilter_graph_parse2​​ 函数。

代码在 split-simple 项目,代码如下:

av_bprintf(&args,
"buffer=video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d:frame_rate=%d/%d[main];"
"[main]split[v0][v1];"
"[v0]scale=%d:%d[v2];"
"[v1][v2]overlay=%d:%d[result];"
"[result]buffersink",
frame->width, frame->height, frame->format, tb.num,tb.den,sar.num, sar.den,fr.num, fr.den,
frame->width/4, frame->height/4,
frame->width/4*3, frame->height/4*3);

FFmpeg的split滤镜介绍_滤镜_05


上面的代码,​​/4*3​​ 为了把缩略图覆盖在右下角,生成的图片如下:

FFmpeg的split滤镜介绍_滤镜_06

因此,用字符串来配置滤镜规则,来调滤镜函数是最简单的,没有之一。这样根本不需要用到 ​​AVFilterInOut​​ 或者 ​​avfilter_link​​ 函数连来连去。


标签:FFmpeg,frame,avfilter,滤镜,实例,link,split
From: https://blog.51cto.com/u_15655186/6068276

相关文章

  • java如何用split()分割字符串
    String.split()分割字符串的总结:1.字符"|","*","+"都得加上转义字符,前面加上"\\"。2.而如果是"\",那么就得写成"\\\\"。3.如果一个字符串中有多个分隔符,可以用"|"作为连字......
  • FFmpeg滤镜API
    FFmpeg采用了FilterGraph的模型来管理整个数据流的处理,参与数据处理的各个功能模块叫做Filter(滤镜)。普通的用户在使用音视频剪辑软件的时候,会把滤镜这个词理解为app......
  • FFmpeg的scale滤镜介绍
    FFmpeg的滤镜API其实有3种调用方法,我个人觉得他是3种用法,如下:1,用 ​​avfilter_graph_create_filter​​ 一个一个地创建滤镜(​​AVFilterContext​​),然后用 ​​......
  • cf round #849 D. Distinct Split
    Let'sdenotethef(x)functionforastringxasthenumberofdistinctcharactersthatthestringcontains.Forexamplef(abc)=3,f(bbbbb)=1,andf(babacaba)=3.......
  • 调用自定义的SplitString函数对字符串进行分割
    voidSplitString(conststd::string&s,std::vector<std::string>&v,conststd::string&c){ std::string::size_typepos1,pos2; pos2=s.find(c); pos1=0; while......
  • FFmpeg:搭建rstp/rtmp/HLS服务器(测试推流)
    在日常开发中,有些时候需要做一些推拉流测试,但又找不到可以测试的拉流地址,这个时候,可以使用rtsp-simple-server来搭建rtsp/rtmp/HLS服务器。1.服务器搭建rstp-simple-ser......
  • captura怎样解决FFmpeg解析错误问题
     captura怎样解决FFmpeg解析错误问题?captura软件里大家在进行屏幕录制的工作得时候都会用到captura软件,软件得功能可以满足大家的需求,可以轻松的录制屏幕,进行屏幕截屏等......
  • H.264:FFMpeg 实现简单的播放器
    FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手。我刚接触FFMPEG的时候也感觉不知从何学起。因此我把自己做项目过程中实现的一个非......
  • 关于 EF Core 使用 SplitQuery 后由于不稳定排序字段对子表查询结果的影响
    引子假设在博客系统中的表设计为:classDiagramclassBlog{+StringId+StringName+DateTimeCreateTime+intOrder+List<Post>......
  • Go-31 Go中字符串切割的三种方法 strings.Index()、strings.Cut()、strings.Split()
    packagemainimport( "fmt" "strings")/* 字符串切割 strings包对字符串的操作 */funcmain(){ //方法一 addr:="192.168.0.1:80" pos:=strings.Index(ad......