×
分享到微信

打开微信,使用扫一扫进入页面后,点击右上角菜单,

点击“发送给朋友”或“分享到朋友圈”完成分享

向FFmpeg中添加filter 专修缝纫机2021-07-27 16:40:08 回复 查看 经验交流 社区交流 干货资源
向FFmpeg中添加filter
分享到:

一、具体步骤

  1. 自己写一个xxx.c文件,如为视频处理则以vf开头,音频处理以af开头,例如vf_scale_mlu.c

  2. libavfilter/allfilters.c添加一行: extern AVFilter ff_vf_scale_mlu

  3. 修改libavfilter/Makefile,添加一行:OBJS-$(CONFIG_TRANSFORM_FILTER) += vf_scale_mlu.o

二、FFmpeg AVFilter简介

    1.相关概念

        AVFilterGraph:代表一个滤镜图,是将所有滤镜串在一起的总和

        Avfilter:代表一个filter

        AVFilterPad:代表一个滤镜的出入口

        AVFilter :连接两个滤镜的连接结构体

    2.AVFilter结构体:定义一个滤镜

        该结构体用于向ffmpeg陈述滤镜的相关信息,结构体通过对名字、pad、class等一系列定义描述了ffmpeg从哪个方法进入我们的滤镜。

      图片.png

    3.AVFilterPad结构体:定义滤镜的输入输出

        用于描述滤镜的输入输出

       图片.png

  • 输入输出pad都可以用的元素
    name pad的名字,所有的输入pad名字不能重复,所有的输出名字不能重复;
    type 此元素目前只能为“AV_PAD_VIDEO”值
    config_props 链接此pad的配置方法的函数指针

  • 仅限输入pad使用的元素:
    min_perms 接受输入需要的最小权限
    rej_perms 不接受的输入权限
    start_ 一帧传入时引用的方法的函数指针
    draw_slice 每个slice已经传入后引用的方法的函数指针
    end_ 一帧完整结束后引用的方法的函数指针
    get_video_buffer 前一个滤镜调用,用以为一个图像请求内存

  • 仅限输出pad使用的元素:
    request_ 请求滤镜输出一帧

   4.AVFilter 结构体:用于定义两个滤镜间的粘连

       通过AVFilter 建立两个结构体间的联系

       其中常用成员为:

  •  AVFilterContext *src :指代所连接的源滤镜

  • AVFilterContext *dst:指代所连接的目标滤镜

  • AVFilterFormats *in_formats:指代源滤镜定义的支持的像素格式

  • AVFilterFormats *out_formats:指代目标滤镜定义的支持的像素格式

  • int format:指代滤镜链上的像素格式

三、实现一个滤镜的细节

  1. 滤镜在执行功能先执行config_props再执行filt_ (先初始化再执行)

  2. 命令行执行时输入的参数由结构体AVClass中的option决定

版权所有 © 2021 寒武纪 Cambricon.com 备案/许可证号:京ICP备17003415号-1
关闭