ffmeg使用yadif做反交错

昨天发现播放TS流时有横纹,查资料找到原因是解码出来的画面是用于隔行扫描显示的画面,需要进行反交错处理成逐行扫描显示画面.

在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);

};

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

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

时间: 2024-08-03 08:17:29

ffmeg使用yadif做反交错的相关文章

使用nginx做反代时遇到413 Request Entity Too Large的解决方法

在使用nginx做反向代理的时候,被反代的系统在上传文件的时候遇到413 错误 :Request Entity Too Large 原因是nginx限制了上传文件的大小,在nginx中可以配置最大允许的文件大小: 打开nginx主配置文件nginx.conf,找到http{},添加client_max_body_size 50m; 这里设置成了最大50m,你可以根据自己系统的需求自己来进行设置 

海美迪Q5/亿格瑞A5/ZIDOO X9S三款入门级4K播放器评测 ,那个好?

海美迪Q5/亿格瑞A5/ZIDOO x9s三款入门级4K播放器评测三个盒子都是自购的,遵循不公正不客观.想吹哪个吹哪个,想黑哪个黑哪个的原则.因为是边测边写,格式可能不工整,可阅读性可能没那么好.喜欢的就将就着看看把!首先给三个盒子来个特写:<ignore_js_op> 3个4K播放机都是基于目前最新固件.Q5四代机2.0.7,A5 1.2.8.2,X9S 2.0.13 2个4K电视也来张特写:左为558500C,右为55X9300E<ignore_js_op> 所有图片都是手机自

Android--使用开源vitamio做万能视频播放器

Vitamio 是什么? Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染.Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐.到目前,全球已经有超过 一万 种应用在使用 Vitamio,覆盖用户超过 5亿 . Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 与 iOS 上跨平台支持 MMS, RTSP, RTMP,

ffmeg过滤器介绍[转]

在ffmpeg中,进行反交错需要用到avfilter,即图像过滤器,ffmpeg中有很多过滤器,很强大,反交错的过滤器是yadif. 基本的过滤器使用流程是: 解码后的画面--->buffer过滤器---->其他过滤器---->buffersink过滤器--->处理完的画面 所有的过滤器形成了过滤器链,一定要的两个过滤器是buffer过滤器和buffersink过滤器,前者的作用是将解码后的画面加载到过滤器链中,后者的作用是将处理好的画面从过滤器链中读取出来.那么进行反交错的过滤器

播放图像有锯齿_反隔行操作

摄像机按图像扫描方式可分为隔行扫描像机和逐行扫描像机,常用的是隔行扫描像机.隔行扫描像机拍摄的每帧图像分为顶场和底场,图像中的奇数行为顶场,图像中的偶数行为底场.隔行扫描摄像机在拍摄图像时先拍摄顶场然后拍摄底场,当摄像机以每秒25帧的速率拍摄图像时,顶场和底场之间的拍摄时间差为20毫秒,这20毫秒的时间差使运动物体在顶场和底场中有了位置差异.监视器等隔行显示设备是按场播放图像,因此不会有问题,但电脑等逐行显示设备是按帧显示图像的,此时图像中的运动物体会有锯齿效果产生,如图一所示.总之,这类现象是

实战nginx前端反代mogfilefs及负载均衡

实战nginx前端反代mogfilefs及负载均衡 =============================================================================== 实验描述: 使用Nginx代理请求至tackers,实现通过键就可以访问到文件: 在配置nginx做反代将用户的请求调度至后端的MogileFS,此实验依赖于nginx-mogilefs-module模块,需在编译时加上此模块. 实验环境: 再准备一台CentOS 7的虚拟主机,来作为前

Http和Nginx反代至Tomcat(LNMT、LAMT)

Http和Nginx反代至Tomcat(LNMT.LAMT) ================================================================================ 概述: 本章将主要介绍Http和Nginx反代至Tomcat,具体内容如下: LNMT部署并实现动静分离 LAMT部署的实现方式: ·proxy_http_module代理配置 ·proxy_ajp_module代理配置 Tomcat脚本(启动.停止.重启) ========

爬虫与反爬虫

转自:https://mp.weixin.qq.com/s/-w-yC6PCdTOpfKS8HZEleA 前言 爬虫与反爬虫,是一个很不阳光的行业. 这里说的不阳光,有两个含义. 第一是,这个行业是隐藏在地下的,一般很少被曝光出来.很多公司对外都不会宣称自己有爬虫团队,甚至隐瞒自己有反爬虫团队的事实.这可能是出于公司战略角度来看的,与技术无关. 第二是,这个行业并不是一个很积极向上的行业.很多人在这个行业摸爬滚打了多年,积攒了大量的经验,但是悲哀的发现,这些经验很难兑换成闪光的简历.面试的时候,

做网盘难啊

做网盘难啊要养一堆客户端研发,界面丑要被骂要养一堆服务端研发,不稳定丢了文件要被骂要养一堆安全人员,泄露隐私要被骂要养一堆机器学习的人做反黄,做得差会被喝茶,做得好会被骂还有带宽费用,限速了也要被骂而且还没什么人愿意付费,做网盘的老板心里苦啊 有些人说你弄到大数据了也赚了,只有你心里知道,狗屁的大数据. 作者:王码修链接:http://www.zhihu.com/question/51803053/answer/127582337来源:知乎著作权归作者所有,转载请联系作者获得授权.