Python 处理视频文件的实用姿势
感觉这辈子,最深情绵长的注视,都给了手机。
视频是目前最热门的领域之一。
各平台争先推出便捷工具,自带滤镜和玩法,普通人也能轻松制作精美视频。
也有不少团队实现了批量视频制作,拥有更高产能,运营效率也更高。
现在手机上的剪映,电脑的爱剪辑,已经足够我们应付日常视频处理需求。再专业点,也可以用PR、FinalCut、Edius等软件处理。这些软件都提供可视化的编辑,可以边剪辑边预览。
但对于那些工作流程相对固定、产能要求高的操作,更适合机器处理。当人睡觉时,机器依旧在剪辑。
甚至如果需要支持多团队的视频处理,可以考虑把剪辑工作搬到云上,随时扩大处理能力。
视频可以看成是连续的图片,如果你看过翻书做的动画就能马上理解。
当连续的图片切换足够快时(主流认为每秒24帧),我们就会感受到平滑的视觉效果。
和音频类似,视频的清晰度,主要由帧率和每帧图像的清晰度(即分辨率)决定。
但需要注意的是:对于已有视频,提高帧率和分辨率,并不能让视频更清晰,因为信息无法凭空还原。
当然,这是人工智能的研究领域之一,俗称“AI修图”,把不清晰的变得更清晰。
比如前阵子火爆B站的老北京AI修复视频:
视频文件本身是个容器,内含音频、视频、字幕等信息,独立字幕是文本文件,音视频经编码后保存。
上一章已经介绍过ffmpeg
,它是开源软件中处理视频的最佳选择,不少Python三方模块在处理音视频时,都会调用其编码和读写文件的能力。
Python处理视频主要有3类模块:
opencv-python
,由于视频本质上就是连续的图像,所以图像处理模块也能处理视频中的每一帧图像。最后对视频的编码和读写会依赖ffmpeg
完成。ffmpeg-python
,这类模块是对ffmpeg
的命令包装,相当于用Python调用ffmepg
的命令。moviepy
,提供了便捷的视频处理接口,文件编码和读写也依赖ffmpeg
。
其中,moviepy
使用门槛低,足够应付最常见的需求,如截取、拼接、简单转场和特效等。
模块安装:pip install moviepy
它的基本工作原理可以概括为:
基于
ffmpeg
读写视频文件。基于
numpy
、scipy
、opencv
、PIL
处理内部图像数据。两大核心类:
AudioClip
、VideoClip
分别处理音频和视频。
如果要在视频中增加图形或文字,需要提前安装ImageMagick
软件。
ImageMagick
的安装在Mac上稍微复杂些,因为它基于X11
框架。
分两步安装:
安装
XQuartz
:即X11
框架的MacOS版实现。Homebrew
安装软件:brew install imagemagick
本文将以moviepy
为主介绍视频处理,图像特效等部分会兼用opencv
和skimage
等模块。
视频处理的常见场景包括:
分段截取:剪掉前几秒或后几秒,或取中间某段
素材提取:音频提取,视频截图
清晰调整:帧率、分辨率
倍速播放:加速、减速
格式转换:视频编码选择、GIF转换
视频拼接:如添加片头、添加片尾
视频剪裁:裁剪某个区域内容
水印处理:加文字水印、加图片水印、加动画水印
视频特效:镜像、滤镜、过长切换、遮照
字幕处理:提取字幕,添加字幕
智能处理:人脸追踪、马赛克、换脸
下面分成4个部分介绍:基本使用、拼接裁剪、效果水印、智能处理。
基本使用
视频的基本处理包括:文件读写、分段截取、音量调整、素材提取、清晰度参数、倍速播放、格式转换。
视频拼接和裁剪
视频拼接是指在时间维度上,把多个视频段连起来,常见如每个视频的片头片尾。
视频裁剪是指在屏幕上划出一个区域当成新的视频。
效果处理和水印
对视频中的每一帧图像应用滤镜,就是对视频应用滤镜。
滤镜可以是变换色彩风格,也可以是应用遮照。
所以视频水印原理与图像一致,可以加文字、图片和动画水印。
此外,在视频片段间连接时,可以增加一些淡入淡出的过场效果。
moviepy
最核心的3个方法:
fl_image
:处理每一帧图像,比如添加元素、应用遮照。fl_time
:处理时间相关特效,比如动态变速。fl
:同时处理时间和每一帧图像。
在使用时,优先用前两个,有时会加快渲染速度。
此外moviepy
通过vfx
包提供了很多内置特效功能。
效果处理
关于动态遮照,目前官方代码moviepy.video.tools.drawing.color_gradient
有点小问题。
动态遮照的本质,是对每一帧图像应用动态生成的遮照。
由于moviepy
内部使用numpy.ndarray
格式存储数据,我们可以选择opencv
、scikit-image
来处理动态的遮照图像。
这里就以scikit-image
来演示,模块安装:pip install scikit-image
。
scikit-image基本画图方法
先看下scikit-image
的基本图形绘制方法:
线:
skimage.draw.line
实心圆:
skimage.draw.circle
空心圆:
skimage.draw.circle_perimeter
多边形:
skimage.draw.polygon
椭圆:
skimage.draw.ellipse
空心椭圆:
skimage.draw.ellipse_perimeter
贝塞尔曲线:
skimage.draw.bezier_curve
具体参数官方都有详细解释,就不列了。
动态遮照
水印处理
视频水印的处理,可以把原视频和水印用CompositeVideoClip
方法合并。
关于去水印的主要4种思路参考:
通过裁剪,把包含水印部分去除,最简单但会丢失部分信息。
把水印部分模糊化,或另一个水印覆盖原水印,相当于涂抹。
拿到水印原文件,尝试透明度反向减除,不能100%但有时可做到肉眼不可见。
基于算法消除,目前大部分速度很慢,一张图都得几十秒,更不用说视频。
智能处理
视频相关的智能处理,可以分解到对字幕、图像、音频的处理。
如:生成字幕、人脸追踪、视频分类等。
字幕提取
关于字幕提取的3个思路:
字幕如果是嵌入在视频文件中,就可以通过
ffmpeg
命令直接提取字幕srt
文件。更多时候字幕和视频渲染在一起,即所谓“硬字幕”,这时就需要靠算法识别。
算法识别字幕有两种方式:从音频里提取(即上一章的STT),或从图像里提取(即OCR技术)。
OCR技术中较出名的如Google的tesseract
项目,它能识别100多种语言。之前介绍过的百度paddlehub
也有文字识别的模型。
从效果上看,paddlehub
在图像的中文识别方面更优。
处理方式也很简单:
从视频里抽取图像。
调用
paddlehub
识别图片里的文字。
注意还需要安装2个模块:pip install shapely pyclipper
。
在实战中更推荐STT方式提取字幕。除了之前推荐的云平台之外,平时也可以使用如网易见外、讯飞听见等在线应用。
人脸追踪
2019年ZAO换脸曾风靡一时,它就是人脸追踪的一种应用,而且实现了追踪后替换融合的效果。
此外我们经常看到一些新闻里会对人脸动态打马赛克,其基本原理如下:
找到每一帧图像中的人脸位置,记录下数据。
处理每一帧图像,对人脸打马赛克。
我们通过结合moviepy
和paddlehub
可以很容易实现。
如果想要实现类似ZAO换脸一样的效果,除了定位人脸,还得实现图像融合。
比较热门的一个开源项目faceswap
,实现了换脸算法。有兴趣可以看我Notebook的记录,对硬件要求较高,需要训练自己的模型,速度很慢。
也可以用paddlehub
来识别人脸,它提供了不少训练模型,如:
人体结构标注:
ace2p
人脸识别:
ultra_light_fast_generic_face_detector_1mb_640
人脸结构标注:
face_landmark_localization
可以比较容易识别出人脸模型,但想要融合,则需要借助额外的模型,如图像风格迁移StarGAN
。
视频分割属于人工智能的前沿研究领域,尤其是视频软分割 (video matting) 算法,感兴趣的可以关注人工智能顶级会议:CVPR,每年都会有一些新算法被提出。
总结
本文介绍了视频文件的处理方法,主要介绍了moviepy
在日常视频处理中的应用,以及借助人工智能算法实现一些特殊的效果,如人脸追踪打马赛克、字幕提取等。
paddlehub
项目里还有不少有趣的训练模型,我们可以借助它结合moviepy
玩出很多新奇的效果。
比如,复制视频里的人物、生成艺术风格视频等。
想了解的可以入群获取,前100名免费。
版权声明: 本文为 InfoQ 作者【程一初】的原创文章。
原文链接:【http://xie.infoq.cn/article/b4904c8e7aa2d8413bc06316f】。文章转载请联系作者。
评论