Wolfram语言的12.1版本引入了期待已久的Video对象。Video对象完全是(而且只能是)核外算法,它可以用任何codec编码连接到视频文件的外部列表。最重要的是,它和图像与音频处理、机器学习和神经网、统计和可视化等很多功能的完整桟绑定。这已经使得Wolfram语言成为了一个强有力的视频计算平台,但是还有更多的特色可以挖掘。
01
视频对象
一个视频文件通常有一个视频和一个音频轨道。以下是一个连接到一个视频文件的Video对象:
在版本12.1中,默认情况下,Video对象显示为一个小缩略图,并可以用外部播放器播放。还有其他外观可以开启笔记本内的播放器,以下是使用基础播放器的Video对象:
现在你可以检查Video对象了:
大部分视频容器格式都支持多种视频、音频和字幕轨道。单个文件中的多个音频或字幕轨道比多个视频轨道更常见。
下面的范例式一个连接到带有多个音频和字幕轨道文件的Video对象:
02
访问部分视频
你可能对一段视频中的几个部分感兴趣。使用VideoFrameList和VideoExtractFrames可以抓取特定的视频帧。你还可以使用VideoFrameList来给n帧的视频进行统一或随机取样。
使用这个函数可以创建一个缩略图网格(一组可以总结整个视频的小图):
你也可以截取视频的一小段:
或者只从视频中提取音频轨道进行分析:
03
进行分析
在12.1版本中,我们引入了VideoTimeSeries,这个函数可以对视频的帧进行计算——可以一次对一帧进行计算,也可一次对一个列表的帧进行计算。这是一个强大的分析工具,可以进行比如下例的分析:
计算随时间推移的每个帧的平均颜色:
对视频中每一帧检测到的物体(如:车)数量进行计数:
对每帧中检测到的物体(比如,车)数量进行绘图:
高亮样本帧中检测到的物体位置:
我们还可以用这个函数的多帧版本来进行任何需要多个帧的分析。
通过观察Pixabay视频中连续帧并计算四个视图的差异,我们可以找到从一个视图到另一个视图的转换次数,并使用这些次数来为每个场景提取一帧的内容:
04
处理视频
Wolfram语言已经包含了多种图像和视频处理函数。VideoFrameMap是一个可以对单个帧或者多个帧进行筛选并将其写到新视频文件的函数。把红腹灰雀的视频当做范例:
我们从简单的取相反颜色的例子开始:
或者对帧进行色调分离,创建卡通效果:
使用神经网络对之前用过的汽车的视频进行语义分割:
下面是一个视频稳定的例子,比我们之前12.0版本的产品范例(https://www.wolfram.com/language/12/new-in-image-processing/keypoint-based-video-stabilization.html?product=language)要简单的多了。输入视频是Pixabay的另一个视频:
这里在地上的遮罩可以保证抖动的肥皂泡泡运动不会影响我们的稳定性算法:
下面是找到连续两帧之间的联系和几何变换,由前序变换重复迭代组成,并讲这个算法一直延续到初始帧:
05
从Manipulate到Video
我们把话题转向视频的生成。在Wolfram语言中,这是多年来Manipulate一直都是创建动画的一个核心方法。在12.1中,Manipulate表达式可以简单地转变为视频。
下面是Wolfram演示项目(https://demonstrations.wolfram.com/DayAndNightWorldClock/)中的一个Manipulate:
从中生成一个视频:
视频还可以从Manipulate和一个Sound或Audio对象中生成:
<br />
06
关于支持Codecs编码的一个小笔记
Wolfram语言默认使用操作系统和FFmpeg的一个限制版本来对大量多媒体容器和codecs进行解码和编码。VideoEncoders、VideoDecoders和
编码器支持可通过安装FFmpeg(4.0.0版本或更高版本)进行扩展。以下是通过在macOS上安装FFmpeg后支持的MP4视频解码器列表及其数量:
07
还有更多
Wolfram语言中的视频计算还只在开始阶段。这里的新功能只是我们强大的视频基础功能的一部分,而且我们还在先存的函数和未来可能会支持的版本的基础上积极设计和开发新的功能,其中优先级最高的就是机器学习和神经网络整合。在评论区说出你的想法吧——我们欢迎各种程序错误的评论、建议和新功能要求。