ボックスにゃ sample atomにゃに関して

  • Sample Table Atoms(stbl)
    • Sample description atom(stsd)
    • Time-to-sample atom(stts)
    • Sync sample atom(stss)
    • Sample-to-chunk atom(stsc)
    • Sample size atom(stsz)
    • Chunk offset atom(stco)
    • Shadow sync atom(stsh)

sampleにゃが基本とにゃる単位にゃのですにゃ。
で、sampleを1個にゃいし複数個まとめたものにゃがchunkですにゃ。
chunk単位にゃで、どのデコードにゃにするかが決まってて、そのデコードにゃの種類にゃは、Sample Description Atom(stsd)にゃで定義されてますですにゃ。

1個1個にゃのsampleにゃのサイズにゃは、Sample size atom(stsz)で定義されててにゃ、
各chunkが幾つsampleにゃを持ってるってにゃのは、Sample-to-chunk atom(stsc)にゃに定義されてるにゃのですにゃ。*1

にゃかにゃか、めんどうですにゃね。

*1:適応するにゃデコードにゃの種類もにゃ

サンプルのサイズ Sample size atom(stsz)

サンプル1個1個にゃのサイズを定義してるにゃもの。

みんにゃ同じサイズにゃら、Sample sizeってにゃの1個で済ませてるにゃのですにゃ。
ちがったら*1テーブルにゃにうにゃうにゃ〜ってサンプルのサイズがかかれますですにゃ。
これにゃで1個1個にゃのサンプルにゃの区切りがわかるんですにゃね。

 + 0 Atom size
 + 4 Type = 'stsz'
 + 8 Version
 + 9 Flags
 +12 Sample size         みんな同じサイズにゃら、ここが0以外。
 +16 Number of entries   サンプルサイズのテーブル数
 +20 Sample size table   サンプルサイズのテーブル

*1:Sample sizeが0にゃとき

サンプルの時間的長さ Time-to-sample atom(stts)

1個にゃサンプルがどのくらいの時間にゃのかを定義しているにゃのですにゃ。

ドキュメントよんだときにゃに、わかりづらかったですにゃ。*1

{ Sample count(4byte), Sample duration(4byte)} にゃ感じにゃのテーブルがにゅにゅ〜ってあるのですにゃ。
Sample countな個数が、Sample durationにゃんです。*2

たとえばですにゃ、time-to-sample tableが{4,3},{2,1},{3,2}にゃったら、

サンプル番号 サンプルの時間的にゃ長さ 説明
1 3 4回3が続く
2 3
3 3
4 3
5 1 2回1が続く
6 1
7 2 3回2が続く
8 2
9 2

って感じにゃににゃるのですにゃ。
サンプル3にゃの時間の長さにゃは、3で、サンプル8にゃは、2って感じですにゃ。

ランレングス圧縮みたいにゃ感じですにゃね。

サンプル毎にゃに、時間の長さを加算していけばにゃ、これを使って再生している時間から該当するにゃサンプルにゃがわかるのですにゃね。

サンプル番号 サンプルの時間的にゃ長さ 時間
1 3 0 始の時間にゃは、edit list atomで定義されるっぽいにゃ。
2 3 3
3 3 6
4 3 9
5 1 12
6 1 13
7 2 14
8 2 16
9 2 18

12の時間を再生しようにゃ〜って思ったら、このテーブルをみてにゃ、サンプル5を使うんにゃ〜ってのがわかるのですにゃ。*3

*1:英語苦手にゃので…(汗)

*2:いぁ、意味不明にゃから……

*3:実際にゃは、チャンクにゃ方も考慮しにゃいと駄目ですけどにゃ。

chunkにゃに幾つサンプルが含まれるにゃ? どのデコード使うにゃ? Sample-to-chunk atom(stsc)

chunkにゃの定義ですにゃ。
これにゃには、chunkが幾つのサンプルで構成されてるにゃのかと、それらのサンプルにゃのデコード方法が書かれてますですにゃ。

これまたにゃ〜、わかりづらかったですにゃ。

テーブルにゃには、{First chunk(4bytes) *1, Samples per chunk(4bytes) *2,Sample description ID(4bytes) *3 }って感じにゃににゃってますですにゃ。
First chunkってにゃのは、これが適応されるにゃ最初のchunkってことにゃで、次の項目のFirst chunkの1個前のチャンクまで同じのが適応されるにゃですにゃ。

たとえば、テーブルにゃが、{1,3,23}, {3,1,23}, {5,1,24}だったらにゃ。

chunkにゃ番号 サンプル数 デコードのインデックス
1 3 23
2 3 23
3 1 23
4 1 23
5 1 24

chunk2にゃは、{1,3,23}の項目が使われてにゃ、サンプル数は3個で、デコードにゃは23のを使うってことにゃににゃるのですにゃ。
chunk4にゃも同じにゃで、{3,1,23}が使われるのですにゃ。

サンプル数にゃを加算していってにゃ、チャンクとサンプルにゃの変換表にゃを作るとです*4にゃ。
そうするにゃと、サンプル番号にゃからchunkへの変換がわかるのですにゃ。

chunkにゃ番号 サンプル数 デコードのインデックス サンプル番号
1 3 23 1,2,3
2 3 23 4,5,6
3 1 23 7
4 1 23 8
5 1 24 9

再生時間からにゃサンプル番号を見つけてにゃ、で、このテーブルにゃを使って、属するチャンクを見つけてにゃ。
で、にゃっとサンプルにゃのデコード方法がわかるにゃのですにゃ。

ちにゃみに、サンプル5にゃは、chunk2に属しててにゃ、デコード方法にゃは、23ってにゃのがわかりますにゃね。

*1:最初にゃのchunk番号

*2:サンプル数

*3:デコードのインデックス

*4:どこにお住いにゃの猫にゃ?

sampleとかにゃchunkにゃはいったいどこにゃにあるのにゃ? Chunk offset atom(stco)

チャンクにゃの場所を定義してるのですにゃ。
これにゃは32bitにゃサイズのテーブルにゃけど、64bitにゃサイズのテーブルにゃものもあってにゃ、そっちにゃは'co64'ってタイプにゃににゃりますですにゃ。

これが、ちょっとわかってにゃいのですにゃけど、*1
多分、データストリームにゃの先頭からにゃのオフセット位置にゃですにゃ。*2

下記引用

Note that offsets are file offsets, not the offset into any atom within the file (for example, a 'mdat'
atom). This permits referring to media data in files without any atom structure. However, be careful
when constructing a self-contained QuickTime file with its metadata (movie atom) at the front because
the size of the movie atom affects the chunk offsets to the media data.

注意しにゃいと駄目にゃのは、チャンクの位置ってことにゃで、サンプルにゃの位置ではにゃいってことですにゃ。
サンプルにゃの位置を見つけ出すにゃには、この属するチャンクの位置から、目的にゃのサンプルまで、サンプルサイズを加算していかにゃいと駄目ってことにゃのですにゃ。

*1:いあ、他のもわかってにゃいけどにゃ……

*2:にゃんか、前にうにゃうにゃとか書かれてるけどにゃ

うにゃうにゃにゃってきたけどにゃ〜

再生時間 -> サンプル番号 -> サンプルの属するチャンク番号 -> サンプルの属するチャンク位置 -> サンプルサイズを足していって目的にゃのデータ発見!

一言でいうにゃと、めんどくさいにゃ!