KLV (Key-Length-Value) はデータ エンコーディング標準であり、ビデオ フィードに情報を埋め込むためによく使用されます。この標準では、type-length-valueエンコーディング スキームを使用します。項目は Key-Length-Value トリプレットにエンコードされます。ここで、key はデータを識別し、length はデータの長さを指定し、value はデータ自体です。これは、米国映画テレビ技術者協会によって承認された SMPTE 336M-2007 (Data Encoding Protocol Using Key-Length Value) で定義されています。KLV は相互運用性が非常に高いため、Motion Imagery Standards Board でも採用されています。
バイトパッキング
バイナリ データ ストリームでは、KLV セットは次のように分割され、すべての整数解釈はビッグ エンディアンになります。
キーフィールド
最初の数バイトはキーで、標準のハッシュ テーブル データ構造のキーに似ています。キーの長さは 1、2、4、または 16 バイトです。おそらく、別の仕様書で、特定のアプリケーションのキーの長さについて合意することになります。16バイトのキーは通常、グローバルに登録された一意の識別子として使用するために予約されており、このようなパケットの値部分には通常、より小さなキーを持つ一連の KLV セットが含まれます。
長さフィールド
キーのバイトの次には長さフィールドのバイトが続きます。長さフィールドの後に続くバイト数と値部分を構成するバイト数を示します。長さフィールドのエンコードには、1 バイト、2 バイト、4 バイト、および基本エンコード ルール(BER) の 4 種類があります。1 バイト、2 バイト、および 4 バイトのバリアントは非常に単純です。バイトから符号なし整数を作成し、その整数が後に続くバイト数になります。
BER 長さエンコーディングは、少し複雑ですが、最も柔軟性があります。長さフィールドの最初のバイトに上位ビットが設定されていない場合 (0x80)、その 1 バイトは 0 から 127 までの整数を表し、直後に続く値バイトの数を示します。上位ビットが設定されている場合、下位 7 ビットは、長さフィールドを構成するバイトがいくつ続くかを示します。
たとえば、BER 長さフィールドの最初のバイトがバイナリ 10000010 の場合、次の 2 バイトは整数を構成し、その後に続く値バイトの数を示します。したがって、長さを指定するために合計 3 バイトが使用されます。
値フィールド
残りのバイトは値フィールドであり、その内容は、よくあるように、より多くの KLV セットのチェーンを含め、任意のものにすることができます。
例
次の例では、4 バイトは KLV セットを表します。キーは 1 バイト、長さフィールドは 1 バイト (または BER の可能性があります。例からはわかりません)、値は 0 と 3 の 2 バイトです。アプリケーションでは、a) 1 バイトのキーを使用し、b) 1 バイトの長さのエンコードを使用することに同意しているはずです。また、おそらくキー値 "42" はあなたにとって何か意味があるでしょう。おそらく、値バイト 0x00 と 0x03 が自転車の走行距離計の値を表す整数であることを示しているのでしょう。
外部リンク
- KLVLib - KLV ファイル I/O 用の AC ライブラリ
- KLV 標準 (SMPTE 336M-2007) を購入する
- KLV仕様のITUバージョン(ITU-R勧告BT.1563)(無料)
- パブリックドメインの Java KLV ライブラリ
- コーデックの商用実装
- KLV エンコーダ/デコーダ ライブラリの商用実装 (C++)
