ホームページ >バックエンド開発 >PHPチュートリアル >PHP が swf ファイルヘッダーの解析を停止する
PHP
で swf ファイルのヘッダーを解析します
最近、
CSDN
フォーラムで、PHP を使用して swf ファイルのフレーム番号を取得したいという投稿を目にしましたが、実際にはそれは不可能であるとの回答がありました。 swf ファイル形式、swf ファイル形式の仕様は公開されており、ファイル ヘッダーの解析や swf ファイルの生成など、PHP を直接使用して swf ファイルを処理する方法についても多くの情報を見つけることができます。暇なときに、SWF ファイルを解析するための大雑把なクラスも書きました。
swf ファイルのヘッダーを解析するには、当然のことながら、
swf ファイル形式の仕様
を最初に理解する必要があります。 swf ファイル形式については仕様で詳しく説明されています。 swf ファイルのヘッダーは次の部分で構成されます:
-------- ----- -------- ---------- -- - - ----
|ファイルID|バージョン|ファイルサイズ|RECTフィールド|フレームレート|フレーム番号|
-------- ----- ------- - ---------- ---- ----
????????? 「ファイル識別」は、ファイル圧縮フラグを含めて 3 バイトです。この 3 バイトの内容は「FWS」または「CWS」で、「C」で始まるものは、swf ファイルが圧縮出力であることを意味します (RECT フィールドの先頭からファイルの末尾まで、Zlib 標準が使用されます)。ファイル圧縮用)。
??????? 「バージョン」は 8 ビットの符号なし整数を格納するバイトです。たとえば、エクスポートされたバージョンは 16 進モードでこのバイトに格納されます。の場合、バイト ストレージ値は 0x07 であり、「7」 (0x37) に対応する ASCII 値ではありません。
????????? 「ファイル サイズ」ストレージは 32 ビットの符号なし整数であり、これらの 4 つのフィールドに 16 進形式で格納されることに注意してください。ファイルはリトル エンディアン、つまり下位バイトが最初になる「リトル エンディアン」モードで保存されます。解析するときは、バイト順序に注意する必要があります。たとえば、swf ファイルのサイズが 471 バイトの場合、この 4 バイトに格納される内容は、下位から上位まで 0xd7、0x01、0x00、0x00 になります。
??????? 「フレーム レート」は 2 バイトを占め、1 秒あたりに再生されるフレーム数を示します。格納方法は 8.8、合計 16 ビットの固定小数点数で、整数部分は です。上位ビット (つまり 2 番目のバイト)、小数部分は下位ビット (最初のバイト) にあり、バイト アライメントされています。たとえば、10 進数の 7.5 は 16 進数では 0x07.80 と表され、最初に下位桁、最後に上位桁に従って、これらの 16 ビットは次のバイナリ コード 10000000 00000111 として格納されます。
??????? 「フレーム番号」は 2 バイトを占め、16 ビットの符号なし整数であり、swf ファイル内のフレームの総数を示します。保存方法は「ファイルサイズ」の保存方法と同様です。
??????? 理解しにくいのは、swf ファイル形式仕様で定義されている「ビット値」(bit_value) を使用して格納される RECT フィールドです。このストレージ機能ではバイト数を節約できますが、値スパンバイト。このセクションのストレージ コンテンツは、「twip」(「twip」と訳され、1 ピクセル = 20twips)単位で表される再生ウィンドウのサイズです。 Nbit に分割され、次のフィールドの bit_value ビット長を表します。Xmin、Xmax、Ymin、Ymax はそれぞれ X 軸方向と Y 軸方向の最小値と最大値を表します。
??????? まず bit_value について説明します。その特徴は、バイトの区別に関係なく、最後のバイトの空きビットに応じて値が連続して格納されることです。 2 つの 9 ビット表現など、0 を使用すると、符号なしの値 7 と 8 は 3 バイトを占有し、バイナリで表現されます。 ? 3 バイトを押します。ビットは互いに接続されており、最初の 9 ビットの値は 7、次の 9 ビットの値は 8、3 番目のバイトの他のすべての空のビットは 0 で埋められます。 bit_value 表現について簡単に理解しましょう。このフィールドの最初の 5 ビット (ビット) は、後続のフィールドの bit_value ビット長を示します。最大値は 31 です。このように、RECT フィールド全体の最大長は 17 バイトです。これは、swf ファイルのヘッダーの最大長が 29 バイトを超えないことを意味します。 Nbits フィールドを通じて以下のフィールドの bit_value ビット長を取得すると、RECT の具体的な長さが決まり、「フレーム周波数」と「フレーム数」の格納場所がわかります。 RECT フィールドには、6 ビット目から再生ウィンドウのサイズデータが格納されます。Nbits の値に応じて、以降の部分はビットごとに計算され、対応する値が得られます。ただし、ファイル識別子が「CWS」の swf ファイルは、「ファイル サイズ」フィールドから (つまり、8 バイト目から)、swf ファイルを解析するときに Zlib 標準に従って圧縮されて保存されます。 header, first swf ファイルが圧縮形式でエクスポートされるかどうかを確認する必要があります。圧縮形式でエクスポートされた場合は、最初の 8 バイト以降のコンテンツを解凍してから、RECT フィールド、「フレーム レート」および「フレーム数」フィールドを処理する必要があります。
以下は、私が作成した swf ファイル ヘッダー解析クラスとインスタンス圧縮パッケージのアドレスです:
??????
swfHeaderParser
?????????さらに、関連コンテンツは多くの海外 Web サイトで見つけることができます。興味のある友人がチェックできる代表的なアドレスを 2 つ紹介します。 ?
この記事は http://www.5uflash.com/flashjiaocheng/Flashyingyongkaifa/825.html から転載しています。