読者です 読者をやめる 読者になる 読者になる

すたらブログ

文系Webプログラマの備忘録

PexJSを使ってスマホのブラウザでもFlashを再生する

目次


はじめに

これは開発者のための記事です。
利用者として、訪問したページ内にあるFlashを再生させたい場合は、Androidではドルフィンブラウザを使うのがいいと思います。

スマホのブラウザではAdobe Flash Playerのブラウザプラグインを使えないので、Flashを再生できません。
しかし、PexJSを使えばスマホのブラウザでも再生できるようです。


PexJSをダウンロードする

「bin」フォルダの中から「pex.min.js」を取り出します。


Flashを再生させる

HTMLで下記のように利用します。
とても簡単で、エラーが出なければこれで完了です。

<!DOCTYPE html>
<html>
<body>
<!-- canvasタグを設置 -->
<canvas id="flash-area"></canvas>

<!-- PexJSを読み込む -->
<script src="pex.min.js"></script>
<script>
// 第1引数はswfファイルへの相対パス、
// 第2引数は埋め込む場所のid属性
var pex = new Pex("old-video.swf", "flash-area");
</script>
</body>
</html>

エラーが出たら

私の場合は、Flashが再生されずに「invalid swf signature: CWS」というエラーがブラウザのデベロッパーモードのコンソールに表示されました。
「swf シグネチャ cws」で検索してみると、SWFファイルを圧縮している場合は文頭に「CWS」、そうでない場合は「FWS」と記述されるようです。

しかし、ソースコードが1行に圧縮されているため、具体的にどんなエラーなのかが分かりません。

そこで、圧縮されていないソースコードを生成することにします。


pex.jsを生成する

公式ページの「To build:」の項目に書かれているとおりに実行すれば、圧縮されていない「pex.js」を生成できます。

Node.jsをインストールする。
https://nodejs.org/en/

jakeをインストールする。
コマンドプロンプトに下記のコマンドを入力する。

npm install -g jake

(下記のように表示されれば成功)
jake@8.0.12 C:\Users\insatsu026\AppData\Roaming\npm\node_modules\jake
├── async@0.9.2
├── utilities@1.0.4
├── chalk@0.4.0 (has-color@0.1.7, ansi-styles@1.0.0, strip-ansi@0.1.1)
├── minimatch@0.2.14 (sigmund@1.0.1, lru-cache@2.7.3)
└── filelist@0.0.4 (utilities@0.0.37, minimatch@0.3.0)

依存パッケージをインストールする。
ダウンロードしたPexJSフォルダの直下で実行すること。
「package.json」に記述されているパッケージが、新しく作られる「node_modules」フォルダ内にインストールされる。

npm install

(下記のように表示されれば成功。「WARN」は気にしなくてよい)
npm WARN package.json Pex@0.0.1 No repository field.
npm WARN package.json Pex@0.0.1 No license field.
ejs@2.5.1 node_modules\ejs

サブモジュールを更新する。
「.gitmodules」に記述されているソースコードが最新の状態になる。

git submodule update --init --recursive

ようやく、ビルドできる。
「output」フォルダが作られるので、「js」フォルダの中にある「pex.js」をコピーして利用する。

jake

(何も表示されなければ成功)

あらためてエラーを分析する

読み込むファイルを「pex.min.js」から「pex.js」に変更して、あらためてコンソールにエラーを表示させます。

7708行目付近のソースコードを読んでみると、原因が分かりました。
PexJSではシグネチャがFWSのもの、つまり非圧縮のSWFファイルしか扱えないようです。
下記のように、文頭の3文字が「FWS」でなければ、「invalid swf signature: 」というエラーメッセージの後に文頭の3文字をくっつけて、コンソールで表示させているようです。

if(binary[pos] != "F".charCodeAt(0) ||
  binary[pos + 1] != "W".charCodeAt(0) ||
  binary[pos + 2] != "S".charCodeAt(0)) {
  // signature check missed
  var errorMessage = "invalid swf signature: " + String.fromCharCode.apply(null, binary.slice(0, 3));
  onerror && onerror(errorMessage);
  EngineLogE(errorMessage);
  return 0;
}

CWSからFWSへ変換する

SWFファイルを圧縮・展開してくれるWindows用のソフトウェアがあるので、それを利用します。
下記のページから「swf_comp.zip」をダウンロードして展開します。

使い方は、「swf_comp.exe」にSWFファイルをドラッグ&ドロップするだけです。
ただし元ファイル自体が書き換えられてしまうので、あらかじめコピーしておいてください。


あらためてFlashを再生してみる

あらためて再生してみると、今度は別のエラーが表示されました。
Flashのバージョン9には対応していないようです。

公式ページにあるとおり、PexJSは「Flash Lite 1.1のランタイムエンジン」だそうです。
そして、Flash Lite 1.1はFlash 4 がベースになっているそうです。

ということは、Flash 4の形式でSWFファイルをパブリッシュすれば解決するのでしょう。
しかし、私はAdobe Flashを持っていないのでどうすることもできません。

「ざんねん!! わたしの ぼうけんは これで おわってしまった!!」(シャドウゲイト)