FlexやFlash(not in Air)でローカルのビデオを再生できるか?(2011年版)
以前にもFlexやFlashにおいてFileReferenceを使ってローカルビデオを読み込んで再生できないものかと調べたことがある。その時は結局ムリという結論に達した。
琴線探査: FlexやFlash(not in Air)でローカルのビデオを再生できるか?
現状もあまり変わっていないようだけど、APIドキュメントを改めて見ていて、ひとつだけ重要な変化があったことに気がついた。flash.net.NetStreamだ。
その変更点は10.1から追加されたメソッドappendBytes()。確か以前に調べてたときはこのメソッドは無かったと思う。これがあれば、FileReferenceで読み込んだローカルビデオのバイト列を読み込ませることができるのではないか?
できた!
ポイントとなるコードだけ抜き出しておこう。
本当はspark.components.VideoDisplayで再生させたいけど、VideoDisplay.sourceがバイト列を受け付けるようになるか、VideoDisplay.loadBytes()とか、そういうのが無いとやっぱ無理。
flash.media.Videoはビデオを表示するだけでまったくコントロールする方法がないけれど、NetStreamの方に色々とコントロールできそうなメソッドがあるので、何とかなりそう。
かと思ったけど、pause()とresume()は正常だけどseek()およびstep()がまともに動作しない由。ネットからストリームしていないからだろうか。原因不明。
とにかく、Flex/Flashでローカルビデオを扱うのはまだまだ難しいということがわかった。
琴線探査: FlexやFlash(not in Air)でローカルのビデオを再生できるか?
現状もあまり変わっていないようだけど、APIドキュメントを改めて見ていて、ひとつだけ重要な変化があったことに気がついた。flash.net.NetStreamだ。
その変更点は10.1から追加されたメソッドappendBytes()。確か以前に調べてたときはこのメソッドは無かったと思う。これがあれば、FileReferenceで読み込んだローカルビデオのバイト列を読み込ませることができるのではないか?
できた!
ポイントとなるコードだけ抜き出しておこう。
protected var netStream:NetStream; protected var video:Video; /** * アプリケーション初期化完了時 * */ protected function onCreationComplete():void { //NetConnection構築 var netConn:NetConnection = new NetConnection(); netConn.connect(null); //NetStream構築 netStream = new NetStream(netConn); var client:Object = new Object(); netStream.client = client; client.onMetaData = onMetaData; //これは指定しないとダメ function onMetaData(param:Object):void { video.width = param.width; video.height = param.height; } //Videoオブジェクト構築 video = new Video(); video.attachNetStream(netStream); //Videoは直接Groupに追加できないのでUIComponentでラップしてから追加 var videoUI:UIComponent = new UIComponent(); videoUI.addChild(video); videoGroup.addElement(videoUI); } /** * ファイル選択時 * */ protected function onFileSelected():void { //FileReferenceに追加するイベントリスナーを掃除するメソッド function removeEventListeners():void { fileReference.removeEventListener(Event.COMPLETE, onComplete); fileReference.removeEventListener(IOErrorEvent.IO_ERROR, onIoError); } //IOエラー時の処理追加 fileReference.addEventListener(IOErrorEvent.IO_ERROR, onIoError); function onIoError(evt:IOErrorEvent):void { log.info("onIoError() IOエラー"); removeEventListeners(); } //バイト列読み込み完了時の処理追加 fileReference.addEventListener(Event.COMPLETE, onComplete); function onComplete(evt:Event):void { log.info("onComplete() バイト列読み込み完了:" + fileReference.size); removeEventListeners(); netStream.play(null); //appendBytes*より前でないとダメ netStream.appendBytesAction(NetStreamAppendBytesAction.RESET_BEGIN); netStream.appendBytes(fileReference.data); //ここがミソ } //バイト列読み込み開始 fileReference.load(); }
本当はspark.components.VideoDisplayで再生させたいけど、VideoDisplay.sourceがバイト列を受け付けるようになるか、VideoDisplay.loadBytes()とか、そういうのが無いとやっぱ無理。
flash.media.Videoはビデオを表示するだけでまったくコントロールする方法がないけれど、NetStreamの方に色々とコントロールできそうなメソッドがあるので、何とかなりそう。
かと思ったけど、pause()とresume()は正常だけどseek()およびstep()がまともに動作しない由。ネットからストリームしていないからだろうか。原因不明。
とにかく、Flex/Flashでローカルビデオを扱うのはまだまだ難しいということがわかった。
コメント
コメントを投稿