UstreamのFlash Client APIのドキュメントがこんな状態でかなり不親切でして、色々と苦心したので今後の為にメモ。
Ustream Client APIを使う時は、まずAPIを操作するClassの定義が詰まったswfを直接Ustream(http://www.ustream.tv/flash/viewer.rsl.swf)から読み込む。そしてこのswfの中のClassを使ってゴニョゴニョする。
ローカルで実行する時はあらかじめ「viewer.rsl.swf」をローカルにダウンロードしておき、これを読み込んで使う。
※読み込む配信チャンネルが有料のアドフリーアカウントでない場合、www.ustream.tvからviewer.rsl.swfを読み込むと、ビデオ内広告用のデータが読み込まれる。このビデオ内広告がエラーを吐いており、Flashが停止してしまう(2012.12.07時点)。無料アカウントでテストする時は注意。
viewer.rsl.swf、viewer.rsl.swc等はここから一式ダウンロードできる。
自分がこのAPIを使った時は、API(Logicクラス)を叩く処理をUstreamPlayerクラス(仮)というクラスに封じ込めておいた。このUstreamPlayerクラスを直にnewしてしまうとUstreamPlayer内で参照しているローカルのswcを呼んでしまうため、getDefinitionByNameを使ってインスタンス化する。こうすればviewer.rsl.swcを外部ライブラリ(swfには含めない)として参照することができるので、オンラインのviewer.rsl.swfと、ローカルのviewer.rsl.swfの内部の挙動が違っていてもエラーは出なくなる(ハズ)。
UstreamPlayerの実装は下記の通り。※Channel IDとRecorded IDを直書きしてしまっている部分は外部から設定ができるように修正したいところ。
Channel/Recordedのprogressが壊れていて、配信中のビデオの読み込みの進捗が取得できないので、ChannelのstreamRectの値を監視して、値がnullじゃなくなったら読み込み完了と見なす。
あとLogicのdisplayはビデオではなく、プレーヤーのことなので、このdisplayのwidthとheightをいじってもビデオのサイズはアスペクト比を保ったままになってしまい、この値をいじっても意図したサイズにビデオをリサイズできない。ビデオを意図したサイズにリサイズさせるために、displayをビデオと同じサイズにリサイズし、displayを空のSpriteに突っ込み、このSpriteをリサイズする。ビデオのサイズは上記のstreamRectを参照する。