AIR for iOS でのビデオ再生でちょっとハマったのでメモ


AIR for iOS でのビデオを再生するアプリで、ビデオ映像が再生できないケースが発生してちょっとハマったのでメモ。

AIR for iOS で flash.media.Video クラスを使って H.264 ビデオを再生しようとしたら、FlashBuilder のシミュレータでは再生できるけど実機では再生できず、H.264 のプロファイルをいろいろ変えて試してはみたのですがやっぱりダメでした…

flash.media.Video を flash.media.StageVideo に変更すれば問題なく再生できるのですが、他の DisplayObject の上に Sprite 内に配置したビデオを表示する必要があるので、これは使えません。

なので、ビデオを FLV(On2 VP6) に変えてみたらなんとか再生できたのですが、FLV だと画質的にはちょっとアレで…これじゃぁ地味に不便なので、はやく改善されればいいなーと思っております。

もしくは Video で H.264 を再生できる方法をご存じの方はお教えいただければと…

というわけで今回の検証コードです。

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.StageVideoAvailabilityEvent;
	import flash.geom.Rectangle;
	import flash.media.StageVideo;
	import flash.media.StageVideoAvailability;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	
	[SWF( width = '1024', height = '768', frameRate = '30', backgroundColor = '0' )]
	
	public class VideoTest extends Sprite
	{
		
		private var _stageVideos:Vector.<StageVideo> = stage.stageVideos;
		
		public function VideoTest()
		{
			super();
			
			//
			var nc:NetConnection = new NetConnection;
			nc.connect( null );
			var ns:NetStream = new NetStream( nc );
			var client:Object = {};
			client.onMetaData = onMetaData;
			ns.client = client;
			
			
			// -------------- Video だと H.264 は再生できない ------------------/
			
			/*
			
			var video:Video = new Video( 1024, 768 );
			addChild( video );
			video.attachNetStream( ns );
			ns.play( "video/test.mp4" ); // 再生できない
			ns.play( "video/test.flv" ); // 再生できる
			
			*/
			
			
			// -------------- StageVideo だと H.264 でも再生できる ------------------/
			
			stage.addEventListener( StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, onAvalilabtily );
			
			function onAvalilabtily( e:StageVideoAvailabilityEvent ):void
			{
				var avalilable:Boolean = e.availability == StageVideoAvailability.AVAILABLE;
				
				if(avalilable)
				{
					var stageVideo:StageVideo = _stageVideos[ 0 ];
					stageVideo.attachNetStream( ns );
					stageVideo.viewPort = new Rectangle( 0, 0, 1024, 768 );
					
					ns.play( "video/test.mp4" );
				}
				else
				{
					trace( e.availability );
				}
			}
			
			function onMetaData():void {}
			
		}
	}
}

あっ、やっぱりここにも使えないって書いてあるし…