通过调整视频的亮度和对比度来提高图像质量。
/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
}
}
经过验证,效果明显,可以根据自己的需要尝试修改参数。