Action Message FormatAMF)は、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 VideoReal Time Messaging Protocolなどの定義済みの Adob​​e/Macromedia コンテナーまたはトランスポートの外部でのメッセージの送信用です

ヘッダー長またはメッセージ長のいずれかが不明な場合は、-1または0xFFFFFFFFに設定されます。

uimsbf: 符号なし整数、最上位ビットが先頭

simsbf: 符号付き整数、最上位ビットが先頭

AMF0

このフォーマットは、データのエンコードに使用できる様々なデータ型を指定します。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呼び出しにカプセル化されています。前者の例は以下をご覧ください(これは、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エンコーディングが使用されることを意味します。

AMF3

プロトコルの最新バージョンでは、より圧縮されたフォーマットを可能にする重要な変更が規定されています。データマーカーは以下の通りです。

  • 未定義 - 0x00
  • ヌル - 0x01
  • ブール値 False - 0x02
  • ブール値 True - 0x03
  • 整数 - 0x04 (拡張可能な8ビット以上の整数)
  • Double - 0x05 (IEEE 64 ビット倍精度浮動小数点数としてエンコード)
  • 文字列 - 0x06 (UTF-8 文字列で拡張可能な 8 ビット以上の整数文字列の長さ)
  • XMLDocument - 0x07 (UTF-8 文字列の拡張可能な 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)つまり配列に含まれていないか、「参照」(0)であるかを示します。参照の場合は、配列のインデックスが保存されます。テーブルには、キーと値が含まれます。

Flash Playerの以前のバージョンでは、「Number」と呼ばれる64ビット倍精度エンコーディングの数値型が1つありました。最新リリースでは、AMF3に別々の型として含まれるintとuintがあります。数値型はAMF0エンコーディングと同一ですが、整数型は1バイトから4バイトまでの可変長で、バイト1~3の最上位ビットは、その後ろに別のバイトが続くことを示します。

AMFのサポート

さまざまな AMF プロトコルは、アプリケーション開発者がインストールして統合する必要があるライブラリとサービスの形式で、多くのサーバー側言語とテクノロジによってサポートされています。

プラットフォーム:

  • コールドフュージョン- [4]
  • Haxe - Haxe リモート hxformat
  • Java - Adob​​e 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 Archived 2014-05-18 at the Wayback Machine、WebORB for PHP、Zend_Amf、php-amf3 extension、Baguette AMF(php extension)
  • Python - amfast
  • Perl - AMF::Perl、Storable::AMF、AMF::Connection
  • Curl - Curl データサービス
  • Ruby - RubyAMF 2014-05-18 にWayback Machineでアーカイブ、 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 - CocoaAMF
  • PowerShell - Powershell AMF

フレームワーク:

参照

参考文献

  1. ^ 「アクションメッセージフォーマット - AMF 3」(PDF) 2013年1月. 2021年5月1日閲覧
  2. ^ 「アクションメッセージフォーマット - AMF 0」(PDF) 2007年。 2021年5月1日閲覧
  3. ^ 「AdobeがAMFをオープン化し、リッチウェブアプリで使用されるリモートフレームワークのソースを解放」Ars Technica . 2017年12月31日閲覧
  4. ^ 機能 | Adob​​e ColdFusion 9 Standard