Action Message Format(AMF)は、ActionScriptオブジェクトやXMLなどのオブジェクトグラフをシリアル化し たり、Adobe Flashクライアントとリモートサービス(通常はFlash Media Serverまたはサードパーティ製の代替サービス)間でメッセージを送受信したりするために使用されるバイナリ形式です。ActionScript 3言語は、AMF形式のエンコードとデコードを行うためのクラスを提供しています。
このフォーマットは、ストリーミングメディア配信のための接続や制御コマンドを確立するために、 AdobeのRTMPと組み合わせて使用されることがよくあります。この場合、AMFデータは、メッセージの長さや種類(「ping」、「コマンド」、メディアデータなど)を定義するヘッダーを持つ チャンクにカプセル化されます。
AMFはFlash Player 6で導入され、このバージョンはAMF0と呼ばれています。Flash Player 9とActionScript 3.0のリリースまで変更はありませんでしたが、新しいデータ型と言語機能の導入により、AMF3と呼ばれるアップデートが行われました。[1] Flash Player 10では、2013年1月の改訂仕様に記載されているように、ベクターデータ型と辞書データ型が追加されました。
Adobe Systemsは2007年12月にAMFバイナリデータプロトコル仕様を公開し[2] [3]、このプロトコルを主要なサーバープラットフォームで利用できるように開発者コミュニティをサポートすることを発表しました。
次のamf パケットは、 Flash VideoやReal Time Messaging Protocolなどの定義済みの Adobe/Macromedia コンテナーまたはトランスポートの外部でのメッセージの送信用です。
ヘッダー長またはメッセージ長のいずれかが不明な場合は、-1または0xFFFFFFFFに設定されます。
uimsbf: 符号なし整数、最上位ビットが先頭
simsbf: 符号付き整数、最上位ビットが先頭
このフォーマットは、データのエンコードに使用できる様々なデータ型を指定します。Adobeによると、AMFは主に、キーと値のペアの形式で表される名前付きプロパティを含むオブジェクトグラフを表すために使用されます。キーは文字列としてエンコードされ、値は文字列や数値、配列、その他のオブジェクトなど、任意のデータ型にすることができます。XMLはネイティブ型としてサポートされています。各型は、実際のデータの前にある1バイトで表されます。そのバイトの値は以下のとおりです(AMF0の場合)。
AMF オブジェクトは (0x03) で始まり、その後に一連のキーと値のペアが続き、(0x09) の値で終わります (先頭に空のキーエントリとして 0x00 0x00 が付きます)。キーは文字列としてエンコードされ、(0x02) の「型定義」バイトが暗黙的に示されます (メッセージには含まれません)。値は他のオブジェクトを含む任意の型にすることができ、オブジェクト グラフ全体をこの方法でシリアル化できます。オブジェクト キーと文字列の両方の前には、長さをバイト数で示す 2 バイトが付きます。つまり、文字列の前には、0x02 型バイトを含む合計 3 バイトが付きます。null 型には、型定義 (0x05) のみが含まれます。数値は倍精度浮動小数点としてエンコードされ、8 バイトで構成されます。
例として、以下のオブジェクトを ActionScript 3 コードでエンコードする場合。
var person : Object = { name : 'Mike' , age : ' 30' , alias : 'Mike' } ; var stream : ByteArray = new ByteArray (); stream.objectEncoding = ObjectEncoding.AMF0 ; // ByteArrayのデフォルトはAMF3ですstream.writeObject ( person ) ;
ByteArray に保持されるデータは次のとおりです。
注: オブジェクトのプロパティは、ActionScript で配置された順序とは異なる順序で並べ替えることができます。色分けとマークアップについては、以下の凡例を参照してください。
上記のコードは、 のような組み込みクラスに対してのみ機能しますObject。カスタムクラスをシリアル化およびデシリアル化するには、ユーザーは registerClassAlias コマンドを使用してそれらを宣言する必要があります。そうしないと、プレーヤーによってエラーがスローされます。
// 仮想クラス Person の場合、
registerClassAlias ( "personTypeAlias" , Person );
厳密に言えば、AMFは単なるデータエンコード形式ですが、通常はRTMPメッセージまたはFlex RPC呼び出しにカプセル化されています。前者の例は以下をご覧ください(これは、Flashクライアントから送信された「connect」コマンドへの応答として返される「_result」メッセージです)。
凡例:オブジェクトの開始/終了 オブジェクトキー オブジェクトの値 ecma_array
AMFメッセージは、ヘッダータイプが0で0x03あるRTMPパケットを示すで始まり、12バイトが続くと予想されます。メッセージタイプは0x14で、値 "_result" の文字列と、引数として2つのシリアル化されたオブジェクトからなるコマンドを示します。このメッセージは次のようにデコードできます。
(コマンド) "_result" (トランザクションID ) 1 (値) [ 1 ] { fmsVer : "FMS/3,5,5,2004"機能: 31.0モード: 1.0 }, [ 2 ] {レベル: "status" 、コード: "NetConnection.Connect.Success" 、説明: "接続に成功しました。" 、データ: (配列) {バージョン: "3,5,5,2004" },クライアントID : 1584259571.0 、オブジェクトエンコーディング: 3.0 }
ここでは、1つのメンバーを持つ「data」キーの値として配列(ターコイズ色で表示)が表示されています。objectEncodingの値は3です。これは、後続のメッセージが0x11メッセージタイプで送信されることを意味し、AMF3エンコーディングが使用されることを意味します。
プロトコルの最新バージョンでは、より圧縮されたフォーマットを可能にする重要な変更が規定されています。データマーカーは以下の通りです。
最初の 4 つのタイプの後にはデータは続きません (ブール値には AMF3 で 2 つのタイプがあります)。
Flash Player 10 (形式は引き続き AMF3 と呼ばれます) で使用される追加のマーカーは次のとおりです。
AMF3はさらなる圧縮を目指しており、その方法の一つとして、文字列を配列に保存し、新しい文字列と照合することで重複を回避するというものがあります。文字列マーカーに続くバイトは、もはや純粋な長さを表すものではなく、複合バイトになっています。このバイトの最下位ビットは、文字列が「インライン」(1)つまり配列に含まれていないか、「参照」(0)であるかを示します。参照の場合は、配列のインデックスが保存されます。テーブルには、キーと値が含まれます。
Flash Playerの以前のバージョンでは、「Number」と呼ばれる64ビット倍精度エンコーディングの数値型が1つありました。最新リリースでは、AMF3に別々の型として含まれるintとuintがあります。数値型はAMF0エンコーディングと同一ですが、整数型は1バイトから4バイトまでの可変長で、バイト1~3の最上位ビットは、その後ろに別のバイトが続くことを示します。
さまざまな AMF プロトコルは、アプリケーション開発者がインストールして統合する必要があるライブラリとサービスの形式で、多くのサーバー側言語とテクノロジによってサポートされています。
プラットフォーム:
フレームワーク: