filter过滤器是什么牌子_棉芯过滤器

filter过滤器是什么牌子_棉芯过滤器ffmeg过滤器介绍[转]  在ffmpeg中,进行反交错需要用到avfilter,即图像过滤器,ffmpeg中有很多过滤器,很强大,反交错的过滤器是yadif. 基本的过滤器使用流程是:         解码后的画面—>buffer过滤器—->其他过滤器—->buffersink过滤器—>处理完的画面所有的过滤器形成了过滤器链,一定要的两…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

ffmeg过滤器介绍[转]

  在ffmpeg中,进行反交错需要用到avfilter,即图像过滤器,ffmpeg中有很多过滤器,很强大,反交错的过滤器是yadif.

  基本的过滤器使用流程是:

         解码后的画面—>buffer过滤器—->其他过滤器—->buffersink过滤器—>处理完的画面

所有的过滤器形成了过滤器链,一定要的两个过滤器是buffer过滤器和buffersink过滤器,前者的作用是将解码后的画面加载到过滤器链中,后者的作用是将处理好的画面从过滤器链中读取出来.那么进行反交错的过滤器链应该是这样的: buffer过滤器—>yadif过滤器—>buffersink过滤器

    过滤器相关的结构体:

    AVFilterGraph: 管理所有的过滤器图像

    AVFilterContext: 过滤器上下文

    AVFilter: 过滤器

 

下面来看如何创建过滤器链:

    第一步,创建AVFilterGraph

        AVFilterGraph *filter_graph=avfilter_graph_alloc();

    第二步,获取要使用的过滤器:

        AVFilter *filter_buffer=avfilter_get_by_name(“buffer”);

        AVFilter *filter_yadif=avfilter_get_by_name(“yadif”);

        AVFilter *filter_buffersink=avfilter_get_by_name(“buffersink”);

    第三步,创建过滤器上下文,即AVFilterContext:

        int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt,
                                 const char *name, const char *args, void *opaque,
                                 AVFilterGraph *graph_ctx);

    参数说明:filt_ctx用来保存创建好的过滤器上下文,filt是过滤器,name是过滤器名称(在过滤器链中应该唯一),args是传给过滤器的参 数(每个过滤器不同,可以在相应的过滤器代码找到),opaque在代码中没有被使用,graph_ctx是过滤器图像管理指针.例:

        AVFilterContext *filter_buffer_ctx,*filter_yadif_ctx,*filter_buffersink_ctx;

        //创建buffer过滤器

        snprintf(args, sizeof(args),
            “video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d”,
            dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
            dec_ctx->time_base.num, dec_ctx->time_base.den,
            dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
        avfilter_graph_create_filter(&filter_buffer_ctx, avfilter_get_by_name(“buffer”), “in”,
                                       args, NULL, filter_graph);

        //创建yadif过滤器

        avfilter_graph_create_filter(&filter_yadif_ctx, avfilter_get_by_name(“yadif”), “yadif”,
                                   “mode=send_frame:parity=auto:deint=interlaced”, NULL, filter_graph);

        //创建buffersink过滤器

        enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE };

        avfilter_graph_create_filter(&filter_buffersink_ctx, avfilter_get_by_name(“buffersink”), “out”,
                                       NULL, NULL,filter_graph);

        av_opt_set_int_list(filter_buffersink_ctx, “pix_fmts”, pix_fmts,
                              AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN);

    

    第四步,连接过滤器

        avfilter_link(filter_buffer_ctx, 0, filter_yadif_ctx, 0);

        avfilter_link(filter_yadif_ctx, 0, filter_buffersink_ctx, 0);

    第五步,检查所有配置是否正确:

        if ((ret = avfilter_graph_config(player->filter_graph, NULL)) < 0){

            LOGE(0,”avfilter_graph_config:%d\n”,ret);
            goto end;
        }

    注意上面所有的函数都应该检查返回值,这里是略写,到这里如果没出错的话,过滤器链就创建好了.

 

    如何使用过滤器链进行过滤,主要是使用两个函数:

    //将解码后的frame推送给过滤器链

    int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src,
                                 AVFrame *frame, int flags);

    //将处理完的frame拉取出来:

    int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame);
    例如:

    av_buffersrc_add_frame_flags(filter_buffer_ctx, orgin_frame, AV_BUFFERSRC_FLAG_KEEP_REF);

    while(1){

        ret = av_buffersink_get_frame(filter_buffersink_ctx, frame);
        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){

            break;
        }

        display(frame);

    };

 

    反交错前的图像和反交错后的图像对比:

    filter过滤器是什么牌子_棉芯过滤器

    filter过滤器是什么牌子_棉芯过滤器

    虽然比较模糊,但是横纹确实去掉了.

    找了一下,发现ffmpeg中还有一个反交错的过滤器kerndeint,是GPL授权,使用时要配置打开GPL

    传入参数thresh=0:map=0:order=1:sharp=0:twoway=0后,看来起比yadif要好一些,效果如下图:

    filter过滤器是什么牌子_棉芯过滤器

    ffmpeg还有一些deinterlace的过滤器,测试发现在过滤时间和画面质量方面,比较好的是pp/lb过滤器。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189939.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • vue轮播图插件_element ui轮播图

    vue轮播图插件_element ui轮播图vue轮播图插件

  • pyCharm的Qt开发环境搭建「建议收藏」

    pyCharm的Qt开发环境搭建「建议收藏」文章目录缘由流程安装python3安装pyCharmpython版本的选择安装源的设置安装pyqt5配置使用缘由想学一下qt在python下的开发流程,换了好几种开发环境,暂时决定使用pyCharm。然后发现坑很多,需要记录整理一下。这里使用的是win1064位。网上很多人使用docker来配置开发环境,那样子更简单,他们使用大部分使用的是ubuntu的docker。流程安装pyth…

  • Nmap命令扫描详解

    Nmap命令扫描详解在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口,如ADSLModem、集线器、交换机、路由器上用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。由于物理端口和逻辑端口数量较多,为

  • 操作系统实验一:进程管理(含成功运行C语言源代码)[通俗易懂]

    操作系统实验一:进程管理(含成功运行C语言源代码)[通俗易懂]目录操作系统实验一:进程管理实验目的实验内容操作系统实验一:进程管理1.实验目的1.理解进程的概念,明确进程和程序的区别2.理解并发执行的实质3.掌握进程的创建、睡眠、撤销等进程控制方法2.实验内容用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死运行进程等功能。3.实验准备以下将分别介绍①进程的概念,以及进程的各类状态(就绪状态、执行状态、阻塞状态);②进程控制块PCB的作用及内容信息③进程的创建与撤销(????重.

    2022年10月20日
  • 子网掩码,反掩码与通配符之间的区别

    子网掩码,反掩码与通配符之间的区别1:子网掩码与反掩码的区别:反掩码就是通配符掩码通过标记0和1告诉设备应该匹配到哪位copy。由于跟子网掩码刚好相zd反,所以也叫反掩码例如掩码是255.255.255.0wildcard-mask就是0.0.0.255255.255.255.248反掩就是0.0.0.72:通配符掩码,ospf和Acl这儿用通配符掩码也不是每家的交换机都这么做,像cisco3550就是用的子网…

  • SpringBoot的定时任务

    SpringBoot的定时任务SpringBoot的定时任务

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号