VSML のタグ

VSML ファイルは、以下のように記述します。

example.vsml
<vsml>
  <meta>
    <style src="hoge.vss" />
  </meta>
  <cont resolution="1920x1080" fps="30">
    <prl>
      <img src="yellow.jpg" />
      <layer>
        <txt class="styled">これは文章です</txt>
        <txt class="styled">これもまた文章です</txt>
      </layer>
    </prl>
  </cont>
</vsml>

vsml タグで全体を囲み、その子要素に meta タグと cont タグを 1 つずつ持ちます。 このタグドキュメントでは cont 以下に記述するタグについて説明していきます。

2 種類のタグ

それぞれのタグで示される要素は、

  • content 系
  • wrap 系

大きくこの 2 種類に分けられます。

content 系

content 系は基本的に子要素に他のタグを持たず、動画内の素材単体のオブジェクトを示します。content 系においては、duration というプロパティについて理解する必要があります。

映像や音声の content は直感的でわかりやすく、その映像や音声のソースの有限な時間長がその content の duration になります。10 秒の動画であれば、その content の duration は 10s ということです。

では、字幕や画像など、ソースに時間長が存在しないものはどうでしょうか。この場合、duration は無限の時間長となります。これは、後述の wrap 系の仕様と合わせることで、真価を発揮します。

wrap 系

wrap 系は、子要素に content 系、または wrap 系を持ち、子オブジェクトとそのタグ自身をまとめて大きな一つのオブジェクトを示します。wrap 系においては、duration の他に、order というプロパティについて理解する必要があります。order というプロパティは、sequence 、parallel のいづれかの値を取ります。

sequence の場合、子オブジェクトは上から順番に再生するように連ねてオブジェクトとします。この場合、duration の値は、子オブジェクトの総和となります。この際、子要素に無限長のオブジェクトがあった場合、そのオブジェクトより後ろのオブジェクトは再生されることはなく、その sequence の値を持つ wrap オブジェクトも時間長は無限となります。

parallel の場合、子オブジェクトの再生開始位置を揃えて同時に再生するように並べてオブジェクトとします。この場合、duration の値は、子オブジェクトのうち、有限な時間長の最大値となります。もし order が parallel な wrap オブジェクトの子オブジェクトが、10 秒の映像、5 秒の音声、字幕の場合、wrap オブジェクトは 10 秒となります。この際、子要素がすべて無限の時間長の場合、wrap オブジェクトも無限の時間長となります。

VSML の真価の一つは上記の通り、order が parallel なオブジェクトの子に duration が無限のオブジェクトをもたせると、その子オブジェクトは親オブジェクトの長さにフィットするのです。そのため、無限の時間長の duration の値は fit という値で指定します。