在线视频录制、视频回放-FMS3系列(四)

 使用Flash/Flex+FMS实现在线视频录制、视频回放的很简单的。通过阅读API文档后基本都可以实现这个功能,本文也意在抛砖引玉,希望对刚入手这块的朋友有所帮助。

      首先建立好Flash(ActionScript 3.0)文件,从组件(可使用Ctrl+F7打开)库中拖拽相应的组件到Flash舞台上,如下图:

            SPUI.jpg

      界面布局好后我们通过程序设置组见的显示文本以及为按扭添加事件监听,新建一个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
 2          {
 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_目录下。详见下图所示:

            SPfile.jpg

      录制功能完成了,通过测试也可以成功的录制视频。最后我们通过程序来播放刚刚录制是视频。关于播放视频在上一篇文章《FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇》中已介绍怎么实现,这里就直接帖出代码不做解释。

 1  private  function onPlayHandler(evt:MouseEvent): void
 2          {
 3              nc = new  NetConnection();
 4              nc.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);
 5              nc.connect( " rtmp://localhost/PulishedStreams " );
 6          }
 7          
 8           private  function onPlayStatusHandler(evt:NetStatusEvent): void
 9          {
10               if (evt.info.code == " NetConnection.Connect.Success " )
11              {
12                  ns = new  NetStream(nc);
13                  ns.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);
14                  ns.client = new  CustomClient();
15                  
16                  video  =   new  Video();
17                  video.attachNetStream(ns);
18                  ns.play(tbName.text, 0 );
19                  addChild(video);
20              }
21          }

 

      通过本文的基础上可以很方便的扩展出在线拍照等多种应用,有兴趣的朋友可以去试验下。下面是本文完整的示例代码。

ContractedBlock.gif ExpandedBlockStart.gif 本文完整示例代码
 1None.gifpackage
 2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 3InBlock.gif    import flash.net.*;
 4InBlock.gif    import flash.events.*;
 5InBlock.gif    import flash.media.*;
 6InBlock.gif    import flash.display.*;
 7InBlock.gif    import fl.controls.*;
 8InBlock.gif    
 9InBlock.gif    public class PublishPlay extends Sprite
10ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
11InBlock.gif        private var nc:NetConnection;
12InBlock.gif        private var ns:NetStream;
13InBlock.gif        private var video:Video;
14InBlock.gif        private var cam:Camera;
15InBlock.gif        private var mic:Microphone;
16InBlock.gif        
17InBlock.gif        public function PublishPlay():void
18ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
19InBlock.gif            lbName.text="请输入视频文件名:";
20InBlock.gif            btnPublish.label="开始录制";
21InBlock.gif            btnPublish.addEventListener(MouseEvent.CLICK,onPublishClick);
22InBlock.gif            btnStop.label="停止录制";
23InBlock.gif            btnStop.addEventListener(MouseEvent.CLICK,onStopHandler);
24InBlock.gif            btnPlay.label="视频回放";
25InBlock.gif            btnPlay.addEventListener(MouseEvent.CLICK,onPlayHandler);
26InBlock.gif            
27InBlock.gif            video=new Video();
28InBlock.gif            cam = Camera.getCamera();
29InBlock.gif            mic = Microphone.getMicrophone();
30InBlock.gif            if(cam==null)
31ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
32InBlock.gif                trace("没检测到视频摄像头");
33ExpandedSubBlockEnd.gif            }

34InBlock.gif            else
35ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
36InBlock.gif                video.attachCamera(cam);
37ExpandedSubBlockEnd.gif            }

38InBlock.gif            addChild(video);
39ExpandedSubBlockEnd.gif        }

40InBlock.gif        
41InBlock.gif        private function onStatusHandler(evt:NetStatusEvent):void
42ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
43InBlock.gif            trace(evt.info.code);
44InBlock.gif            if(evt.info.code=="NetConnection.Connect.Success")
45ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
46InBlock.gif                ns=new NetStream(nc);
47InBlock.gif                ns.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);
48InBlock.gif                ns.client=new CustomClient();
49ExpandedSubBlockEnd.gif            }

50ExpandedSubBlockEnd.gif        }

51InBlock.gif        
52InBlock.gif        private function onPublishClick(evt:MouseEvent):void
53ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
54InBlock.gif            nc=new NetConnection();
55InBlock.gif            nc.addEventListener(NetStatusEvent.NET_STATUS,onPublishStatusHandler);
56InBlock.gif            nc.connect("rtmp://localhost/PulishedStreams");
57ExpandedSubBlockEnd.gif        }

58InBlock.gif        
59InBlock.gif        private function onPublishStatusHandler(evt:NetStatusEvent):void
60ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
61InBlock.gif            if(evt.info.code=="NetConnection.Connect.Success")
62ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
63InBlock.gif                ns=new NetStream(nc);
64InBlock.gif                ns.addEventListener(NetStatusEvent.NET_STATUS,onPublishStatusHandler);
65InBlock.gif                ns.client=new CustomClient();
66InBlock.gif                ns.attachCamera(cam);
67InBlock.gif                ns.attachAudio(mic);
68InBlock.gif                ns.publish(tbName.text,"record");
69ExpandedSubBlockEnd.gif            }

70ExpandedSubBlockEnd.gif        }

71InBlock.gif        
72InBlock.gif        private function onStopHandler(evt:MouseEvent):void
73ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
74InBlock.gif            nc.close();
75ExpandedSubBlockEnd.gif        }

76InBlock.gif        
77InBlock.gif        private function onPlayHandler(evt:MouseEvent):void
78ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
79InBlock.gif            nc=new NetConnection();
80InBlock.gif            nc.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);
81InBlock.gif            nc.connect("rtmp://localhost/PulishedStreams");
82ExpandedSubBlockEnd.gif        }

83InBlock.gif        
84InBlock.gif        private function onPlayStatusHandler(evt:NetStatusEvent):void
85ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
86InBlock.gif            if(evt.info.code=="NetConnection.Connect.Success")
87ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
88InBlock.gif                ns=new NetStream(nc);
89InBlock.gif                ns.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);
90InBlock.gif                ns.client=new CustomClient();
91InBlock.gif                
92InBlock.gif                video = new Video();
93InBlock.gif                video.attachNetStream(ns);
94InBlock.gif                ns.play(tbName.text,0);
95InBlock.gif                addChild(video);
96ExpandedSubBlockEnd.gif            }

97ExpandedSubBlockEnd.gif        }

98ExpandedSubBlockEnd.gif    }

99ExpandedBlockEnd.gif}

 
source:http://beniao.cnblogs.com/

转载于:https://www.cnblogs.com/zhouchaoyi/articles/1752277.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值