前言

给自己的作业留个档,方便日后查看,毕竟人最不靠谱的就是记忆。

此博文使用的图片和视频与输出结果可前往gcnanmuの小屋查看。

视频缩放滤波器

用ffmpeg实现视频宽高放大2倍,宽高缩小2倍。(参考:视频的滤波器通常使用-VF来设置滤波器,也可以使用-filter_complex。)

展示视频像素用到的ffmpeg命令:

1
ffprobe -v error -show_entries stream=width,height -of csv=s=x:p=0 input_video.mp4

因此可以使用以下命令得到输入视频的分辨率:

1
ffprobe -v error -show_entries stream=width,height -of csv=s=x:p=0 "F:\test6_video\input.mp4"
input_video

需要了解的ffmpeg参数:

  1. 待处理的视频。
  2. 变换后高与宽的数值,使用iwih分别表示原来视频的宽度和高度。vf表示视频过滤器(video filter),该操作中由于宽高比和原来的视频不同,会造成像素的宽高比不同。如果想要保持原来的宽高比,可以传递-1作为参数。

视频像素分辨率放大为原来的两倍

1
ffmpeg -i "F:\test6_video\input.mp4" -vf scale=w='iw*2':h=-1  "F:\input_video\resize_double.mp4"
resize_double

视频分辨率缩小为原来的两倍

1
ffmpeg -i "F:\test6_video\input.mp4" -vf scale=w='iw*0.5':h=-1  "F:\input_video\resize_half.mp4"
resize_half

视频水印添加滤波器

将一个水印图片叠加到视频的左上角。(模仿cctv)

三个输入:

  1. 要添加水印的视频

  2. 要添加的水印图片(需要去除背景,不然很难看)

    本次输入的水印图片为:

CCTV
  1. 水印要添加的坐标

使用坐标(0,0)可以将水印添加到视频左上角,使用命令如下:

1
ffmpeg -hide_banner -i "F:\test6_video\input.mp4" -i "F:\test6_video\CCTV.png" -filter_complex "overlay=x=0:y=0" "F:\test6_video\add_watermark.mp4" -y

为了最快的找到视频的四个边缘,需要了解四个参数:

  • main_w(W):主画面的宽度
  • main_h(H):主画面的高度
  • overlay_w(w):水印宽度
  • overlay_h(h):水印高度

这样就可以将右上角的视频坐标(W-w,0)替换为(main_w-overlay_w,0)

用以下命令可以将“CCTV”字样的水印添加到视频右上角

1
ffmpeg -hide_banner -i "F:\test6_video\input.mp4" -i "F:\test6_video\CCTV.png" -filter_complex "overlay=x=main_w-overlay_w:y=0" "F:\test6_video\add_watermark.mp4" -y

输出结果:

add_watermark

视频文字叠加

叠加文字到视频上。(参考通过-vf使用drawtext的滤波器)

两个输入:

  1. 要处理的视频

  2. 添加的文字以及属性(大小,颜色,位置,字体路径),一定要添加字体路径,否则会出现以下报错,提示字体不存在

1
Fontconfig error: Cannot load default config file: No such file: (null)

将大小为30px的红色字样“CCTV”添加到视频的左上角,使用字体为宋体:

1
ffmpeg -i "F:\test6_video\input.mp4" -vf drawtext=fontcolor=red:fontfile=C\\:/Windows/fonts/simhei.ttf:fontsize=30:text="CCTV":x=0:y=0 -y "F:\test6_video\add_txt.mp4"

只需要变换坐标将文字添加到视频右上角:

1
ffmpeg -i "F:\test6_video\input.mp4" -vf drawtext=fontcolor=red:fontfile=C\\:/Windows/fonts/simhei.ttf:fontsize=30:text="CCTV":x=900:y=0+10 -y "F:\test6_video\add_txt.mp4"

输出结果:

add_watermark

视频纹理增强

对视频做锐化操作。

三个参数:

  • x:领域的宽度
  • y:领域的高度
  • amount:-2 ~ 5。负值时进行模糊操作,正值进行锐化,0时无影响

