像HTML一样编写视频:画布、主轨、场景(复合片段)与转场

728 阅读4分钟

今天继续介绍MiraML的视频描述能力: 画布、场景与转场。这些能力都是基于米拉视频改造的FFCreator实现的。

之前的文章可以看这里:

  1. MiraML概述
  2. 灵活的时间与空间单位

老规矩,先举一个栗子🌰:

<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秒。

熟悉剪辑工具的同学,看这个轨道里的排列或许会更好理解: WX20220824-110648@2x.png

从最外层的节点开始(除miraml外),主要有以下几类节点:

  1. canvas: 画布,也是根节点,有且只能有1个。有以下属性:
    width, height 表示最终生成视频的尺寸(px),只能是int类型;
    fps 帧/秒,预览的时候用处不大,烧录的时候可以指定,默认24
    debug 布尔型(boolean),开启后会打印更多log信息;
    crf, vb, highWaterMark, outputDir.. 等参数,参见FFCreator文档

  2. spine: 主轨,为了方便多个片段前后(时间)自动排列而引入,有且只能有1个
    主轨中的子节点(仅第一级子节点),按文档中的先后顺序,在上一个结束后,自动进入下一个,而无需为每一个节点设置start。而主轨以外的节点,如果没有start设置,都会在第0秒开始。
    👁️👁️ 如果canvas下没有主轨(spine)节点,FFCreator会自动创建主轨,并将canvas下第一级子节点中没有设置startvideo节点都挂到主轨节点下。这是为了方便多数情况下省略主轨节点而设置的默认行为。如果需要绕过,可写一个空的主轨节点<spine></spine>

  3. video: 视频,image: 图片。这一层的节点除了基本属性x, y, width, height, start, duration外,也有各自支持的属性,比如src等,留在以后详细介绍。

  4. trans: 转场特效。目前只能作为spine的子节点(未来可能支持更多的情况),实现前后2个兄弟节点(也是同一层的spine的子节点)之间的转场动画效果。默认duration时长1秒。
    👁️👁️ 转场特效通常会在同时出现前后两个片段(节点)的画面,以特效叠加的方式融合在一起。所以实际上在转场过程中,会用前后节点的隐藏片段来补帧(下图中灰色部分),达到更顺畅的画面效果。 WX20220824-154205@2x.png 比如【子节点1】的视频源素材时长10秒,但我们只用它前8秒,那么它其实正常画面离场后还有2秒的隐藏片段(灰色部分);而【子节点2】的视频,我们设置了属性ss=2,即从进场后直接从视频源素材的第2秒开始播放,那它前面也有2秒的隐藏片段。因此,在转场特效进入的时候,会继续播放【子节点1】尾部,同时开始播放【子节点2】的隐藏头部。
    👁️👁️ 如果隐藏片段的时长小于转场时长的一半(因为转场时长是前后各分一半),没有可供补帧的画面,就会保持在前一个片段的尾帧,或后一个片段的首帧。

  5. scene: 场景,类似常用视频编辑软件中【复合片段】的效果,即将它里面所有的子节点(所有子层级)都打包在一起,在时间轴上也不允许子节点超出它的时长范围,就类似空间布局里overflow: hidden的概念。
    👁️👁️ 示例中,第三幕包含在scene里面,可以看到它里面的图片与前两幕里图片不一样的地方:图片与视频都打包在一起,共同参与了转场特效的动画。

最后,介绍一下每个节点都支持zIndex属性(audio等无画面的除外)。与CSS里的zIndex功能类似,是决定节点空间布局里上下遮挡关系的关键因素。
默认的zIndexchild > parent,即子节点盖在父节点上面。文档中后出现的节点盖在先出现的上面。如有需求,可直接设置int类型的值。

👁️👁️ scene里所有子节点的zIndex都是单独比较大小,不会与scene外面的节点混淆。最后打包到scene之后,再拍扁作为一层参与外面的zIndex比较。


参考:

开源项目: FFCreator

如果遇到问题也可以扫码入群:

contact_me_qr.png