Кстати, что касается паузы. Если внести немного изменений в вышеописанную реализацию шаблона состояния, то можно в него добавить состояние паузы.
Реализация на примере видеопотока с именем test.flv

Код:
Видеоплеер с состояниями: расширение паузой
1. Интерфейс состояния
State.as
2. Классы контекста состояния
StopState.as - состояние проигрывание остановлено
PlayState.as - состояние проигрывания
PauseState.as - состояние паузы
3. Контекстный класс
VideoWorks.as
4. Кнопки
NetBtn.as - кнопка для переключения триггеров
BtnState.as - состояния для кнопок переключения
5. Клиент
TestPause.as

Код AS3:
package
{
//State Interface #1
// Интерфейс состояния
import flash.net.NetStream;
internal interface State
{
function startPlay(ns:NetStream,flv:String):void;
function stopPlay(ns:NetStream):void;
function doPause(ns:NetStream):void;// добавлено
}
}

Код AS3:
package
{
//Stop State #2
// Состояние проигрывание остановлено
import flash.net.NetStream;
internal class StopState implements State
{
private var videoWorks:VideoWorks;
public function StopState(videoWorks:VideoWorks)
{
trace("--Stop State--");
this.videoWorks = videoWorks;
}
public function startPlay(ns:NetStream,flv:String):void
{
ns.play(flv);
trace("Begin playing");
videoWorks.setState(videoWorks.getPlayState());
}
public function stopPlay(ns:NetStream):void
{
trace("You're already stopped");
}
// Добавлено
public function doPause(ns:NetStream):void
{
trace("Cannot go to Stop from Pause.");
}
}
}

Код AS3:
package
{
//Play State #3
// Состояние проигрывания
import flash.net.NetStream;
class PlayState implements State
{
private var videoWorks:VideoWorks;
public function PlayState(videoWorks:VideoWorks)
{
trace("--Play State--");
this.videoWorks = videoWorks;
}
public function startPlay(ns:NetStream,flv:String):void
{
trace("You're already playing");
}
public function stopPlay(ns:NetStream):void
{
ns.close();
trace("Stop playing.");
videoWorks.setState(videoWorks.getStopState());
}
// Добавлено
public function doPause(ns:NetStream):void
{
ns.togglePause();
trace("Begin pause.");
videoWorks.setState(videoWorks.getPauseState());
}
}
}

Код AS3:
package
{
//Pause State #4
// Состояние паузы
import flash.net.NetStream;
class PauseState implements State
{
var videoWorks:VideoWorks;
public function PauseState(videoWorks:VideoWorks)
{
trace("--Pause State--");
this.videoWorks = videoWorks;
}
public function startPlay(ns:NetStream,flv:String):void
{
trace("You have to go to unpause");
}
public function stopPlay(ns:NetStream):void
{
trace("Don't go to Stop from Pause");
}
public function doPause(ns:NetStream):void
{
ns.togglePause();
trace("Quit pausing.");
videoWorks.setState(videoWorks.getPlayState());
}
}
}

Код AS3:
package
{
//Context Class #5
// Контекстный класс
import flash.net.NetStream;
internal class VideoWorks
{
private var playState:State;
private var stopState:State;
private var pauseState:State;
private var state:State;
public function VideoWorks()
{
trace("Video Player is on");
playState = new PlayState(this);
stopState = new StopState(this);
pauseState = new PauseState(this);
state = stopState;
}
internal function startPlay(ns:NetStream,flv:String):void
{
state.startPlay(ns,flv);
}
internal function stopPlay(ns:NetStream):void
{
state.stopPlay(ns);
}
// Добавлено
internal function doPause(ns:NetStream):void
{
state.doPause(ns);
}
internal function setState(state:State):void
{
trace("A new state is set");
this.state = state;
}
internal function getState():State
{
return state;
}
internal function getPlayState():State
{
return this.playState;
}
internal function getStopState():State
{
return this.stopState;
}
// Добавлено
internal function getPauseState():State
{
return this.pauseState;
}
}
}

Код AS3:
package
{
//Button for transition triggers
// Кнопка для переключения триггеров
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.display.Shape;
import flash.text.TextFormat;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
public class NetBtn extends SimpleButton
{
public function NetBtn(txt:String)
{
upState = new BtnState(0xfab383,0x9e0039,txt);
downState = new BtnState(0xffffff,0x9e0039,txt);
overState = new BtnState(0x9e0039,0xfab383,txt);
hitTestState = upState;
}
}
}

