| インターネットメディアの種類 |
アプリケーション/オクテットストリーム |
|---|---|
| 開発者 | アドビシステムズ |
| フォーマットの種類 | データ交換フォーマット |
| コンテナ用 | 構造化データ |
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 自己完結型パケット
次のamf パケットは、Flash VideoやReal Time Messaging Protocolなどの定義された Adobe/Macromedia コンテナーまたはトランスポートの外部でのメッセージの送信用です。
ヘッダー長またはメッセージ長のいずれかが不明な場合は、-1または0xFFFFFFFFに設定されます。
uimsbf: 符号なし整数、最上位ビットが先頭
simsbf: 符号付き整数、最上位ビットが先頭
0 ...
このフォーマットは、データのエンコードに使用できるさまざまなデータ型を指定します。Adobe によると、AMF は主に、キーと値のペアの形式で名前付きプロパティを含むオブジェクト グラフを表すために使用されます。キーは文字列としてエンコードされ、値は文字列や数値、配列、その他のオブジェクトなど、任意のデータ型にすることができます。XML はネイティブ タイプとしてサポートされています。各タイプは、実際のデータの前の 1 バイトで示されます。そのバイトの値は次のとおりです (AMF0 の場合)。
- 数値 - 0x00 (IEEE 64 ビット倍精度浮動小数点数としてエンコード)
- ブール値 - 0x01 (値 0x00 または 0x01 の 1 バイトとしてエンコードされます)
- 文字列 - 0x02 (UTF-8 文字列の 16 ビット整数文字列長)
- オブジェクト - 0x03 (キー/値のペアのセット)
- ヌル - 0x05
- ECMA 配列 - 0x08 (32 ビット エントリ数)
- オブジェクトの終了 - 0x09 (空の 16 ビット文字列の長さが先行)
- 厳密な配列 - 0x0a (32 ビットのエントリ数)
- 日付 - 0x0b ( 16 ビット整数タイムゾーン オフセットを持つIEEE 64 ビット倍精度浮動小数点数としてエンコード)
- 長い文字列 - 0x0c (UTF-8 文字列の 32 ビット整数文字列の長さ)
- XML ドキュメント - 0x0f (UTF-8 文字列の 32 ビット整数文字列長)
- 型付きオブジェクト - 0x10 (UTF-8 名を持つ 16 ビット整数名の長さ、その後にエントリが続く)
- AMF3 に切り替える - 0x11
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 呼び出しにカプセル化されています。前者の例は、次のとおりです (これは、フラッシュ クライアントから送信された "connect" コマンドに応答して返される "_result" メッセージです)。
凡例:オブジェクトの開始/終了 オブジェクトキー オブジェクトの値 ecma_array
AMF メッセージは、ヘッダー タイプが 0 の0x03RTMP パケットを示すで始まるため、12 バイトが続くことが予想されます。これはメッセージ タイプ 0x14 であり、値 "_result" の文字列形式のコマンドと、引数として 2 つのシリアル化されたオブジェクトを示します。メッセージは次のようにデコードできます。
(コマンド) "_result" (トランザクションID ) 1 (値) [ 1 ] { fmsVer : "FMS/3,5,5,2004"機能: 31.0モード: 1.0 }, [ 2 ] {レベル: "ステータス" 、コード: "NetConnection.Connect.Success" 、説明: "接続に成功しました。" 、データ: (配列) {バージョン: "3,5,5,2004" },クライアントID : 1584259571.0 、オブジェクトエンコーディング: 3.0 }
ここでは、1 つのメンバーを持つ 'data' キーの値として配列 (青緑色) が表示されます。objectEncoding の値は 3 であることがわかります。これは、後続のメッセージが 0x11 メッセージ タイプで送信され、AMF3 エンコーディングを意味することを意味します。
AMF3
プロトコルの最新バージョンでは、より圧縮された形式を可能にする重要な変更が指定されています。データ マーカーは次のとおりです。
- 未定義 - 0x00
- ヌル - 0x01
- ブール値 False - 0x02
- ブール値 True - 0x03
- 整数 - 0x04 (拡張可能な 8 ビット以上の整数)
- 倍精度 - 0x05 (IEEE 64 ビット倍精度浮動小数点数としてエンコード)
- 文字列 - 0x06 (UTF-8 文字列で拡張可能な 8 ビット以上の整数文字列長)
- XMLDocument - 0x07 (拡張可能な 8 ビット以上の整数文字列の長さおよび/または UTF-8 文字列のフラグ)
- 日付 - 0x08 (IEEE 64 ビット倍精度浮動小数点UTC オフセット時間を持つ拡張可能な 8 ビット以上の整数フラグ)
- 配列 - 0x09 (拡張可能な 8 ビット以上の整数エントリ数および/またはフラグ、オプションで拡張可能な 8 ビット以上の整数名の長さ、UTF-8 名)
- オブジェクト - 0x0A (拡張可能な 8 ビット以上の整数エントリ数および/またはフラグ、オプションで拡張可能な 8 ビット以上の整数名の長さ、UTF-8 名)
- XML - 0x0B (拡張可能な 8 ビット以上の整数フラグ)
- ByteArray - 0x0C (オプションで 8 ビットのバイト長を持つ拡張可能な 8 ビット以上の整数フラグ)
最初の 4 つのタイプの後にはデータは続きません (ブール値には AMF3 で 2 つのタイプがあります)。
Flash Player 10 (形式は引き続き AMF3 と呼ばれます) で使用される追加のマーカーは次のとおりです。
- ベクトル整数 - 0x0D
- ベクトルUInt - 0x0E
- ベクトルダブル - 0x0F
- ベクトルオブジェクト - 0x10
- 辞書 - 0x11
AMF3 はさらなる圧縮を目指しており、これを実現する方法の 1 つは、文字列を配列に保存して、すべての新しい文字列をチェックすることで、文字列の重複を回避することです。文字列マーカーに続くバイトは、純粋な長さを示すものではなく、最下位ビットが文字列が「インライン」(1)、つまり配列内にないか、「参照」(0) であるかを示し、後者の場合は配列のインデックスが保存される複合バイトです。テーブルには、キーと値が含まれます。
Flash Player の以前のバージョンでは、64 ビットの倍精度エンコーディングである「Number」と呼ばれる数値型が 1 つありました。最新リリースでは、AMF3 に別々の型として含まれる int と uint があります。数値型は AMF0 エンコーディングと同じですが、整数は 1 バイトから 4 バイトまでの可変長で、バイト 1 から 3 の最上位ビットは、その後に別のバイトが続くことを示します。
AMFのサポート
さまざまな AMF プロトコルは、アプリケーション開発者がインストールして統合する必要があるライブラリとサービスの形式で、多くのサーバー側言語とテクノロジによってサポートされています。
プラットフォーム:
- コールドフュージョン- [4]
- Haxe - Haxe リモート hxformat
- Java - Adobe BlazeDS、Adobe LiveCycle Data Services(旧称 Flex Data Services)、Exadel Flamingo、RED 5(2019-10-23 にWayback Machineにアーカイブ)、Cinnamon、OpenAMF、Pimento、Granite、WebORB for Java
- .NET - WebORB for .NET、FluorineFx (LGPL)、DotAmf (MS-PL)、AMF.NET (開発停止)
- PHP - AmfPHP、SabreAMF、WebORB for PHP、Zend_Amf、php-amf3 拡張機能、Baguette AMF(php 拡張機能)
- Python - amfast
- Perl - AMF::Perl、Storable::AMF、AMF::Connection
- Curl - Curl データ サービス
- Ruby - RubyAMF、WebORB for Rails、Rocket AMF
- アーラン- アーラン-AMF
- ActionScript - Flash Player ByteArray(組み込み)、CourseVector ライブラリ
- JavaScript - JSAMF CourseVector ライブラリ CourseVector .minerva
- Lua - lua-amf3
- ABAP - ABAP AMF (初期段階)
- Delphi - kbmMW (広範な AMF0/AMF3 サポート)
- iOS - ココアAMF
- PowerShell - Powershell AMF
フレームワーク:
- Apache Royale と AMF および RemoteObject との通信 - Apache Royale
- Ruby on Rails - RubyAMF
- Zend フレームワーク- Zend_AMF
- OSGi フレームワーク- OSGi 用 AMF3
- Django - Django AMF
- CakePHP - CakeAMFPHP
- Grails (フレームワーク) - BlazeDS
- Trac - TracRpcProtocolsPlugin。XmlRpcPlugin のバージョン 1.1.0 (またはそれ以上) が必要です。
- Web2py - PyAMF
参照
参考文献
- ^ 「アクション メッセージ フォーマット - AMF 3」(PDF) . 2013 年 1 月. 2021 年 5 月 1 日閲覧。
- ^ 「アクション メッセージ フォーマット - AMF 0」(PDF) . 2007 . 2021 年 5 月 1 日閲覧。
- ^ 「Adobe が AMF を公開、リッチ Web アプリで使用されるリモート フレームワークのソースを解放」Ars Technica 。2017年 12 月 31 日閲覧。
- ^ 機能 | Adobe ColdFusion 9 Standard
