其它过滤器文章:
day09-----1-----FFmpeg过滤器框架分析。
day09-----2-----视频过滤器实战。
day09-----3-----音频过滤器实战(ffmpeg进行混音,将两路音频pcm数据合成一路输出)。
day09-----4-----FFmpeg filter补充之使用filter添加水印。
day09-----5-----FFmpeg filter补充之使用复杂的filter过滤视频。
注:看本节之前,请优先看day09-----5那节文章。
一 使用filter添加水印的流程
上一节9-2的视频裁剪以及9-3的音频混音都是使用简单的过滤,而本节与下一节9-5将使用复杂的过滤器去操作。所谓简单过滤,就是使用函数前连接,而复杂过滤则是通过filter的语法(共有3个语法,9-5将会讲到),去组成描述滤波图的字符串。
// 1 依次解码两张图片到各自的AVFrame。
// 2 初始化,类似简单过滤的过程,只不过使用字符串描述处理。
// 3 添加帧后,直接获取帧。
// 4 编码并保存编码后的水印图到jpg文件中。
其中描述滤波图的字符串为:
// 2 字符串描述过滤图。
// Parsed_xxx代表FFmpeg系统过滤器的个数。可用命令查看例如 ffmpeg -h filter=buffer。参数都有说明,例如pixel_aspect是样本长宽比
snprintf(filter_args, sizeof(filter_args),
"buffer=video_size=%dx%d:pix_fmt=%d:time_base=1/25:pixel_aspect=%d/%d[main];" // Parsed_buffer_0
"buffer=video_size=%dx%d:pix_fmt=%d:time_base=1/25:pixel_aspect=%d/%d[logo];" // Parsed_bufer_1
"[main][logo]overlay=%d:%d[result];" // Parsed_overlay_2
"[result]buffersink", // Parsed_buffer_sink_3
main_frame->width, main_frame->height, main_frame->format, main_frame->sample_aspect_ratio.num, main_frame->sample_aspect_ratio.den,
logo_frame->width, logo_frame->height, logo_frame->format, logo_frame->sample_aspect_ratio.num, logo_frame->sample_aspect_ratio.den,
x, y);
二 代码
关于代码,因为后续需要改动,赖得每次改完后这里还得改,就不贴自己的出来了。当然,我肯定是看自己的打上了注释的代码。
三 过滤效果
一张主图,一张水印图,处理完代码后,就是下图的效果。