根据网上的代码,自己整理了一下,做了一个录像的客户端。
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
- creationComplete="init()">
- <mx:Script>
- <![CDATA[
- import mx.controls.Alert;
- private var nc:NetConnection = null;
- private var ns:NetStream = null;
- private var video:Video = null;
- private var camera:Camera = null;//定义一个摄像头
- private var mic:Microphone; //定义一个麦克风
- private var rtmp_url:String = "rtmp://192.168.61.115/red5_app";
- private var videoName:String = ""; //视频保存名字
- private function init():void{
- //nc = new NetConnection();
- setupCameraAndMic(); //该方法表示初始化摄像头和麦克风,代码以后都可以直接复制用
- }
- private function setupCameraAndMic():void{
- camera = Camera.getCamera();
- if(camera != null){
- camera.addEventListener(StatusEvent.STATUS,cameraStatus);
- camera.setMode(320,240,30);
- camera.setQuality(0,70);
- video = new Video();
- video.width = 320;
- video.height = 240;
- video.attachCamera(camera);
- videoPlay.addChild(video);
- }
- mic = Microphone.getMicrophone();
- if(mic != null){
- mic.addEventListener(StatusEvent.STATUS,micStatus);
- mic.setSilenceLevel(0,-1); //设置麦克风保持活动状态并持续接收集音频数据
- mic.gain = 80; //设置麦克风声音大小
- }
- }
- private function cameraStatus(event:StatusEvent):void{
- if(!camera.muted){
- startRecord.enabled = true;
- //error_label.text = error_label.text + "1";
- }else{
- error_label.text = error_label.text + " 无法找到摄像头"
- }
- //camera.removeEventListener(StatusEvent.STATUS,cameraStatus);
- }
- /* 好像麦克风没法检测,测试过拔掉麦克风,但是没效果 */
- private function micStatus(event:StatusEvent):void{
- if(!mic.muted){
- startRecord.enabled = true;
- //error_label.text = error_label.text + "2";
- }else{
- error_label.text = error_label.text + " 无法找到麦克风";
- }
- //mic.removeEventListener(StatusEvent.STATUS,micStatus);
- }
//以上代码都是直接复制过来用的,通用的,下面的代码才是真正要写的
- /*点击 开始录像 按钮*/
- private function clickStartRecord():void{
- nc = new NetConnection();
- nc.addEventListener(NetStatusEvent.NET_STATUS,nsHandler);
- nc.connect(rtmp_url); //连接red5
- //doStart();
- }
- private function nsHandler(evt:NetStatusEvent):void{
- if(evt.info.code == "NetConnection.Connect.Success"){ //如果连接成功
- doStart();
- }else{
- Alert.show("连接失败");
- }
- }
- /*开始录像*/
- private function doStart():void{
- if(video != null){
- video.clear();
- videoPlay.removeChild(video);
- video = new Video();
- video.width = 320;
- video.height = 240;
- video.attachCamera(camera);
- videoPlay.addChild(video);
- }
- ns = new NetStream(nc);
- ns.attachCamera(camera);
- ns.attachAudio(mic);
- videoName = "tuping_"+Math.random()+getTimer();
- ns.publish(videoName,"record");
- startRecord.enabled = false;
- stopRecord.enabled = true;
- }
- private function clickStopRecord():void{
- ns.close();
- video.clear();
- videoPlay.removeChild(video);
- startRecord.enabled = true;
- stopRecord.enabled = false;
- init();/*重新初始化Camera,否则Camera会默认使用完了,不再显示图像*/
- }
- ]]>
- </mx:Script>
- <mx:Panel x="213" y="175" width="360.5" height="301" layout="absolute">
- <mx:VideoDisplay x="10" y="10" width="320" height="240" id="videoPlay"/>
- </mx:Panel>
- <mx:Button x="270" y="498" label="开始录像" id="startRecord"
- click="clickStartRecord()" enabled="false"/>
- <mx:Button x="432" y="498" label="停止录像" id="stopRecord"
- click="clickStopRecord()" enabled="false"/>
- <!--
- <mx:Button x="442" y="498" label="播放录像" id="playRecord" enabled="false"/>
- -->
- <mx:Label text="错误:" x="213" y="544" width="360.5" height="25"
- id="error_label" fontSize="12"/>
- </mx:Application>
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[ import mx.controls.Alert; private var nc:NetConnection = null; private var ns:NetStream = null; private var video:Video = null; private var camera:Camera = null;//定义一个摄像头 private var mic:Microphone; //定义一个麦克风 private var rtmp_url:String = "rtmp://192.168.61.115/red5_app"; private var videoName:String = ""; //视频保存名字 private function init():void{ //nc = new NetConnection(); setupCameraAndMic(); } private function setupCameraAndMic():void{ camera = Camera.getCamera(); if(camera != null){ camera.addEventListener(StatusEvent.STATUS,cameraStatus); camera.setMode(320,240,30); camera.setQuality(0,70); video = new Video(); video.width = 320; video.height = 240; video.attachCamera(camera); videoPlay.addChild(video); } mic = Microphone.getMicrophone(); if(mic != null){ mic.addEventListener(StatusEvent.STATUS,micStatus); mic.setSilenceLevel(0,-1); //设置麦克风保持活动状态并持续接收集音频数据 mic.gain = 80; //设置麦克风声音大小 } } private function cameraStatus(event:StatusEvent):void{ if(!camera.muted){ startRecord.enabled = true; //error_label.text = error_label.text + "1"; }else{ error_label.text = error_label.text + " 无法找到摄像头" } //camera.removeEventListener(StatusEvent.STATUS,cameraStatus); } /* 好像麦克风没法检测,测试过拔掉麦克风,但是没效果 */ private function micStatus(event:StatusEvent):void{ if(!mic.muted){ startRecord.enabled = true; //error_label.text = error_label.text + "2"; }else{ error_label.text = error_label.text + " 无法找到麦克风"; } //mic.removeEventListener(StatusEvent.STATUS,micStatus); } /*点击 开始录像 按钮*/ private function clickStartRecord():void{ nc = new NetConnection(); nc.addEventListener(NetStatusEvent.NET_STATUS,nsHandler); nc.connect(rtmp_url); //连接red5 //doStart(); } private function nsHandler(evt:NetStatusEvent):void{ if(evt.info.code == "NetConnection.Connect.Success"){ //如果连接成功 doStart(); }else{ Alert.show("连接失败"); } } /*开始录像*/ private function doStart():void{ if(video != null){ video.clear(); videoPlay.removeChild(video); video = new Video(); video.width = 320; video.height = 240; video.attachCamera(camera); videoPlay.addChild(video); } ns = new NetStream(nc); ns.attachCamera(camera); ns.attachAudio(mic); videoName = "vincent_"+Math.random()+getTimer(); ns.publish(videoName,"record"); startRecord.enabled = false; stopRecord.enabled = true; } private function clickStopRecord():void{ ns.close(); video.clear(); videoPlay.removeChild(video); startRecord.enabled = true; stopRecord.enabled = false; init();/*重新初始化Camera,否则Camera会默认使用完了,不再显示图像*/ } ]]> </mx:Script> <mx:Panel x="213" y="175" width="360.5" height="301" layout="absolute"> <mx:VideoDisplay x="10" y="10" width="320" height="240" id="videoPlay"/> </mx:Panel> <mx:Button x="270" y="498" label="开始录像" id="startRecord" click="clickStartRecord()" enabled="false"/> <mx:Button x="432" y="498" label="停止录像" id="stopRecord" click="clickStopRecord()" enabled="false"/> <!-- <mx:Button x="442" y="498" label="播放录像" id="playRecord" enabled="false"/> --> <mx:Label text="错误:" x="213" y="544" width="360.5" height="25" id="error_label" fontSize="12"/> </mx:Application>
如果你使用Flex builder 开发,那相当简单!可以直接运行,记着插上摄像头哦!
忘记吧web.xml 的配置写上了,其实可以复制red5里面的例子工程,但是补上吧,怕太久了忘记了。
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <web-app
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
- <display-name>Red5App</display-name>
- <context-param>
- <param-name>Red5App</param-name>
- <param-value>/red5_app</param-value>
- </context-param>
- <listener>
- <listener-class>org.red5.logging.ContextLoggingListener</listener-class>
- </listener>
- <filter>
- <filter-name>LoggerContextFilter</filter-name>
- <filter-class>org.red5.logging.LoggerContextFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>LoggerContextFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <servlet>
- <servlet-name>rtmpt</servlet-name>
- <servlet-class>org.red5.server.net.rtmpt.RTMPTServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <!--
- <servlet>
- <display-name>SecurityTest</display-name>
- <servlet-name>SecurityTest</servlet-name>
- <servlet-class>org.red5.demos.oflaDemo.SecurityTest</servlet-class>
- </servlet>
- -->
- <servlet-mapping>
- <servlet-name>rtmpt</servlet-name>
- <url-pattern>/fcs/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>rtmpt</servlet-name>
- <url-pattern>/open/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>rtmpt</servlet-name>
- <url-pattern>/close/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>rtmpt</servlet-name>
- <url-pattern>/send/*</url-pattern>
- </servlet-mapping>
- <servlet-mapping>
- <servlet-name>rtmpt</servlet-name>
- <url-pattern>/idle/*</url-pattern>
- </servlet-mapping>
- <!--
- <servlet-mapping>
- <servlet-name>SecurityTest</servlet-name>
- <url-pattern>/securitytest</url-pattern>
- </servlet-mapping>
- -->
- <!--
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>Forbidden</web-resource-name>
- <url-pattern>/streams/*</url-pattern>
- </web-resource-collection>
- <auth-constraint/>
- </security-constraint>
- -->
- </web-app>
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Red5App</display-name> <context-param> <param-name>Red5App</param-name> <param-value>/red5_app</param-value> </context-param> <listener> <listener-class>org.red5.logging.ContextLoggingListener</listener-class> </listener> <filter> <filter-name>LoggerContextFilter</filter-name> <filter-class>org.red5.logging.LoggerContextFilter</filter-class> </filter> <filter-mapping> <filter-name>LoggerContextFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>rtmpt</servlet-name> <servlet-class>org.red5.server.net.rtmpt.RTMPTServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- <servlet> <display-name>SecurityTest</display-name> <servlet-name>SecurityTest</servlet-name> <servlet-class>org.red5.demos.oflaDemo.SecurityTest</servlet-class> </servlet> --> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/fcs/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/open/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/close/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/send/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/idle/*</url-pattern> </servlet-mapping> <!-- <servlet-mapping> <servlet-name>SecurityTest</servlet-name> <url-pattern>/securitytest</url-pattern> </servlet-mapping> --> <!-- <security-constraint> <web-resource-collection> <web-resource-name>Forbidden</web-resource-name> <url-pattern>/streams/*</url-pattern> </web-resource-collection> <auth-constraint/> </security-constraint> --> </web-app>
这个配置挺全了。以后可以继续使用的!