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

【FFMPEG】AVFilter使用流程

流程图

在这里插入图片描述
核心类

AVFilterGraph ⽤于统合这整个滤波过程的结构体

AVFilter 滤波器,滤波器的实现是通过AVFilter以及位于其下的结构体/函数来维护的

AVFilterContext ⼀个滤波器实例,即使是同⼀个滤波器,但是在进⾏实际的滤波时,也会由于输⼊的参数不同⽽有不同的滤波效果,AVFilterContext就是在实际进⾏滤波时⽤于维护滤波相关信息的实体

AVFilterLink 滤波器链,作⽤主要是⽤于连接相邻的两个AVFilterContext。为了实现⼀个滤波过程,可能会需要多个滤波器协同完成,即⼀个滤波器的输出可能会是另⼀个滤波器的输⼊,AVFilterLink的作⽤是串联两个相邻的滤波器实例,形成两个滤波器之间的通道

AVFilterPad 滤波器的输⼊输出端⼝,⼀个滤波器可以有多个输⼊以及多个输出端⼝,相邻滤波器之间是通过AVFilterLink来串联的,⽽位于AVFilterLink两端的分别就是前⼀个滤波器的输出端⼝以及后⼀个滤波器的输⼊端⼝

buffersrc ⼀个特殊的滤波器,这个滤波器的作⽤就是充当整个滤波过程的⼊⼝,通过调⽤该滤波器提供的函数(如av_buffersrc_add_frame)可以把需要滤波的帧传输进⼊滤波过程。在创建该滤波器实例的时候需要提供⼀些关于所输⼊的帧的格式的必要参数(如:time_base、图像的宽⾼、图像像素格式等)

buffersink ⼀个特殊的滤波器,这个滤波器的作⽤就是充当整个滤波过程的出⼝,通过调⽤该滤波器提供的函数(如av_buffersink_get_frame)可以提取出被滤波过程滤波完成后的帧

代码流程

//创建滤波器const AVFilter *buffersrc = avfilter_get_by_name("buffer");const AVFilter *buffersink = avfilter_get_by_name("buffersink");const AVFilter *myfilter = avfilter_get_by_name("myfilter");//创建滤波图filter_graph = avfilter_graph_alloc();//创建⽤于维护滤波器的管理类AVFilterContext *in_video_filter = NULL;AVFilterContext *out_video_filter = NULL;AVFilterContext *my_video_filter = NULL;avfilter_graph_create_filter(&in_video_filter, buffersrc, "in", args, NULL, filter_graph);avfilter_graph_create_filter(&out_video_filter, buffersink, "out", NULL, NULL, filter_graph);avfilter_graph_create_filter(&my_video_filter, myfilter, "myfilter", NULL, NULL, filter_graph);//通过AVFilterLink连接滤波器avfilter_link(in_video_filter, 0, my_video_filter, 0);avfilter_link(my_video_filter, 0, out_video_filter, 0);//提交滤波图avfilter_graph_config(filter_graph, NULL);
http://www.lryc.cn/news/94639.html

相关文章:

  • 爬虫入门06——了解cookie和session
  • Ubuntu 的移动梦醒了
  • RabbitMQ的集群
  • 超长上下文处理:基于Transformer上下文处理常见方法梳理
  • ChatGPT爆火 但生成式AI并非全新产物
  • 深度学习循环神经网络
  • 如何规范的设计数据库表
  • 【CSS】跳动文字
  • arm海思启动udev的错误
  • 网络协议与攻击模拟-15-DNS协议
  • ChatGPT将改变教育,而不是摧毁它
  • springboot在线考试
  • C国演义 [第三章]
  • 数字化时代,企业的数据指标体系
  • 三分钟了解 RocketMQ消息队列
  • golang redis第三方库github.com/go-redis/redis/v8实践
  • 校园网WiFi IPv6免流上网
  • java 阿里云直播配置及推拉流地址获取
  • PostgreSql 限制
  • 2023年java还是golang还是c#?
  • 微服务、SpringBoot、SpringCloud 三者的区别
  • 2023-07-10 cmake管理的项目中使用vcpkg管理第三方库
  • 【剑指offer】学习计划day3
  • QT DAY1
  • Mybatis-puls——条件查询的三种格式+条件查询null判定+查询投影
  • 网络安全(黑客)自学
  • 通过一个实际例子说明Django中的数据库操作方法OneToOneField()的用法【数据表“一对一”关系】
  • HarmonyOS学习路之开发篇—数据管理(对象关系映射数据库)
  • 实验:验证TCP套接字传输的数据不存在数据边界
  • 【网络】协议的定制与Json序列化和反序列化