Код AS3:
package
{
//States for transition buttons
// Состояния для кнопок переключения
import flash.display.Sprite;
import flash.display.Shape;
import flash.text.TextFormat;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
class BtnState extends Sprite
{
public var btnLabel:TextField;
public function BtnState(color:uint,color2:uint,btnLabelText:String)
{
btnLabel = new TextField();
btnLabel.text = btnLabelText;
btnLabel.x = 5;
btnLabel.autoSize = TextFieldAutoSize.LEFT;
var format:TextFormat = new TextFormat("Verdana");
format.size = 12;
btnLabel.setTextFormat(format);
var btnWidth:Number = btnLabel.textWidth + 10;
var bkground:Shape = new Shape();
bkground.graphics.beginFill(color);
bkground.graphics.lineStyle(2,color2);
bkground.graphics.drawRect(0,0,btnWidth,18);
addChild(bkground);
addChild(btnLabel);
}
}
}

Код AS3:
package
{
//Implement FMS2 App and Test State Machine #6
// Имплементация приложения и тестирование автомата
import flash.display.Sprite;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.media.Video;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.events.MouseEvent;
import flash.events.NetStatusEvent;
public class TestPause extends Sprite
{
private var nc:NetConnection=new NetConnection( );
private var ns:NetStream;
private var vid:Video = new Video(320,240);
private var vidTest:VideoWorks;
private var playBtn:NetBtn;
private var stopBtn:NetBtn;
private var flv:String;
private var flv_txt:TextField;
private var dummy:Object;
public function TestPause( )
{
nc.connect(null);
ns = new NetStream(nc);
addChild(vid);
vid.x = stage.stageWidth / 2 - vid.width / 2;
vid.y = stage.stageHeight / 2 - vid.height / 2;
//Instantiate State Machine
// Создаём автомат состояний
vidTest = new VideoWorks();
//Play, Stop and Pause Buttons
// Кнопки проигрывания, остановки и паузы
playBtn = new NetBtn("Play");
addChild(playBtn);
playBtn.x = stage.stageWidth / 2 - 100 + playBtn.width / 2;
playBtn.y = 350;
stopBtn = new NetBtn("Stop");
addChild(stopBtn);
stopBtn.x = stage.stageWidth / 2 - stopBtn.width / 2;
stopBtn.y = 350;
var pauseBtn:NetBtn = new NetBtn("Pause");
addChild(pauseBtn);
pauseBtn.x=(stage.stageWidth / 2 + 100) - pauseBtn.width;
pauseBtn.y = 350;
//Add Event Listeners
// Добавляем обработчики событий
playBtn.addEventListener(MouseEvent.CLICK,doPlay);
stopBtn.addEventListener(MouseEvent.CLICK,doStop);
pauseBtn.addEventListener(MouseEvent.CLICK,pauseNow);
//Add the text field;
// Добавляем текстовое поле
flv_txt = new TextField();
// Имя видеофайла
flv_txt.text = "test";
flv_txt.border = true;
flv_txt.borderColor = 0x9e0039;
flv_txt.background = true;
flv_txt.backgroundColor = 0xfab383;
flv_txt.type = TextFieldType.INPUT;
flv_txt.x = stage.stageWidth / 2 - 45;
flv_txt.y = 10;
flv_txt.width = 90;
flv_txt.height = 16;
addChild(flv_txt);
//This prevents a MetaData error being thrown
// Для предотвращения ошибки мета-данных
dummy = new Object();
ns.client = dummy;
dummy.onMetaData = getMeta;
//NetStream
ns.addEventListener(NetStatusEvent.NET_STATUS,flvCheck);
}
//MetaData
// Мета-данные
private function getMeta(mdata:Object):void
{
trace(mdata.duration);
}
//Handle flv
// Работаем с видеофайлом
private function flvCheck(event:NetStatusEvent):void
{
switch (event.info.code)
{
case "NetStream.Play.Stop" :
vidTest.stopPlay(ns);
vid.clear( );
break;
case "NetStream.Play.StreamNotFound" :
vidTest.stopPlay(ns);
flv_txt.text = "File not found";
break;
}
}
//Start play
// Начинам проигрывание
private function doPlay(e:MouseEvent):void
{
if (flv_txt.text != "" && flv_txt.text !=
"Provide file name")
{
flv_txt.textColor = 0x000000;
flv = flv_txt.text + ".flv";
vidTest.startPlay(ns,flv);
vid.attachNetStream(ns);
}
else
{
flv_txt.textColor = 0xcc0000;
flv_txt.text = "Provide file name";
}
}
//Stop play
// Останавливаем проигрывание
private function doStop(e:MouseEvent):void
{
vidTest.stopPlay(ns);
vid.clear( );
}
//Pause play
// Ставим проигрывание на паузу
function pauseNow(e:MouseEvent):void
{
vidTest.doPause(ns);
}
}
}