Flash Player 20 / Adobe AIR 20の新機能

# Flash Player 20 / Adobe AIR 20の新機能

すごいですね。もうFlash Player 20まできました。
Flash Player 11.xまでのバージョンアップのスピードを考えると、3-4年前はFlash Player 20とかはるか遠い未来だと思っていました。Flash Player 12からバージョン番号の付け方がかわったから、かなりスピーディーにバージョン番号が進んでいます。

## 新機能

- Android SDKのアップデート
- iOSでSecureSocket APIのサポート
- MAC OS XのAIRアプリを64 bit化
- ビデオの角度情報がメタデータとして取得できる
    - スマホだと縦撮りとかするからね
- PPAPIのFlash Player (=ChromeのFlash Player)でベクターで印刷できるようになった
- Flash Player "ハードウェアアクセラレーションの設定"がWindows 8/10のEdgeとIEでできるようになった
- AGAL3が使えるようになったよ！ 新しい[AGALMiniAssembler.as](https://github.com/adobe-flash/graphicscorelib/tree/master/src/com/adobe/utils/v3)も公開されました。
- Stage3D の 「インスタンス」 描画機能


Stage3D の 「インスタンス」 描画機能に関しては上条さんのブログに詳しくまとまっています。いつもありがとうございます！

http://cuaoar.jp/2015/11/flash-player-adobe-air-2-1.html
http://cuaoar.jp/2015/12/flash-player-adobe-air-2-2.html

## ビデオの角度の取得について

次のようなコードを使って、ビデオの角度を計算します。`trackHeaderBoxMatrix `と`movieHeaderBoxMatrix `というのが新しいメタデータ情報です。リリースノートにサンプルコードが載っているのですが、たぶん間違ってる気がします。メタデータは`Matrix`オブジェクトではなく、ただの`Array`です。サンプルコードではいきなり`Matrix`として扱っていますが、エラーになると思います。

```as3
package
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;

	public final class Main extends Sprite
	{

		//----------------------------------------------------------
		//
		//   Property 
		//
		//----------------------------------------------------------

		private var video:Video;

		//----------------------------------------------------------
		//
		//   Constructor 
		//
		//----------------------------------------------------------

		public function Main()
		{
			stage.quality = StageQuality.LOW;
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;

			// ビデオを作成
			video = new Video();
			addChild(video);

			// ビデオ接続のためのNetConnectionを作成
			var nc:NetConnection = new NetConnection();
			nc.connect(null);

			// ネットストリームも作成
			var ns:NetStream = new NetStream(nc);
			ns.client = {};
			ns.client.onMetaData = ns_onMetaData;
			ns.client.onCuePoint = ns_onCuePoint;

			// ビデオにネットストリームをくっつける
			video.attachNetStream(ns);

			// ビデオファイルを再生
			ns.play("saru_aruku.m4v");
		}

		/** メタデータ取得時のハンドラーです */
		private function ns_onMetaData(info:Object):void
		{
			trace("metaData");

			// ビデオの配置
			video.width = info.width;
			video.height = info.height;

			// とりあえず現状の変形行列を取得
			var matrix:Matrix = video.transform.matrix;

			// 古いビデオサイズを保持
			var oldSize:Point = new Point(video.width, video.height);

			// 基準点を中央に設定
			matrix.translate(-(oldSize.x / 2), -(oldSize.y / 2));

			// 新しいメタデータ情報の「trackHeaderBoxMatrix」を持っているか？
			if (info.hasOwnProperty("trackHeaderBoxMatrix"))
			{
				// Matrixという名前なのに正体は、は・い・れ・つ！
				var arr:Array = info.trackHeaderBoxMatrix[0];

				// trackHeaderBoxMatrixは行列の配列です。
				// なぜならば、ビデオのトラックが複数存在するケースもあるからです。

				// 配列を行列に変換
				var thbMtx:Matrix = new Matrix(
					arr[0],
					arr[1],
					arr[2],
					arr[3],
					arr[4],
					arr[5]
					);
				// 持っていたらTrack Header Box of Video Trackを変換行列にくっつける
				matrix.concat(thbMtx);
			}

			// 新しいメタデータ情報の「movieHeaderBoxMatrix」を持っているか？
			if (info.hasOwnProperty("movieHeaderBoxMatrix"))
			{
				// Matrixという名前なのに正体は、は・い・れ・つ！
				arr = info.movieHeaderBoxMatrix;

				// 配列を行列に変換
				var mhbMtx:Matrix = new Matrix(
					arr[0],
					arr[1],
					arr[2],
					arr[3],
					arr[4],
					arr[5]
					);

				// 持っていたらMovie Header Boxを変換行列にくっつける
				matrix.concat(mhbMtx);
			}

			// 基準点を元に戻す
			matrix.translate((oldSize.x / 2), (oldSize.y / 2));

			// ビデオに変換行列を適用
			video.transform.matrix = matrix;
		}

		private function ns_onCuePoint(item:Object):void
		{
			trace("cuePoint");
		}
	}
}

```

Adobe Flash Builder 4.7でデバッグしてもやっぱり配列。

![151210_metadata.png](https://qiita-image-store.s3.amazonaws.com/0/2544/7b8c8928-1b95-cf4c-101e-492e865d778d.png)


## 設定方法

[Adobe Flash Playerサポートセンター](http://www.adobe.com/jp/support/flashplayer/debug_downloads.html)から最新版の「PlayerGlobal (.swc)」ファイルをダウンロードします。

このファイルを次の場所に配置します。
```
Flex SDKのパス/frameworks/libs/player/20.0/playerglobal.swc
```
※「20.0」というフォルダは新規作成ください。
※ダウンロードした「playerglobal20_0.swc」ファイルはリネームして「playerglobal.swc」にします。いつも、リネームするのは面倒ですよね。

新しい SWF のバージョンは 31。Flex SDKを使ってコンパイルするときは、コンパイル引数に次を設定しましょう。

```
-swf-version=31
```

![Adobe Flash Builder 4.7での設定画面](https://qiita-image-store.s3.amazonaws.com/0/2544/e0e98615-ebba-19a1-501b-7a064e69d71a.png)