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

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

  • 相关阅读:
    Android中@id与@+id区别和sharedUserId属性详解*
    Android应用的安全的攻防之战
    Android动态方式破解apk进阶篇(IDA调试so源码)
    Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)
    Android动态方式破解apk终极篇(加固apk破解方式)
    Android中插件开发篇之----动态加载Activity(免安装运行程序)
    Android中插件开发篇之----应用换肤原理解析
    Android中插件开发篇之----类加载器
    Android中的动态加载机制
    Android 编程下Touch 事件的分发和消费机制和OnTouchListener,OnClickListener和OnLongClickListener的关系*
  • 原文地址:https://www.cnblogs.com/luo-super/p/4754563.html
Copyright © 2011-2022 走看看