通过调整视频的亮度和对比度来提高图像质量。

参考:

/boonya/article/details/79753091

/u 010029439/article/details/84754395

先谢谢两位大神了!

可以参考ffmpeg的源代码,doc\examples\filtering_video.c,视频滤波的一个例子,对于ffmpeg?\libavfilter\vf_eq.c,调整亮度和对比度以增强图像质量。

参考命令行:

ffmpeg.exe-I test.mp4-VF eq =对比度=1:亮度= 0.1 out.mp4

设置亮度、对比度、饱和度和近似伽玛调整。

该过滤器支持以下选项:

对比

设置对比度表达式,值必须是-2.0到2.0之间的浮点数,默认值为0。

聪明

设置亮度表达式。该值必须是-1.0-1.0之间的浮点数,默认值为0。

浸透

设置饱和度表达式。该值必须是介于0和3.0之间的浮点数,默认值为1。

————————————————

公共不安全类视频过滤{

#区域类成员变量

AVFilterGraph * m _ filter _ graph = null;

AVFilterContext * m _ buffer sink _ CTX = null;

AVFilterContext * m _ buffersrc _ CTX = null;

AVFrame * m _ filt _ frame = null

Object m _ lock _ record = new Object();?

#endregion?

public int Init(int width,int height,int contrast,int brightness) {

锁定(m_lock_record) {

//关键代码段?

if (m_filter_graph!= null)?

return-1;?

对比度=对比度& lt1 ?1:对比;

contrast = contrast & gt9 ?9:对比;

亮度=亮度& lt1 ?1:亮度;

亮度=亮度& gt9 ?9:亮度;

float contrast _ f = 1+((float)(contrast-5))/10;

float brightness _ f = 0+((float)(brightness-5))/10;

字符串过滤器_描述=字符串。format(" eq = contrast = "+contrast _ f . ToString()+":brightness = "+brightness _ f . ToString());

返回init_filters(width,height,filters _ descr);

}

}

公共int Reset(int width,int height,int contrast,int brightness) {

deinit();?

返回Init(宽度、高度、对比度、亮度);?

}

public int Filter(av frame * frame _ src,AVFrame **frame_dst)?{?

锁定(m_lock_record){

*帧_dst =帧_ src?

if (m_filter_graph == null) {

return-1;?

}

int ret?

//AV_BUFFERSRC_FLAG_KEEP_REF = 8,?

ret = ffmpeg . av _ buffersrc _ add _ frame _ flags(m _ buffersrc _ CTX,frame_src,8);

if(ret & lt;0)?

返回ret?

ret = ffmpeg . av _ buffer sink _ get _ frame(m _ buffer sink _ CTX,m _ filt _ frame);?

if(ret & lt;0)

返回ret?

* frame _ dst = m _ filt _帧;?

返回0;?

}?

}

public void UnrefFrame() {

锁定(m_lock_record) {

if (m_filter_graph == null)?

返回;?

ffmpeg . av _ frame _ unref(m _ filt _ frame);?

}?

}?

public void Deinit()?{?

if (m_filter_graph == null)?

返回;?

if(m_filter_graph!= null)?{?

固定(AVFilterGraph * * filter _ graph = & amp;m_filter_graph)?

ffmpeg . av filter _ graph _ free(filter _ graph);?

}?

if (m_filt_frame!= null)?{?

固定(AVFrame * * filt _ frame = & ampm_filt_frame)?

ffmpeg . av _ frame _ free(filt _ frame);?

}?

}?

private int init _ filters(int width,int height,string filters_descr) {

int ret = 0;?

ffmpeg . av filter _ register _ all();?

//AVPixelFormat。AV _ PIX _ FMT _ YUV 420 p = 0;?

字符串参数=字符串。Format("video_size=" + width。ToString() + "x" + height。ToString()+":pix _ fmt = 0:time _ base = 1/20 ");?

av filter * buffer src = ffmpeg . av filter _ get _ by _ name(" buffer ");?

av filter * buffer sink = ffmpeg . av filter _ get _ by _ name(" buffer sink ");?

AVFilterInOut * outputs = ffmpeg . av filter _ inout _ alloc();?

AVFilterInOut * inputs = ffmpeg . av filter _ inout _ alloc();?

//av rational time _ base;?

int * pix _ fmts =(int *)ffmpeg . av _ malloc(8);?

pix_fmts[0] = (int)AVPixelFormat。AV _ PIX _ FMT _ YUV 420 p;?

pix _ fmts[1]=(int)AVPixelFormat。AV _ PIX _ FMT _无;?

//AVPixelFormat pix _ fmts[]= { AVPixelFormat。AV_PIX_FMT_YUV420P,AVPixelFormat。AV _ PIX _ FMT _无};?

m _ filter _ graph = ffmpeg . av filter _ graph _ alloc();?

if(outputs = = null | | inputs = = null | | m _ filter _ graph = = null)?{?

ret =-1;?

转到结尾;?

}?

fixed(AVFilterContext * * buffersrc _ CTX = & amp;m_buffersrc_ctx) {?

ret = ffmpeg . av filter _ graph _ create _ filter(buffersrc _ CTX,buffer src," in ",args,null,m _ filter _ graph);?

if(ret & lt;0)?{?

转到结尾;?

}?

}?

fixed(AVFilterContext * * buffer sink _ CTX = & amp;m_buffersink_ctx) {?

ret = ffmpeg . av filter _ graph _ create _ filter(buffersink _ CTX,buffer sink," out ",null,null,m _ filter _ graph);?

if(ret & lt;0){?

转到结尾;?

}?

}

int size =(int)ffmpeg . av _ int _ list _ length _ for _ size(1,(void*)pix_fmts,未检查((ulong)AVPixelFormat。AV _ PIX _ FMT _无));?

ret = ffmpeg . av _ opt _ set _ bin(m _ buffer sink _ CTX," pix_fmts ",(byte*)pix_fmts,size,ffmpeg。AV _ OPT _ SEARCH _ CHILDREN);?

if(ret & lt;0)?

转到结尾;?

输出->;name = ffmpeg . av _ strdup(" in ");?

输出->;filter _ ctx = m _ buffersrc _ ctx?

输出->;pad _ idx = 0;?

输出->;next = null?

输入->;name = ffmpeg . av _ strdup(" out ");?

输入->;filter _ ctx = m _ buffersink _ ctx?

输入->;pad _ idx = 0;?

输入->;next = null?

ret = ffmpeg . av filter _ graph _ parse _ ptr(m _ filter _ graph,filters_descr,& amp输入和输出。输出,空);?

if(ret & lt;0)?

转到结尾;?

ret = ffmpeg . av filter _ graph _ config(m _ filter _ graph,null);?

if(ret & lt;0)?

转到结尾;?

m _ filt _ frame = ffmpeg . av _ frame _ alloc();?

end:?

ffmpeg . av filter _ inout _ free(& amp;投入);?

ffmpeg . av filter _ inout _ free(& amp;输出);?

ffmpeg . av _ free(pix _ fmts);?

if(ret & lt;0)

deinit();

返回ret

}

}

经过验证,效果明显,可以根据自己的需要尝试修改参数。