天天看點

Flex與.NET互操作(十三):FluorineFx.Net實作視訊錄制與視訊回放

本文主要介紹使用FluorineFx.Net來實作視訊錄制與視訊回放,FluorineFx如同FMS一樣,除了有AMF通信,RTMP協定,RPC和遠端共享對象外,它同樣具備視訊流服務的功能。通過它我們可以非常友善的實作線上視訊錄制、視訊直播、視訊聊天以及視訊會議等類似應用程式的開發。

      首先我們來看看使用FluorineFx服務端是如何開發的,建立ApplicationAdapter是必然的,這裡我們為本文中的示例程式建立的ApplicationAdapter為VideoApplication,并為其添加RemotingServiceAttribute如下代碼塊:

namespace Fx.Adapter

{

    /// <summary>

    /// 視訊應用

    /// </summary>

    [RemotingService]

    public class VideoApplication : ApplicationAdapter

    {

        public override bool AppStart(IScope application)

        {

            return base.AppStart(application);

        }

        public override bool AppConnect(IConnection connection, object[] parameters)

            return base.AppConnect(connection, parameters);

    }

}

      ApplicationAdapter模闆所提供的方法在實際項目開發中根據自己的需求去重寫,這裡不作過多介紹。光是這樣還是不能實作視訊的錄制和回放的功能,這隻是實作了基本的啟動應用程式和用戶端連接配接等基本功能,要想實作視訊錄制和回放,我們還得讓VideoApplication實作IStreamService接口,該接口提供了實作視訊釋出和播放的相應功能,其定義如下:

namespace FluorineFx.Messaging.Api.Stream

    [CLSCompliant(false)]

    public interface IStreamService : IScopeService, IService

        void closeStream();

        int createStream();

        void deleteStream(int streamId);

        void deleteStream(IStreamCapableConnection connection, int streamId);

        void pause(bool pausePlayback, double position);

        void play(bool dontStop);

        void play(string name);

        void play(string name, double start);

        void play(string name, double start, double length);

        void play(string name, double start, double length, bool flushPlaylist);

        void publish(bool dontStop);

        void publish(string name);

        void publish(string name, string mode);

        void receiveAudio(bool receive);

        void receiveVideo(bool receive);

        void releaseStream(string streamName);

        void seek(double position);

      OK,有了應用處理器接下來在FluorineFx網站的apps中添加應用程式(VideoApp),并配置好由此處理器來處理視訊錄制和回放。

<?xml version="1.0" encoding="utf-8"?>

<configuration>

    <application-handler type="Fx.Adapter.VideoApplication"/>

</configuration>

      要使用RTMP協定,那麼配置RTMP通信信道肯定是不能少的,在配置檔案WEB-INF/flex/service-config.xml中配置使用RTMP協定的通信信道。

?xml version="1.0" encoding="utf-8" ?>

<services-config>

  <channels>

    <channel-definition id="my-rtmp" class="mx.messaging.channels.RTMPChannel">

      <endpoint uri="rtmp://{server.name}:1617" class="flex.messaging.endpoints.RTMPEndpoint"/>

    </channel-definition>

  </channels>

</services-config>

       于此FluorineFx伺服器端“基本”算是完成了。下面轉到用戶端的開發,建立Flex項目并設計好界面,如下圖:            

      建立與FluorineFx伺服器上應用程式的連接配接,連接配接成功則将自己的視訊資料顯示到界面上,如下實作代碼:

private function connectionServer(event:MouseEvent):void

    nc = new NetConnection();

    nc.connect("rtmp://localhost:1617/VideoRecord","beniao","123456");

    nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStautsHandler);

    nc.client = this;

private function onNetStautsHandler(event:NetStatusEvent):void

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

        cam = Camera.getCamera();

        if(cam != null)

            this.myVideo.attachCamera(cam);

        else

            Alert.yesLabel = "确定";

            Alert.show("沒有檢測到視訊攝像頭","系統提示");

      錄制視訊也就是将自己本機的視訊攝像頭擷取的視訊資料以及音頻裝置的資料附加到網絡流(NetStream),使用網絡流的publish()方法将流釋出到伺服器上,這和使用FMS是相同的。

private function onRecordVideo(event:MouseEvent):void

    if(this.nc)

        var mic:Microphone = Microphone.getMicrophone();

        ns = new NetStream(this.nc);

        ns.attachCamera(cam);

        ns.attachAudio(mic);

        ns.client = this;

        ns.publish(this.videoName.text,"record");

        this.btnStart.enabled = false;

        this.btnEnd.enabled = true;                

private function onStopRecord(event:MouseEvent):void

        this.nc.close();

        this.btnStart.enabled = true;

        this.btnEnd.enabled = false;

        this.btnPlay.enabled = true;

      停止視訊錄制的功能就更加簡單了,直接斷開目前用戶端與伺服器端的連接配接就可以,使用網絡連接配接(NetConnection)的close()方法。 

     錄制好的視訊将會儲存在網站下的apps/VideoApp/stream目錄中,如下圖:                              

      實作錄制的視訊回放實際上就是播放伺服器上的一個.flv視訊檔案,同樣需要先建立與伺服器端的網絡連接配接,通過網絡流去加載指定的視訊檔案,最後将其顯示到應用界面上。

private function onPlayVideo(event:MouseEvent):void

    nc.addEventListener(NetStatusEvent.NET_STATUS,onPlayNetStautsHandler);

private function onPlayNetStautsHandler(event:NetStatusEvent):void

        var video:Video = new Video();

        video.width = 320;

        video.height = 240;

        video.attachNetStream(this.ns);

        this.myVideo.addChild(video);

        this.ns.play(this.videoName.text);

      到此就完成了使用FluorineFx.Net來實作視訊錄制和回放的功能,接下來我們來看看FluorineFx對釋出錄制視訊流以及實況視訊流的安全方面是怎麼處理的。FluorineFx.Messaging.Api.Stream.IStreamPublishSecurity接口就是專門用來處理釋出流是的安全處理的,如果要對釋出流進行安全方面的處理,那麼就自定義一個實作該接口的安全政策類,在政策類裡根據自己的實際情況來處理安全設定。

      通過該安全政策類可以很友善的判斷釋出流的類型、流的名稱以及對釋出流進行授權等相關操作。如下安全政策類:

    public class PublishSecurity : IStreamPublishSecurity

        public bool IsPublishAllowed(IScope scope, string name, string mode)

            //是否為錄制流

            if (!"record".Equals(mode))

            {

                return false;

            }

            //檔案名是否以test開頭

            if (!name.StartsWith("test"))

            else

                return true;

      在應用處理程式裡通過ApplicationAdapter提供的RegisterStreamPublishSecurity()方法注冊安全政策,該方法的定義如下所示:

public void RegisterStreamPublishSecurity(IStreamPublishSecurity handler); 

      要注冊釋出流的安全政策,通常都是在應用程式啟動中注冊,如下代碼塊:

public override bool AppStart(IScope application)

    RegisterStreamPublishSecurity(new PublishSecurity());

    return base.AppStart(application);

      通過RegisterStreamPublishSecurity()方法注冊好釋出流的安全政策後,每次釋出流都會通過自定義的安全政策來檢測目前釋出流是否符合自定義的安全規則。這樣一友善可以保證别人惡意連接配接到你的應用程式進行流的釋出,消耗網絡帶寬等多中不利現象,更多的好處還待研究。

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

繼續閱讀