默认值的锐化(5x5大小的矩阵,其影响因子为1.0)

1
ffmpeg -i "F:\test6_video\input.mp4" -vf unsharp "F:\test6_video\sharpen.mp4"

以上命令等同于:

1
ffmpeg -i "F:\test6_video\input.mp4" -vf unsharp=5:5:1 "F:\test6_video\sharpen.mp4"

输出结果:

sharpen

视频画面模糊

  1. 使用boxblur进行模糊

将视频画面进行模糊处理。

输入参数:

  • r :radius表示模糊操作时的邻域半径大小,值越大表示模糊程度越高

  • p:power表示模糊运算的运算次数

1
ffmpeg -i "F:\test6_video\input.mp4" -vf boxblur=10:1 "F:\test6_video\boxblur.mp4"

输出结果:

boxblur
  1. 使用unsharp filer进行模糊

在上述[视频画面模糊](# 视频画面模糊)中我们使用了大于零的amount进行锐化,我们也可以使用小于零的amount进行模糊操作。

1
ffmpeg -i "F:\test6_video\input.mp4" -vf unsharp=5:5:-2 "F:\test6_video\ubsharp_blur.mp4"
unsharp_blur
  1. 使用smartblur进行模糊

参数信息:

  • r:radius 半径,颜色空间或亮度空间中进行高斯模糊时的半径,取值为 0.1 ~ 5.0

  • s:strength 强度,取值 -1 ~ 1,0 时原图输出,-1 ~ 0 进行锐化操作,0 ~ 1 进行模糊操作

  • t:treshold 阀值,取值 -30 ~ 30,0 时对整个图像进行过滤,-30 ~ 0 对平滑区域过滤,0~ 30 对边缘进行过滤。

1
ffmpeg -i "F:\test6_video\input.mp4" -vf smartblur=5:0.8:0 "F:\test6_video\smartblur.mp4"
smartblur

视频裁剪

截取原视频中部分区域视频。(参考使用crop进行视频画面的裁剪)

参数(严格按照顺序):

  • 裁剪后宽度
  • 裁剪后高度
  • 起始位(宽)
  • 起始位置(高)

截取输入视频的四分之一的左上位置:

1
ffmpeg -i "F:\test6_video\input.mp4" -vf crop=480:200:0:0 "F:\test6_video\crop.mp4"

使用命令查看分辨率,发现大小变为原来的二分之一

image-20230519220351452

以下为结果展示,红款框出为裁剪后的视频

crop

视频画中画

将视频2作为小窗口叠加到视频1的右上角。(参考通过overlay和scale实现)。

三个参数:

  1. 背景视频
  2. 嵌入视频
  3. 嵌入视频位置
1
ffmpeg -i "F:\test6_video\back.mp4" -i "F:\test6_video\input.mp4" -filter_complex "[0:v][1:v]overlay=main_w-overlay_w-10:10[v]" -map "[v]" "F:\test6_video\PIP.mp4"

参数解释:

  1. [0:v] : 第一个视频流;

    [1:v] : 第二个视频流;

  2. main_w-overlay_w-10:10 : 表示视频位置为(main_w-overlay_w-10,10)

  3. [v] : 输出视频流的标签;

  4. -map "[v]" : 将带有标签为"[v]"的输出视频流映射到输出文件。

PIP1

保持原尺寸感觉还是太小还是太小,需要增大嵌入视频的分辨率大小,于是做出如下改进:

1
ffmpeg -i "F:\test6_video\back.mp4" -i "F:\test6_video\input.mp4" -filter_complex "[1:v]scale=1500:h=-1[scaled];[0:v][scaled]overlay=main_w-overlay_w-10:10[v]" -map "[v]" "F:\test6_video\PIP2.mp4"
PIP2

其中:

  1. [1:v]scale=200:100[scaled] : 将视频分辨率改变为长1500px,宽按照原始比例缩放

  2. [scaled] : 视频标签,方便后续引用。

  3. [0:v][scaled]overlay=main_w-overlay_w-10:10 : 将标签为[scaled]的视频嵌入到第一个视频流的右上角偏离10px的位置