zoukankan      html  css  js  c++  java
  • Flash+fms视频录制在项目中的实际应用

    Flash+fms视频录制在项目中的实际应用

    前言:以下只是记录本人在项目中的应用,而flash+fms视频录制有多种实现方式,具体可根据实际情况而定!

    1:古人云:工欲善其事,必先利其器,首先安装flash+flash media serverfms),以下主要介绍fms,具体下载以及安装过程略!安装完成之后,可以在windows所有程序Adobe文件夹中找到如下:

     

    接下来 点击 (start adobe media server 5)开启服务,之后,如图:

    打开控制台,在接一下关于控制台的一些介绍就省略了(更多详情网上很多,可以自行搜索!)

    2:接下来在看看fms对应那些文件夹是我们需要多了解的(只是针对视频录制方面):

     

    以上几个文件夹中,重点说一下conf文件夹,因为在实际项目中,如果需要把录制的视频文件直接放到我们自定义的文件夹下面,那么需要在conf文件夹下的ams.ini 中添加对应的站点文件夹路径,举例如下截图:

     

    注:以上 (ewebtempvideo.abc.com为服务器上站点路径),这样在视频录制完成之后,视频就会保存到自己设定的文件夹中了,更多关于fms的还需要自己去查询资料学习(我知道的已差不多就这些了......)

    3flash编写asactionScript)代码:具体代码如下(代码实现方式多种多样,以下只是其中一种实现方式,仅供参考):

     as代码:

    package 
    
    {
    
    import flash.display.MovieClip;
    
    import flash.media.*;
    
    import flash.display.*;
    
    import flash.net.*;
    
    //import fl.controls.*;
    
    import flash.events.*;
    
    import flash.geom.*;
    
    
    import flash.net.NetConnection;
    
    import flash.net.NetStream;
    
    import flash.display.MovieClip;
    
    import flash.net.Responder;
    
    import flash.events.MouseEvent;
    
    import flash.events.NetStatusEvent;
    
    import flash.events.AsyncErrorEvent;
    
    import fl.motion.MotionEvent;
    
    import flash.utils.Timer;
    
    import flash.external.ExternalInterface;
    
    import flash.utils.ByteArray;
    
    import flash.display.Bitmap;
    
    import flash.display.BitmapData;
    
    import flash.display.Sprite;
    
    import flash.net.URLRequest;
    
    import flash.net.navigateToURL;
    
    //需要在脚本设置里面添加abobe核心类库
    
    import com.adobe.images.JPGEncoder;
    
    
    public class ASflashVideo extends Sprite
    
    {
    
    private var cam:Camera;
    
    private var nc:NetConnection;
    
    private var ns:NetStream = null;
    
    private var myVideo:Video;
    
    private var mic:Microphone;
    
    private var mystage:Stage;
    
    private var videoName:String = null;
    
    private var flag:Boolean = false;
    
    private var bitmapData:BitmapData = null;
    
    
    public function ASflashVideo():void
    
    {
    
     
    //注册JavaScript:;
    
    /*方法名用as开头表示此方法是js与as交互的方法*/
    
    ExternalInterface.addCallback("asInit",Init);
    
    ExternalInterface.addCallback("asStartRecord",StartRecord);
    
    ExternalInterface.addCallback("asStopRecord",StopRecord);
    
    ExternalInterface.addCallback("asPlayBackVideo",PlayBackVideo);
    
    //截图:;
    
    ExternalInterface.addCallback("asPrintScreen",PrintScreen);
    
    }
    
    /*初始化,连接fms*/
    
    public function Init(fmsUrl:String):void
    
    {
    
    nc = new NetConnection();
    
    nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
    
    nc.connect("rtmp://"+fmsUrl);
    
    }
    
     
    
    public function onNetStatus(event:NetStatusEvent):Boolean
    
    {
    
    trace(event.info.code);
    
    if (event.info.code == "NetConnection.Connect.Success")
    
    {
    
    ExternalInterface.call("Tips","连接服务器成功!");
    
    return true;
    
    }
    
    else if (event.info.code=="NetStream.Play.Stop")
    
    {
    
    //监听回放处理:
    this.ns.pause();
    ExternalInterface.call("Tips","视频回放结束!");
    return true;
    }
    
    else
    
    {
    return false;
    }
    
    }
    
    /*点击开始录像
    
    初始化摄像头,当用户点击了允许之后才开始录像
    
    */
    
    public function StartRecord(myVideoName:String):Boolean
    
    {
    videoName = myVideoName;
    
    if (flag)
    {
    
    ExternalInterface.call("Tips","您刚才点击了拒绝摄像头请重新刷新页面");
    }
    
    else
    
    {
    ExternalInterface.call("Tips","录像名称为:"+videoName);
    }
     
     
    cam = Camera.getCamera();
    
    //判断是否有摄像头:
    
    if (cam!=null)
    
    {
    
    //初始化摄像头到舞台:(监听用户点击事件)
    
    cam.addEventListener(StatusEvent.STATUS,statusHandler);
    
    
    //默认为320*240
    
    myVideo = new Video();
    
    myVideo.width = 640;
    
    myVideo.height = 480;
    
    cam.setQuality(0,80);
    
    myVideo.x = 10;
    
    myVideo.y = 10;
    
    //设置带宽与图片品质;
    cam.setMode(640,480,20,false);
    cam.setLoopback(true);
    
    //设置压缩:;
    
    myVideo.attachCamera(cam);
    
    addChild(myVideo);
    
    return true;
    
    }
    
    else
    
    {
    
    return false;
    
    }
    
    }
    
    /*捕捉用户点击按钮行为*/
    
    public function statusHandler(event:StatusEvent):void
    
    {
    switch (event.code)
    {
    
    case "Camera.Muted" :
    
    trace("User clicked Deny.");
    
    //将监听事件注册到JavaScript:
    
    flag = true;
    
    ExternalInterface.call("Tips","您点击了拒绝调用摄像头!");
    
    break;
    
    case "Camera.Unmuted" :
    
    trace("User clicked Accept.");
    
    //(用户点击了接受)
    
    //开始录像:
    
    mic = Microphone.getMicrophone();
    
    ns = new NetStream(nc);
    
    ns.attachCamera(cam);
    
    ns.attachAudio(mic);
    
    ns.publish(""+videoName+"","record");
    
    break;
    
    }
    
    }
    
    /*停止录像*/
    
    public function StopRecord():void
    
    {
    
    this.myVideo.attachCamera(null);
    
    this.myVideo.clear();
    
    this.ns.attachCamera(null);
    
    this.ns.close();
    
    ExternalInterface.call("Tips","视频录像已经停止!");
    
    }
    
    public function PlayBackVideo()
    
    {
    
    if (videoName!=null)
    
    {
    
    this.ns.play(videoName);
    
    this.myVideo.attachNetStream(this.ns);
    
    //监听回放完成!
    
    this.ns.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
    
    }
    
    else
    
    {
    
    ExternalInterface.call("Tips","当前没有录像可以回放!");
    
    }
    
    }
    
    /*截图*/
    
    public function PrintScreen():void
    
    {
    
    var jpgSource:BitmapData = new BitmapData(this.myVideo.width,this.myVideo.height);
    
    jpgSource.draw(this.myVideo);
    
    
    var jpgEncoder:JPGEncoder = new JPGEncoder(85);
    
    var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
    
    
    var header:URLRequestHeader = new URLRequestHeader("Content-type","application/octet-stream");
    //此处只是随便写的URL,做请求演示(以下URL将会被重定向,http状态码:302-200),实际过程中需要在后台代码中读取流并转换为图片:
    var jpgURLRequest:URLRequest = new URLRequest("http://www.baidu.com?name=myVideo.jpg");
    
    jpgURLRequest.requestHeaders.push(header);
    
    jpgURLRequest.method = URLRequestMethod.POST;
    
    jpgURLRequest.data = jpgStream;
    
    
    var uploadURLLoader:URLLoader = new URLLoader();
    
    //可以添加监听事件
    
    uploadURLLoader.load(jpgURLRequest);
    
    ExternalInterface.call("Tips","ok");
    
    }
    
    }
    
    }
    
     
    

    view 代码:

      1 <!DOCTYPE html>
      2 <html xmlns="http://www.w3.org/1999/xhtml">
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
      5     <title></title>
      6     <script src="Scripts/jquery-1.10.2.min.js"></script>
      7 </head>
      8 <body>
      9     <div style=" 640px; height: 480px">
     10         <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="480"
     11                 id="ASflashVideo" align="middle">
     12             <!--<param name="flashVars" value="VW=640&VH=480&VFPS=20&VQ=80" />-->
     13             <param name="movie" value="ASflashVideo.swf" />
     14             <param name="quality" value="high" />
     15             <param name="bgcolor" value="#000000" />
     16             <param name="play" value="true" />
     17             <param name="loop" value="true" />
     18             <param name="wmode" value="window" />
     19             <param name="scale" value="showall" />
     20             <param name="menu" value="true" />
     21             <param name="devicefont" value="false" />
     22             <param name="salign" value="" />
     23             <param name="allowScriptAccess" value="always" />
     24             <!--[if !IE]>-->
     25             <object type="application/x-shockwave-flash" data="ASflashVideo.swf"
     26                     width="640" height="480" id="ASflashVideo">
     27                 <!--<param name="flashVars" value="VW=640&VH=480&VFPS=20&VQ=80" />-->
     28                 <param name="movie" value="ASflashVideo.swf" />
     29                 <param name="quality" value="high" />
     30                 <param name="bgcolor" value="#000000" />
     31                 <param name="play" value="true" />
     32                 <param name="loop" value="true" />
     33                 <param name="wmode" value="window" />
     34                 <param name="scale" value="showall" />
     35                 <param name="menu" value="true" />
     36                 <param name="devicefont" value="false" />
     37                 <param name="salign" value="" />
     38                 <param name="allowScriptAccess" value="always" />
     39                 <!--<![endif]-->
     40                 <a href="http://www.adobe.com/go/getflash">
     41                     <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif"
     42                          alt="获得 Adobe Flash Player" />
     43                 </a>
     44                 <!--[if !IE]>-->
     45             </object>
     46             <!--<![endif]-->
     47         </object>
     48     </div>
     49     <div>
     50         请输入录像名称:<input type="text" id="videoName" />
     51         <input type="button" onclick="StartRecord()" value="开始录像" />
     52         <!--<input type="button" onclick="Init()" value="初始化" />-->
     53         <input type="button" onclick="Stop()" value="停止录制" />
     54         <input type="button" onclick="PlayBackVideo()" value="回放" />
     55         <input type="button" onclick="PrintScreen()" value="截图" />
     56 
     57 
     58     </div>
     59 </body>
     60 </html>
     61 <script type="text/javascript">
     62     var swfObject = null;
     63     var fmsUrl = "localhost/testFms";
     64 
     65     //页面加载完成之后再执行:
     66     window.onload = function () {
     67         Init();
     68     };
     69     
     70     function Init() {
     71         getSWFObject();
     72         if (swfObject != null) {
     73             swfObject.asInit(fmsUrl);
     74             console.log("初始化完成!");
     75         } else {
     76             alert("未能获取到对象!");
     77         }
     78     }
     79 
     80     function StartRecord() {
     81         var videoName = $("#videoName").val();
     82         if (videoName.length > 0) {
     83 
     84             var flag=swfObject.asStartRecord(videoName);
     85             console.log(flag);
     86         } else {
     87             alert("录像名称不能为空!");
     88         }
     89     }
     90     function Stop() {
     91         swfObject.asStopRecord();
     92     }
     93     //回放:
     94     function PlayBackVideo()
     95     {
     96 
     97         swfObject.asPlayBackVideo();
     98     }
     99     function PrintScreen() {
    100         var videoName = $("#videoName").val();
    101         swfObject.asPrintScreen();
    102     }
    103     //信息提示:
    104     function Tips(para)
    105     {
    106         alert(para);
    107     }
    108 
    109     //获取swf对象:
    110     function getSWFObject() {
    111         var movieName = "ASflashVideo";
    112         if (document[movieName]) {
    113             swfObject = document[movieName];
    114         } else if (window[movieName]) {
    115             swfObject = window[movieName];
    116         } else if (document.embeds && document.embeds[movieName]) {
    117             swfObject = document.embeds[movieName];
    118         } else {
    119             swfObject = document.getElementById(movieName);
    120         }
    121     }
    122 
    123 </script>
    View Code

    4:在编写as代码需要注意的地方(应该是我之前不会的地方),在需要使用到Adobe核心类库的时候:

     

    5:实现效果图:

     

    tips:实际项目需要在后台代码中将流转换成图片:

    6:最后,相关学习资料:

    --------------------flash as在线API 文档 -----------------------------------

    http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html

    --------------------flash+fms入门教程----------------------------------------

    http://www.nshen.net/article/2007-08-29/fms-tutorial/

    -------------------flash+fms 跨域,安全沙箱 -----------------------------

    参考:http://scn.sap.com/thread/3307666

    --------------------------------------------------------------------------

    adobe核心类库as3corelib-.93.zip下载地址:

    http://pan.baidu.com/s/1c0hR7rE

     -------------------------------------------------------------------------

  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/luo-super/p/4754563.html
Copyright © 2011-2022 走看看