/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 = contrast=1:밝기= 0.1 out.mp4
밝기, 대비, 채도 및 대략적인 감마 조정을 설정합니다.
이 필터는 다음 옵션을 지원합니다.
Contrast
대비 표현식을 설정하며, 값은 -2.0에서 2.0 사이의 부동 소수점 수여야 하며 기본값은 0입니다.
Clever
밝기 표현식을 설정합니다. 값은 -1.0에서 1.0 사이의 부동 소수점 숫자이어야 하며 기본값은 0입니다.
Soak
채도 표현식을 설정합니다. 값은 0에서 3.0 사이의 부동 소수점 숫자이며 기본값은 1이어야 합니다.
------- ---------
공개 보안 클래스 VideoFiltering{
#Region 클래스 멤버 변수
AVFilterGraph * m _ filter _ graph = null;
AVFilterContext * m _ buffer sink _ CTX = null;
AVFilterContext * m _ buffersrc _ CTX = null;
AVFrame * m _ filter _ frame = null
Object m _ lock _ record = new Object(); ?
#endregion?
public int Init(int width, int height, int contrast, int brightness) {
Lock (m _ lock _ record) {
//Key snippet?
if (m_filter_graph!= null)?
return-1; ?
대비 = 대비 & lt1 ?1:대비;
대비 = 대비 & GT9 ?9:대비;
밝기 = 휘도 & lt1 ?1:밝기;
밝기 = 휘도 & GT9 ?9:휘도;
플로트 대비 _ f = 1+ (((( float)(contrast-5))/10;
float 밝기 _ f = 0+((float)(밝기-5))/10;
string_filter_description = string. format(" eq = contrast = " +contrast _ f . ToString()+":밝기 = "+밝기 _ f . ToString());
return init_filters(width, height, filters _ descr);
}
}
Public int Reset(int width, int height, int contrast, int 밝기) {
deinit(); ?
Return Init(width, height, contrast, brightness); ?
}
공개 int Filter(av frame * frame _ src, AVFrame **frame_dst)? {?
lock(m_lock_record){
*frame_dst = frame _ 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 _ filter _ frame);?
if(ret & lt; 0)
Return ret?
* frame _ dst = m _ filter _ frame; ?
Return 0; ?
}?
}
public void UnrefFrame() {
lock(m_lock_record) {
if (m_filter_graph == null)?
Return; ?
ffmpeg . AV _ FRAME _ UNREF(M _ FILT _ FRAME); ?
}?
}?
공개 void Deinit()? {?
if (m_filter_graph == null)?
Returns; ?
if (m_filter_graph! == null)? {?
fix(AVFilterGraph * * filter _ graph = & amp; m_filter_graph)?
ffmpeg . AV FILTER _ GRAPH _ FREE(FILTER _ GRAPH); ?
}?
if (m_filt_frame! = null)? {?
Fix (AVFrame * * filter _ frame = & ampm_filt_frame)?
ffmpeg . AV _ FRAME _ FREE(FILT _ FRAME);?
}?
}?
비공개 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;?
StringParameter = string. format("video_size = " + width. ToString() + "x" + height. ToString() + ":pix _ fmt = 0:time _ base = 1/20");?
AV 필터 * 버퍼 src = ffmpeg . AV FILTER _ GET _ BY _ NAME(" BURPER "); ?
AV 필터 * 버퍼 싱크 = 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 _ none; ?
//AVPixelFormat pix _ fmts[]= { AVPixelFormat. av _ pix _ fmt _ yuv420p, AVPixelFormat. av _ pix _ fmt _ none}; ?
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 * * 버퍼 싱크 _ 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, unchecked ((ulong)AVPixelFormat. av _ PIX _ FMT _ none));?
ret = ffmpeg . AV _ OPT _ set _ bin(m _ 버퍼 싱크 _ CTX, " pix_fmts ", (byte*)pix_fmts, size, ffmpeg. AV _ OPT _ SEARCH _ CHILDREN); ?
if(ret & lt; 0)?
끝으로 이동; ?
출력 ->; name = ffmpeg . AV _ STRDUP(" IN ");?
Output->; filter _ ctx = m _ buffersrc _ ctx?
Output->; pad _ idx = 0; ?
Output->; next = null?
Input->; name = ffmpeg . AV _ STRDUP(" OUT "); ?
Input->; filter _ ctx = m _ buffersink _ ctx?
Input->; pad _ idx = 0; ?
Input->; next = null?
ret = ffmpeg . AV FILTER _ GRAPH _ PARSE _ PTR(M _ FILTER _ GRAPH, FILTS_DESCR, & AMP 입력 및 출력. Output, null); ?
if(ret & lt; 0)?
끝으로 이동; ?
ret = ffmpeg . AV FILTER _ GRAPH _ CONFIG(M _ FILTER _ GRAPH, NULL);?
if(ret & lt; 0)?
끝으로 이동; ?
m _ filter _ frame = ffmpeg . AV _ FRAME _ ALLOC();?
end:?
ffmpeg . AV FILTER _ INOUT _ FREE(& AMP; INPUT); ?
ffmpeg . AV FILTER _ INOUT _ FREE(& AMP; OUTPUT); ?
ffmpeg . AV _ FREE(PIX _ FMTS); ?
if(ret & lt; 0)
deinit();
returns ret
}
p>확인된 효과는 분명하며 필요에 따라 파라미터를 변경해 볼 수 있습니다.