FFmpeg源码分析:视频滤镜介绍(上)

本文介绍了FFmpeg中的视频滤镜,包括blackdetect的黑色检测、blend的视频混合、colorbalance的色彩调整、delogo的水印去除、drawbox的矩形标注、drawgrid的九宫格绘制以及lut系列滤镜的色彩转换。文章详细讲解了各滤镜的工作原理和参数设置,结合实例展示其效果。
摘要由CSDN通过智能技术生成

FFmpeg在libavfilter模块提供音视频滤镜。所有的视频滤镜都注册在libavfilter/allfilters.c。我们也可以使用ffmpeg -filters命令行来查看当前支持的所有滤镜,前面-v代表视频。本篇文章主要介绍视频滤镜,包括:黑色检测、视频叠加、色彩均衡、去除水印、抗抖动、矩形标注、九宫格。

关于视频滤镜的详细介绍,可查看官方文档:视频滤镜。音频滤镜可参考前面两篇文章:音频滤镜介绍(上)和音频滤镜介绍(下)。

1、blackdetect

黑色检测,用于检测纯黑的视频间隔时间。此滤波器将其分析结果输出到日志和元数据。如果找到至少具有指定最小持续时间的黑色片段,则打印一行日志,其中包含开始和结束时间戳以及持续时间。参数选项如下:

  • black_min_duration, d:最短的检测黑色时长,单位为s,默认为2.0

  • picture_black_ratio_th, pic_th:设置黑色图像的比率,默认为0.98

  • pixel_black_th, pix_th:设置黑色像素的阈值,默认为0.10

2、blend

混合,把两个视频的所有帧混合在一起,又称为视频叠加。第一个视频在顶层,第二个视频在底层,默认为最长的视频时长作为输出时长。

  • 2.1 从顶层到底层的线性水平过渡:

blend=all_expr='A*(X/W)+B*(1-X/W)'
  • 2.2 从右到左覆盖,可用于转场动画过渡效果:

blend=all_expr='if(gte(N*SW+X,W),A,B)'
  • 2.3 从上到下覆盖,可用于转场动画过渡效果:

blend=all_expr='if(gte(Y-N*SH,0),A,B)'
  • 2.4 沿对角线分割视频,两边分别显示顶层与底层 :

blend=all_expr='if(gt(X,Y*(W/H)),A,B)'

视频混合的代码位于libavfilter/vf_blend.c,主要是遍历像素矩阵,计算顶层像素乘以一个透明度与底层像素乘以透明度的相反数之和,关键代码如下:

static void blend_normal_8bit(const uint8_t *top, ptrdiff_t top_linesize,
                              const uint8_t *bottom, ptrdiff_t bottom_linesize,
                              uint8_t *dst, ptrdiff_t dst_linesize,
                              ptrdiff_t width, ptrdiff_t height,
                              FilterParams *param, double *values, int starty)
{
    const double opacity = param->opacity;
    int i, j;
 
    for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
            dst[j] = top[j] * opacity + bottom[j] * (1. - opacity);
        }
        dst    += dst_linesize;
        top    += top_linesize;
        bottom +&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值