as3でFLVをストリーミングでリピート再生

flvをリピート再生するのに数日悩んでおりました。

ActionScript3でFLVをストリーミングでリピート再生

こちらさんを参考にやってるのだが、clientのonPlayStatus()はいっこうに呼ばれない、、、。そういうもんなのかな。リファレンスを見る限りでは、サーバ用みたいなことがかいてあるので、そういうもんかもしれないな。とりあえずplay/stopあたりとバッファのイベントを使ってできたみたいなので、続きにコードを公開。

import org.flashdevelop.utils.FlashConnect;
import flash.display.Sprite;
import flash.events.*;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.text.*;
 
public class PreviewPanel extends Sprite {
    private var _connection:NetConnection;
    private var _stream:NetStream;
    private var _stopped:Boolean;
    private var _media:String;
 
    public function PreviewPanel() {
        _connection = new NetConnection();
        _connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
        _connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        play("sample.flv");
    }
 
    /** 指定メディアを再生します */
    public function play(media:String):void {
        _media = media;
        if (_connection) _connection.close();
        _connection.connect(null);
    }
 
    private function netStatusHandler(evt:NetStatusEvent):void {
        switch (evt.info.code) {
            case "NetConnection.Connect.Success":
            initVideo();
            break;
            case "NetStream.Play.Start":
            _stopped = false;
            break;
            case "NetStream.Play.Stop":
            _stopped = true;
            break;
            case "NetStream.Buffer.Flush":
            // FlashConnect.trace('flush time: ' + _stream.time);
            break;
            case "NetStream.Buffer.Empty":
            // FlashConnect.trace('emtpty time: ' + _stream.time);
            if (_stopped) {
                stream.play(_media);
            }
            break;
            case "NetStream.Play.StreamNotFound":
            FlashConnect.trace('file not found: ' + _media);
            break;
            default:
            FlashConnect.trace('event: ' + evt.info.code);
        }
    }
 
    /** Videoコンポーネントの初期化 */
    private function initVideo():void {
        _stream = new NetStream(_connection);
        _stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
        _stream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHnadler);
        _stream.client = new StreamClient(_stream);
        var video:Video = new Video(200, 150);
        video.x = 0;
        video.y = 0;
        addChildAt(video, 0);
        video.attachNetStream(_stream);
        _stream.play(_media);
    }
 
    private function asyncErrorHnadler(evt:AsyncErrorEvent):void {
        FlashConnect.trace('async error: ' + evt.toString());
    }
 
    private function securityErrorHandler(evt:SecurityErrorEvent):void {
        FlashConnect.trace('security error: ' + evt.toString());
    }
}

コメント

タイトルとURLをコピーしました