今天继续介绍MiraML的视频描述能力: 画布、场景与转场。这些能力都是基于米拉视频改造的FFCreator实现的。
之前的文章可以看这里:
老规矩,先举一个栗子🌰:
<miraml>
<canvas width="1280" height="720">
<spine>
<!-- 第一幕,0~2秒 -->
<video x="50vw" y="50vh" width="100vw" src="pic_oceans.mp4" duration="2" ss="1">
<image zIndex="2" x="50rpx" y="30rpx" height="50rpx" width="50rpx" src="pic1.jpg"></image>
</video>
<!-- 转场1 -->
<trans key="cube"></trans>
<!-- 第二幕,2~4秒 -->
<video x="50vw" y="50vh" width="100vw" src="pic_oceans.mp4" duration="2" ss="8">
<image zIndex="2" x="100rpx" y="30rpx" height="50rpx" width="50rpx" src="pic2.jpg"></image>
</video>
<!-- 转场2 -->
<trans key="cube"></trans>
<!-- 第三幕,4~6秒 -->
<scene name="复合片段">
<video x="50vw" y="50vh" width="100vw" src="pic_oceans.mp4" duration="2" ss="15">
<image zIndex="2" x="150rpx" y="30rpx" height="50rpx" width="50rpx" src="pic3.jpg"></image>
</video>
</scene>
<!-- 转场3 -->
<trans key="cube"></trans>
<!-- 第四幕,6~8秒 -->
<video x="50vw" y="50vh" width="100vw" src="pic_oceans.mp4" duration="2" ss="20"></video>
</spine>
</canvas>
</miraml>
👁️👁️ 所有的示例都是可以直接复制到MiraPlayer的沙盒里直接预览播放的
👁️👁️ 科学上网不方便的同学,也可以在掘金的沙盒里玩:
👁️👁️ 目前只支持Chrome/Firefox/Edge,不支持Safari 😈
示例代码包含了4个镜头,每个时长2秒,所以最终渲染出的视频是8秒。 其中还有3个转场特效,每个时长1秒。
熟悉剪辑工具的同学,看这个轨道里的排列或许会更好理解:
从最外层的节点开始(除miraml外),主要有以下几类节点:
-
canvas
: 画布,也是根节点,有且只能有1个。有以下属性:
width
,height
表示最终生成视频的尺寸(px),只能是int
类型;
fps
帧/秒,预览的时候用处不大,烧录的时候可以指定,默认24
;
debug
布尔型(boolean),开启后会打印更多log信息;
crf
,vb
,highWaterMark
,outputDir
.. 等参数,参见FFCreator文档 -
spine
: 主轨,为了方便多个片段前后(时间)自动排列而引入,有且只能有1个。
主轨中的子节点(仅第一级子节点),按文档中的先后顺序,在上一个结束后,自动进入下一个,而无需为每一个节点设置start
。而主轨以外的节点,如果没有start
设置,都会在第0秒开始。
👁️👁️ 如果canvas
下没有主轨(spine
)节点,FFCreator会自动创建主轨,并将canvas
下第一级子节点中没有设置start
的video
节点都挂到主轨节点下。这是为了方便多数情况下省略主轨节点而设置的默认行为。如果需要绕过,可写一个空的主轨节点<spine></spine>
。 -
video
: 视频,image
: 图片。这一层的节点除了基本属性x
,y
,width
,height
,start
,duration
外,也有各自支持的属性,比如src
等,留在以后详细介绍。 -
trans
: 转场特效。目前只能作为spine
的子节点(未来可能支持更多的情况),实现前后2个兄弟节点(也是同一层的spine
的子节点)之间的转场动画效果。默认duration
时长1秒。
👁️👁️ 转场特效通常会在同时出现前后两个片段(节点)的画面,以特效叠加的方式融合在一起。所以实际上在转场过程中,会用前后节点的隐藏片段
来补帧(下图中灰色部分),达到更顺畅的画面效果。比如【子节点1】的视频源素材时长10秒,但我们只用它前8秒,那么它其实正常画面离场后还有2秒的隐藏片段(灰色部分);而【子节点2】的视频,我们设置了属性
ss=2
,即从进场后直接从视频源素材的第2秒开始播放,那它前面也有2秒的隐藏片段。因此,在转场特效进入的时候,会继续播放【子节点1】尾部,同时开始播放【子节点2】的隐藏头部。
👁️👁️ 如果隐藏片段的时长小于转场时长的一半(因为转场时长是前后各分一半),没有可供补帧的画面,就会保持在前一个片段的尾帧,或后一个片段的首帧。 -
scene: 场景,类似常用视频编辑软件中【复合片段】的效果,即将它里面所有的子节点(所有子层级)都打包在一起,在时间轴上也不允许子节点超出它的时长范围,就类似空间布局里
overflow: hidden
的概念。
👁️👁️ 示例中,第三幕包含在scene
里面,可以看到它里面的图片与前两幕里图片不一样的地方:图片与视频都打包在一起,共同参与了转场特效的动画。
最后,介绍一下每个节点都支持zIndex
属性(audio
等无画面的除外)。与CSS里的zIndex功能类似,是决定节点空间布局里上下遮挡关系的关键因素。
默认的zIndex
是child > parent
,即子节点盖在父节点上面。文档中后出现的节点盖在先出现的上面。如有需求,可直接设置int
类型的值。
👁️👁️ scene
里所有子节点的zIndex
都是单独比较大小,不会与scene
外面的节点混淆。最后打包到scene
之后,再拍扁作为一层参与外面的zIndex
比较。
参考:
开源项目: FFCreator
如果遇到问题也可以扫码入群: