天天看點

FMS3系列(四):線上視訊錄制、視訊回放

   使用Flash/Flex+FMS實作線上視訊錄制、視訊回放的很簡單的。通過閱讀API文檔後基本都可以實作這個功能,本文也意在抛磚引玉,希望對剛入手這塊的朋友有所幫助。

      首先建立好Flash(ActionScript 3.0)檔案,從元件(可使用Ctrl+F7打開)庫中拖拽相應的元件到Flash舞台上,如下圖:

      界面布局好後我們通過程式設定組見的顯示文本以及為按扭添加事件監聽,建立一個ActionScript類檔案,編寫代碼如下:

 1         public function PublishPlay():void

 2         {

 3             lbName.text="請輸入視訊檔案名:";

 4             btnPublish.label="開始錄制";

 5             btnPublish.addEventListener(MouseEvent.CLICK,onPublishClick);

 6             btnStop.label="停止錄制";

 7             btnStop.addEventListener(MouseEvent.CLICK,onStopHandler);

 8             btnPlay.label="視訊回放";

 9             btnPlay.addEventListener(MouseEvent.CLICK,onPlayHandler);

10             

11             video=new Video();

12             cam = Camera.getCamera();

13             mic = Microphone.getMicrophone();

14             if(cam==null)

15             {

16                 trace("沒檢測到視訊攝像頭");

17             }

18             else

19             {

20                 video.attachCamera(cam);

21             }

22             addChild(video);

23         }

      以上代碼同時實作了将視訊顯示到flash界面上,通過Camera的靜态方法getCamrea()方法可以直接擷取到視訊攝像頭的資料。其中用到的video,cam和mic變量為預先定義好的,如下:

1     private var nc:NetConnection;

2     private var ns:NetStream;

3     private var video:Video;

4     private var cam:Camera;

5     private var mic:Microphone;

      接下來就需要連接配接到FMS伺服器實作視訊錄制功能了,通過NetConnection類實作與FMS伺服器的連接配接,并通過流将視訊資料釋出到FMS伺服器。

 1         private function onPublishClick(evt:MouseEvent):void

 3             nc=new NetConnection();

 4             nc.addEventListener(NetStatusEvent.NET_STATUS,onPublishStatusHandler);

 5             nc.connect("rtmp://localhost/PulishedStreams");

 6         }

 7         

 8         private function onPublishStatusHandler(evt:NetStatusEvent):void

 9         {

10             if(evt.info.code=="NetConnection.Connect.Success")

11             {

12                 ns=new NetStream(nc);

13                 ns.addEventListener(NetStatusEvent.NET_STATUS,onPublishStatusHandler);

14                 ns.client=new CustomClient();

15                 ns.attachCamera(cam);

16                 ns.attachAudio(mic);

17                 ns.publish(tbName.text,"record");

18             }

19         }

      在錄制視訊的時候視訊命名是取的文本輸入框的值作為視訊名,OK,現在測試Flash(Ctrl+Enter),通過點選 按扭開始錄制視訊。通過檢視FMS伺服器的檔案目錄可以看到,剛剛測試錄制的視訊存放于FMS伺服器應用下的streams/_definst_目錄下。詳見下圖所示:

 1 private function onPlayHandler(evt:MouseEvent):void

 4             nc.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);

 8         private function onPlayStatusHandler(evt:NetStatusEvent):void

13                 ns.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);

15                 

16                 video = new Video();

17                 video.attachNetStream(ns);

18                 ns.play(tbName.text,0);

19                 addChild(video);

20             }

21         }

      通過本文的基礎上可以很友善的擴充出線上拍照等多種應用,有興趣的朋友可以去試驗下。下面是本文完整的示例代碼。

package

{

 import flash.net.*;

 import flash.events.*;

 import flash.media.*;

 import flash.display.*;

 import fl.controls.*;

 public class PublishPlay extends Sprite

 {

  private var nc:NetConnection;

  private var ns:NetStream;

  private var video:Video;

  private var cam:Camera;

  private var mic:Microphone;

  public function PublishPlay():void

  {

   lbName.text="請輸入視訊檔案名:";

   btnPublish.label="開始錄制";

   btnPublish.addEventListener(MouseEvent.CLICK,onPublishClick);

   btnStop.label="停止錄制";

   btnStop.addEventListener(MouseEvent.CLICK,onStopHandler);

   btnPlay.label="視訊回放";

   btnPlay.addEventListener(MouseEvent.CLICK,onPlayHandler);

   video=new Video();

   cam = Camera.getCamera();

   mic = Microphone.getMicrophone();

   if(cam==null)

   {

    trace("沒檢測到視訊攝像頭");

   }

   else

    video.attachCamera(cam);

   addChild(video);

  }

  private function onStatusHandler(evt:NetStatusEvent):void

   trace(evt.info.code);

   if(evt.info.code=="NetConnection.Connect.Success")

    ns=new NetStream(nc);

    ns.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);

    ns.client=new CustomClient();

  private function onPublishClick(evt:MouseEvent):void

   nc=new NetConnection();

   nc.addEventListener(NetStatusEvent.NET_STATUS,onPublishStatusHandler);

   nc.connect("rtmp://localhost/PulishedStreams");

  private function onPublishStatusHandler(evt:NetStatusEvent):void

    ns.addEventListener(NetStatusEvent.NET_STATUS,onPublishStatusHandler);

    ns.attachCamera(cam);

    ns.attachAudio(mic);

    ns.publish(tbName.text,"record");

  private function onStopHandler(evt:MouseEvent):void

   nc.close();

  private function onPlayHandler(evt:MouseEvent):void

   nc.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);

  private function onPlayStatusHandler(evt:NetStatusEvent):void

    ns.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);

    video = new Video();

    video.attachNetStream(ns);

    ns.play(tbName.text,0);

    addChild(video);

 }

}

本文轉自 beniao 51CTO部落格,原文連結:http://blog.51cto.com/beniao/153509,如需轉載請自行聯系原作者

繼續閱讀