StageVideo クラス (Flash Player の新しいビデオクラス)

Flash Player 10.2 から新しいビデオ機能の Stage Video が追加されますが、既に、Stage Video を利用するための新しいクラス StageVideo の仕様が、公開されています。これは、AIR for TV 用の仕様として公開されたものです。

また、Labs に公開されている、次期 Flex SDK "Hero" のプレビュー版を使うと、StageVideo を利用したコンテンツの開発が行えます。

ということで、この記事では、flash.media.StageVideo クラスの仕様 (現時点の) を解説します。Stage Video の使い方については、前回の記事をご覧下さい。

StageVideo のインスタンスの取得

StageVideo はハードウェア機能を利用します。そのため、スクリプト内で勝手にインスタンスをいくつも作成する、ということはできません。

Stage クラスに新しく追加された stageVideos 属性から、StageVideo のインスタンスを取得します。その際、使えるインスタンスが存在しない、ということもあり得ます。

var vec:Vector.<StageVideo> = stage.stageVideos;
var stageVideo:StageVideo;
if ( vec.length >= 1 )
{
  stageVideo = vec[0];
}
 

利用できる StageVideo の数は、通常 0 から 8 の間です。デバイスでは、0 か 1 になることが多いようです。利用できる StageVideo の数は、その他の状況によっても、都度変わります。

StageVideo が複数ある場合、stage.stageVideos に格納された順に表示されます。例えば、2 つのインスタンスがある場合、stageVideos[0] の StageVideo の前に stage.stageVideos[1] の stageVideos が表示されます。

重なり順は、StageVideo.depth 属性 (型は int) を使って変えることができます。depth の値が小さい StageVideo ほど後に表示されます。depth の値が同じ場合は、stage.stageVideos に格納された順になります。

ストリームの接続

StageVideo では埋め込みビデオは利用できません。NetStream の利用が基本です。

stageVideo.attachNetStream(myNetStream);
 

常に StageVideo が利用できるとは限らないため、実際には、Video にフォールバックできるよう、以下のような記述をすることになると思います。

var vec:Vector.<StageVideo> = stage.stageVideos;
var stageVideo:StageVideo;
if ( vec.length >= 1 )
{
  stageVideo = vec[0]
  stageVideo.attachNetStream(netStream);
} else {
  video.attachNetStream(netStream);
  stage.addChildAt(video, 0);
}
netStream.play("ストリーム名");
 

StageVideoEvent イベント

StageVideo の状態を通知するために、新しいイベントが追加されました。StageVideoEvent.RENDER_STATE です。

StageVideoEvent.RENDER_STATE は、netStream.play() を実行した後、すぐに有効になります。そのため、事前にイベントハンドラーを登録します。下の例では、onStageVideoRenderState() というメソッドを登録しています。

stageVideo = vec[0];
stageVideo.attachNetStream(netStream);
stageVideo.addEventListener(StageVideoEvent.RENDER_STATE, 
                            onStageVideoRenderState);
netStream.play("ストリーム名");
 

StageVideoEvent.RENDER_STATE が通知する状態は、以下の 3 種類です。最初の 2 つは再生が行われている際の状況を示しますが、最後の 1 つは、再生が中断したことを示します。

RENDER_STATUS_ACCELERATED: ビデオのデコードと合成が GPU で行われている
RENDER_STATUS_SOFTWARE   : ビデオのデコードが CPU で行われている
RENDER_STATUS_UNAVAILABLE: GPU によるビデオのデコード/合成が中止された
 

これを使って、例えば、ハードウェア再生が中止されたら、従来のビデオ再生に切り替える、といった処理ができます。デバイスの場合なら、スペックによっては、再生を中断する処理を記述するのもよさそうです。

function onStageVideoRenderState(event:StageVideoEvent)
{
  if ( event.status == StageVideoEvent.RENDER_STATUS_UNAVAILABLE ) 
  {
    video.attachNetStream(netStream);
    stage.addChildAt(video, 0);
    netStream.play("ストリーム名");
  }
} 

StageVideo を使って再生を開始した後でも、StageVideo が途中で利用できなくなることがあります。反対に、最初は使えなかったのに、途中から StageVideo のインスタンスが利用可能になることもあります。例えば、wmode="window" の設定で読み込まれた SWF がフルスクリーンモードになったら、一時的に StageVideo が利用できた、というのはありそうなパターンです。

そのため、常に StageVideo と Video の間を切り替えられるようにしておくのが良いと思われます。StageVideo が利用可能になったことを知らせるため、Stage クラスに StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY イベントが追加されています。

長くなったので、次回に続きます。

 

トラックバック(0)

トラックバックURL: http://cuaoar.jp/mt4/mt-tb.cgi/136

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261