视频特效滤镜 via FFmpeg Filter
视频特效定义
视频特效(Video effects 或 Visual effects)是对每帧图像进行各种数字化处理达到的效果。如对画面的尺寸、位置、亮度及色度等参数进行处理,就可获得缩放、旋转、黑白、油画等各种效果。
常见的特效技术有:缩放、旋转、裁剪、叠加、老电影、黑白、淡入淡出、水印、去噪、慢动作、2D 转 3D 等等。
FFmpeg filter
关于 FFmpeg filter 的架构,请参考我的另一篇文章 音频特效插件 via FFmpeg。
av_filter_base 类
用 FFmpeg 的 filter 开发时主要区别就是把不同的 filter description string 传到 filtergraph 中,然后设定 sink 端 prefer 的参数,其他部分几乎是一样的,所以我把 filter 的使用封装成了一个 av_filter_base 类,代码请参考 这里。
av_filter_base::video_filter_init_begin 函数
创建 video source 和 sink filter。
int video_filter_init_begin(AVCodecContext *dec_ctx, AVRational stream_time_base)
{
int hr = -1;
m_filter_graph = avfilter_graph_alloc();
RETURN_IF_NULL(m_filter_graph);
char args[512] = {
0};
_snprintf_s(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,
stream_time_base.num, stream_time_