RTMP(FMS 3.5)でBitmapData.drawするときにはまったポイント

たまにはコアなネタも投稿。ActionScript 3.0のBitmapData.drawメソッドで、RTMPのストリーミングビデオ/ライブ映像をキャプチャしようとしてはまったのでメモとしてブログに残しておきます。

FMSを用いたRTMPストリーミングは、コンテンツの複製防止のためにローカルにキャッシュを残さずにFLV/F4Vを送信できる方法ですが、これをBitmapData.drawできたら、もともこもないという話。試しにdrawしようとすると、次のエラーがでます。

SecurityError: Error #2123: セキュリティサンドボックス侵害 : BitmapData.draw: xxx.swf は rtmp://xxx/live にアクセスできません。ポリシーファイルへのアクセスも許可されていません。

ポリシーファイルということは、クロスドメイン!?と思うのが世の常。HTTP/HTTPSプロトコルであれば別ドメインにcrossdomain.xmlを設置するのは周知の事実ですが、RTMPプロトコルだといかんせん方法が不明。試しにFMSのアプリケーションフォルダ以下に適当に置いてみても全く効果なし。Flash Player 9.0.115より前ではセキュリティーホール的な裏技があったみたいですが、エンドユーザーのマイナーバージョン依存に頼るのは明らかにNG。(一応、過去バージョンのFlash Player 9.0.44を入れて裏技で試したら、確かにポリシーファイル問題は起こらずdrawできましたが…)

このあたりの情報は次の記事が詳しいです。

サーバー弄るのが面倒だったので、クロスドメイン突破できればいいやってことでAdobe AIRで挑戦。AIRだとcrossdomain.xmlなしで色々と読め込めることも割と知られています。FlexBuilderでサクッとブラウザ版からAIR版に移植。ところが、同じエラーが発生。よく考えれば、エラーになるのは当然の挙動でAIRでRTMPのdrawが可能なら、さらにローカルにストリーミングを保存しやすくなりますしね。

ということで、サーバーを弄ることに。結果からいうとFMSのApplication.xmlファイルを修正することで対応できました。

Flash Media Server 3.5conf_defaultRoot__defaultVHost_
のフォルダにある Application.xml をテキストエディターで開いて

<AudioSampleAccess enabled="false"></AudioSampleAccess>
<VideoSampleAccess enabled="false"></VideoSampleAccess>

になっている箇所を以下のように修正するとOK。

<AudioSampleAccess enabled="true">/</AudioSampleAccess>
<VideoSampleAccess enabled="true">/</VideoSampleAccess>

特定のアプリケーションフォルダだけに指定したければ、次のように指定する

<AudioSampleAccess enabled="true">/live</AudioSampleAccess>
<VideoSampleAccess enabled="true">/live</VideoSampleAccess>

参考記事として Adobe Forums: Bitmap data & FMS 3.5に詳細が掲載されてます。

そしてもう一個注意すべき点は、上記設定をしていてもストリーミングが始まったタイミング(NetStream.Play.Start)ではエラーが発生し、3~5秒ぐらいたってからはじめてdrawができるようになるということ。このタイミング差は検証不足で何のイベント発生後かは特定できてませんが、それまではエラーが発生するのでBitmapData.drawをtry〜catch構文で囲ってエラーを沈めてやりました。

try {
    mybitmapdata.draw(_video);
} catch (error:Error) {}

※このタイミング差がわからず、何時間もサーバー担当と苦戦しました。。

ネット上にFMS系の情報が少ないので調べるのに苦労したのですが、もし困っている人がいたら参考にしてください。。

余談 : heteml

調査のためにレンタルサーバー「heteml」のFMSに申し込んだのですが、application.xmlを弄れずに断念しました。
困ったというか要望になるのですが、hetemlのFMS 2はhetemlのサーバー上でのみしかrtmpに接続できない上に、ローカルからFMSに接続できません。デバッグしにくい上に、AIRなどにおいてもローカルから接続できないので使用用途が限定されていると思いました。ぜひローカルからもつなげられるようになってほしいです!
(とはいえ、あの価格でFMSを利用できるのはとてもお得なのですけどね。。)

余談 : ustream

最近流行中のUstreamですが、Flash 用のAPIがあるのでこちらでもチャレンジ。

手軽にFlashのクライアントビューアーを呼び出すことができたのですが、これもビューアーをBitmapData.drawするとNG。例のエラーが表示されます。さすがにUstreamぐらい大きなサービスになるとVideoSampleAccessを有効にするのはだめだよなぁ、ということでUstreamをBitmapData.draw用として使うのは諦めました。

余談 : Live MotionVR Player

FMS弄っていたのは、これの開発のため。当ブログで初期の頃のメインテーマであったパノラマVR。これの動画版で、かつリアルタイム中継ができるというプレイヤーを開発してました。下のキャプチャがLive MotionVR Playerですが、リアルタイム中継されており、かつ360度の視点をマウスで操作できるという代物です。

091211-live-motionvr

明日の12/12(土)にApple Store, Ginzaにて発表をするので、すごい直前ですがもし興味がございましたらお越し下さいませ。

投稿者 : 池田 泰延

BookMark

ブックマークはこちらからどうぞ。

このエントリーをはてなブックマークに追加