`
HCQmaker
  • 浏览: 46834 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

red5+flash已备以后使用

    博客分类:
  • Java
阅读更多

设计到的问题:
            red5版本:0.7.0
        1.red5简单例子的配置问题
        首先是下载red5,http://osflash.org/red5 我这里使用的是window 0.7.0安装版本
        复制doc/templates/myapp到webapps目录
        进行以下修改WEB-INF文件夹下
        [1].web.xml文件中注释掉

				<context-param>
		    	<param-name>log4jConfigLocation</param-name>
		    	<param-value>/WEB-INF/log4j.properties</param-value>
				</context-param>

 [2].red5-web.xml

修改

<bean id="web.handler" class="the.path.to.my.Application" singleton="true" />

 为

<bean id="web.handler" class="org.red5.server.adapter.ApplicationAdapter" singleton="true" />

 注释掉

<bean id="myhandler.service" class="the.path.to.my.ServiceHandler" singleton="true" />

 flash测试程序(as3)

			//////////////////////////
			package {
				import flash.display.MovieClip;
				import flash.net.NetConnection;
				import flash.events.NetStatusEvent;
				public class sample extends MovieClip {
					private var nc:NetConnection;
					public function sample() {
						nc = new NetConnection();
						nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
						nc.connect("rtmp://localhost/myapp");//连接到本地的Red5服务器
					}
					private function netStatusHandler(event:NetStatusEvent):void {
						if (event.info.code=="NetConnection.Connect.Success") {
							trace("连接成功 ");
						} else {
							trace("连接失败 "+event.info.code);
						}
					}
				}
			}
/////////////////////////////

         2.red5调用flash函数和flash调用red5函数
        复制doc/templates/myapp到webapps目录
        把myapp修改成mysample
        修改mysample/WEB-INF/中的文件

        [1].web.xml文件中注释掉

				<context-param>
		    	<param-name>log4jConfigLocation</param-name>
		    	<param-value>/WEB-INF/log4j.properties</param-value>
				</context-param>

 [2].web.xml注释掉

			    <servlet>
			        <servlet-name>gateway</servlet-name>
			        <servlet-class>org.red5.server.net.servlet.AMFGatewayServlet</servlet-class>
			    </servlet>
			    
			    <servlet-mapping>
			        <servlet-name>gateway</servlet-name>
			        <url-pattern>/gateway</url-pattern>
			    </servlet-mapping>

 [3].web.xml中修改

			<context-param>
				<param-name>webAppRootKey</param-name>
				<param-value>/myapp</param-value>
			</context-param>

 [4].red5-web.xml

修改

<bean id="web.handler" class="the.path.to.my.Application" singleton="true" />

 为

<bean id="web.handler" class="org.red5.first.sampleapplication" singleton="true" />

 注释掉

<bean id="myhandler.service" class="the.path.to.my.ServiceHandler" singleton="true" />

         [5].red5-web.properties
            修改webapp.contextPath=/myapp为webapp.contextPath=/mysample
        [6].在mysample/WEB-INF/建立两个文件夹src和classes
        打开eclipse把Workspace定制到webapps目录,创建一个java project名字是mysample,
        点击下一步,选择Source选项卡,鼠标右键点击WEB-INF/src选择Use as Source Folder在下面的
        默认输出文件夹中(Default output folder:)选择WEB-INF/classes文件夹,点击完成。
        鼠标右键点击mysample工程,选择属性(Properties),选择Java Build Path,在Libraries中选择Add External JARs
        把Red5中的red5.jar添加进来,添加一个sampleapplication.java到WEB-INF/src中
        java代码如下

//////////////////////////////////////////////////////////
		package org.red5.first;

		import org.red5.server.adapter.ApplicationAdapter;
		import org.red5.server.api.IConnection;
		import org.red5.server.api.Red5;
		import org.red5.server.api.service.IServiceCapableConnection;
		
		public class sampleapplication extends ApplicationAdapter {
			/**
			 * 此函数提供给客户端进行调用
			 * 
			 * @param msg客户端传过来的信息
			 * @return 服务器回馈的信息
			 */
			public String useForClient(String msg) {
				useForServer();
				return "server send:" + msg;
			}
		
			/**
			 * 此函数调用客户端的函数
			 */
			public void useForServer() {
				IConnection current = Red5.getConnectionLocal();
				if (current instanceof IServiceCapableConnection) {
					// 调用客户端函数
					Object str[] = new Object[2];
					str[0] = "server call";
					str[1] = "client";
					//调用客户端的setMSG函数,传递两个字符串
					((IServiceCapableConnection) current).invoke("setMSG", str);
					//((IServiceCapableConnection) current).invoke("setMSG", new Object[]{"server call","client"});
				}
			}
		}
		//////////////////////////////////////////////////////////

 flash代码(as3)

	//////////////////////////////////////////////////////////
		package {
			import flash.display.MovieClip;
			import flash.net.NetConnection;
			import flash.events.NetStatusEvent;
			import flash.events.AsyncErrorEvent;
			import flash.net.NetStream;
			import flash.net.Responder;
			
			public class ClientSample extends MovieClip {
				private var nc:NetConnection;
				private var resp:Responder;
				//private var ns:NetStream;
				public function ClientSample() {
					nc = new NetConnection();
					resp = new Responder(responderHandle);
					nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
					nc.connect("rtmp://localhost/mysample");//连接到本地的Red5服务器
					nc.client = this;
				}
				private function netStatusHandler(event:NetStatusEvent):void {
					if (event.info.code=="NetConnection.Connect.Success") {
						trace("连接成功 ");
						/*
						ns=new NetStream(nc);
						ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
						ns.addEventListener(NetStatusEvent.NET_STATUS,StreamnetStatusHandler);
						ns.client=this;//new CustomClient();
						//调用服务器的函数
						nc.client = this;
						*/
						nc.call("useForClient",resp,"callserver");
					} else {
						trace("连接失败 "+event.info.code);
					}
				}
		
				//ns
				private function asyncErrorHandler(event:AsyncErrorEvent):void {
					trace(" asyncErrorHandler " +event);
				}
		
				private function StreamnetStatusHandler(event:NetStatusEvent):void {
					trace(" netStatusHandler " +event);
				}
		
				//CustomClient
				public function onMetaData(info:Object):void {
					trace(" metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
				}
				public function onCuePoint(info:Object):void {
					trace(" cuepoint: time=" + info.time + " name=" + info.name + " type=" + info.type);
				}
				private function responderHandle(info:Object):void{
					trace("responderHandle "+info);
				}
				public function setMSG(str1:String,str2:String):void {
					trace("服务器信息:"+str1+"-"+str2);
				}
		
			}
		}
		/////////////////////////////////////////////////////////////////////////

         3.视频实时播放和客户端直接调用客户端函数问题
        可以直接使用1.设置好的
        需要在场景中添加控件有
        video    实例名字:videoContainer
        TextInput    实例名字:input1
        Button    实例名字:btn1
        [1].视频上传程序flash(as3)

		//////////////////////////////////////////////////////////
		package {
		
			import flash.display.MovieClip;
			import flash.net.NetConnection;
			import flash.net.NetStream;
			import flash.media.Camera;
			import flash.media.Microphone;
			import flash.events.AsyncErrorEvent;
			import flash.events.NetStatusEvent;
			import flash.media.Video;
			import flash.events.MouseEvent;
			import flash.net.ObjectEncoding;
		
			public class NetCamera extends MovieClip {
				//变量
				private var nc:NetConnection;
				private var ns:NetStream;
				private var nsData:NetStream;
				private var cam:Camera;//摄像头
				//private var mic:Microphone;//麦克风
		
				private var VideoName:String="red5RecordDemo_1";
		
				public function NetCamera() {
					nc = new NetConnection();
					nc.objectEncoding=ObjectEncoding.AMF0;
					nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
					nc.connect("rtmp://localhost/myapp");//连接到本地的Red5服务器
		
				}
		
				private function netStatusHandler(event:NetStatusEvent):void {
					if (event.info.code=="NetConnection.Connect.Success") {
						trace("连接成功 ");
						/////////////////////////////////////////////
						ns=new NetStream(nc);//将已和red5服务器建立连接的nc传递给NetStream
						//创建元数据,并将其添加到实时流中
						/*
						var metaData:Object = new Object();
						metaData.title="myStream";
						metaData.width=400;
						metaData.height=200;
						ns.send("@setDataFrame", "onMetaData", metaData);
						//------------------------------
						*/
						ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
						ns.addEventListener(NetStatusEvent.NET_STATUS,StreamnetStatusHandler);
						btn1.addEventListener(MouseEvent.CLICK,mouseClickedHandler);//添加鼠标按下事件
						ns.client=this;//new CustomClient();
		
						//初始化摄像头和麦克风
						cam=Camera.getCamera();//启动摄像头
						cam.setLoopback(true);
						cam.setMode(640,480,30);//设置尺寸
						//cam.setKeyFrameInterval(15);//1~48
						//cam.setMode(400,300,30);
						//cam.setQuality(76800,70);
						cam.setQuality(0,90);//设置录制质量
						//mic=Microphone.getMicrophone();//启动麦克风
		
						ns.attachCamera(cam);//绑定摄像头
						//ns.attachAudio(mic);//绑定麦克风
						videoContainer.attachCamera(cam);//将摄像头信息赋给视频显示窗口
						ns.publish(VideoName,"live");//上传视频流 record保存在服务器,Append追加,live实时播放
		
						/////////////////////////////////////////////
		
					} else {
						trace("连接失败 "+event.info.code);
					}
				}
		
		
				private function asyncErrorHandler(event:AsyncErrorEvent):void {
					trace(" asyncErrorHandler " +event);
				}
		
				private function StreamnetStatusHandler(event:NetStatusEvent):void {
					trace(" netStatusHandler " +event);
				}
				//mous clicked
				private function mouseClickedHandler(event:MouseEvent):void {
					trace("mouseClickedHandler");
					ns.send("myFunction",input1.text);//在实时流中添加客户端的调用,及调用客户端的myFunction,传递一个字符串:输入框中的文字
				}
				//CustomClient
				public function onMetaData(info:Object):void {
					trace(" metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
				}
				public function onCuePoint(info:Object):void {
					trace(" cuepoint: time=" + info.time + " name=" + info.name + " type=" + info.type);
				}
				public function myFunction(info:String):void {
					trace("server:----------------");
				}
			}
		}
		////////////////////////////////////////////////////////

         [2].视频播放程序(从服务器实时播放视频)
        需要在场景中添加控件有:
        video 实例名字:Netvideo

package {
				import flash.display.MovieClip;
				import flash.net.NetConnection;
				import flash.net.NetStream;
				import flash.events.AsyncErrorEvent;
				import flash.events.NetStatusEvent;
				import flash.media.Video;
				import flash.net.ObjectEncoding;
			
				/*
				实现接受red5上面的视频并进行显示
				*/
				public class NetClient extends MovieClip {
			
					private var nc:NetConnection;
					private var ns:NetStream;
					private var VideoName:String="red5RecordDemo_1";
			
					public function NetClient() {
						nc = new NetConnection();
						nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
						nc.objectEncoding=ObjectEncoding.AMF0;
						//nc.connect("rtmp://localhost/online");
						nc.connect("rtmp://localhost/myapp");
						//nc.addEventListener("myFunction",newfunction);
					}
			
					private function netStatusHandler(event:NetStatusEvent):void {
						trace(" netStatusHandler " +event);
						if (event.info.code=="NetConnection.Connect.Success") {
							trace("连接成功 ");
							/////////////////////////////////////////////
							ns=new NetStream(nc);
							ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
							ns.addEventListener(NetStatusEvent.NET_STATUS,StreamnetStatusHandler);
							ns.client=this;//new CustomClient();
			
							Netvideo.attachNetStream(ns);//绑定视频
							ns.play(VideoName);//播放视频
			
							/////////////////////////////////////////////
			
						} else {
							trace("连接失败 "+event.info.code);
						}
					}
					private function asyncErrorHandler(event:AsyncErrorEvent):void {
						trace(" asyncErrorHandler " +event);
					}
			
					private function StreamnetStatusHandler(event:NetStatusEvent):void {
						trace(" netStatusHandler " +event);
					}
					public function onMetaData(info:Object):void {
						trace(" metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
					}
					public function onCuePoint(info:Object):void {
						trace(" cuepoint: time=" + info.time + " name=" + info.name + " type=" + info.type);
					}
					public function myFunction(info:String):void {
						trace("client:-"+info);
					}
			
				}
			}
		///////////////////////////////////////////////////////////////////
分享到:
评论
1 楼 whatHappy 2012-04-18  
先顶再看

相关推荐

    red5学习资料

    关于red5的一些学习文档,资料很齐全。 d5_demo 服务器端调用客户端as的方法 as3.0+red5 --- hello world FMS&Red5 RED5 – Project Roadmap Open Source Flash 等等文档

    用red5部署的flex的简单聊天室源代码

    用flex写的一个简单的聊天室的例子 本例子中的后台用到了red5 包括使用了red5的前后台通信及前台调用后台方法以及后台调用前台方法的实例 可供初学者了解其原理及一些基本的技术

    red5服务器:Red5服务器核心

    red5服务器-Red5服务器核心 Red5是用Java编写的开源Flash Server,它支持: 串流视讯(FLV,F4V,MP4、3GP) 流音频(MP3,F4A,M4A,AAC) 记录客户端流(FLV容器中的FLV和AVC + AAC) 共享对象直播发布远程处理...

    red5-server-1.2.10.zip

    Red5 is an Open Source Flash Server written in Java that supports: Streaming Video (FLV, F4V, MP4, 3GP) Streaming Audio (MP3, F4A, M4A, AAC) Recording Client Streams (FLV and AVC+AAC in FLV container...

    red5-server:Red5服务器核心

    Red5是用Java编写的开源Flash Server,它支持: 串流视讯(FLV,F4V,MP4、3GP) 流音频(MP3,F4A,M4A,AAC) 记录客户端流(FLV容器中的FLV和AVC + AAC) 共享对象 直播发布 远程处理 协议:RTMP,RTMPT,...

    docker-red5:Red5 Docker 容器

    Red5 是一个用 Java 编写的开源 Flash 服务器,它支持: 流媒体视频(FLV、F4V、MP4、3GP) 流媒体音频(MP3、F4A、M4A、AAC) 录制客户端流(FLV 容器中的 FLV 和 AVC+AAC) 共享对象 直播发布 远程处理 协议...

    单片机控制智能交通信号灯

    if(++Flash_Count !=10) return; Flash_Count=0; Operation_Type = 3; break; case 3: RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type = 4; ...

    物联网项目实战开发之基于STM32+ESP8266 WIFI 连接EMQX 私有部署MQTT服务器平台代码程序(多路继电器)

    4、代码使用KEIL开发,当前在STM32F103C8T6运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 5、软件下载时,请注意keil选择项是jlink还是stlink. 6、硬件设计、软件开发、...

    r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z

    r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z 开发板:CB-S 1、(可选修改/调试技巧:) 除了ov5640.c之外,其它的驱动都不编译,节省编译时间!...

    网狐V5源码下载 (开发库+系统模块)

    │ │ │ FlashControl.h │ │ │ GameEngineHead.h │ │ │ GameFrameApp.h │ │ │ GameFrameAvatar.h │ │ │ GameFrameControl.h │ │ │ GameFrameEngine.h │ │ │ GameFrameHead.h │ │ │ ...

    ATSAM4E8EA WiFi 3D打印机控制板altium设计原理图PCB+3D集成封装库文件.zip

    Header 5 Header, 5-Pin Header 7X2 Header, 7-Pin, Dual row Inductor Inductor JP2 Jumper-Pad-3 LED Typical RED, GREEN, YELLOW, AMBER GaAs LED MOSFET-N N-Channel MOSFET MP1584 Step-Down Converter 3A, ...

    EP2C35F672C8+SDRAM 官方FPGA开发板 核心板ALTIUM设计硬件原理图PCB+AD集成封装库.zip

    DIO-LED-1S LED, Red 0805 (2013) HSMH-C170 DS2406 Dual Addressable Switch Plus 1KB Memory EP2C35F672C8 FPGA, Altera Cyclone2-35 F672 IND-FER Inductor, Ferrite Bead 1K@100MHz 300mA 0805 (2012) BMB2A1000...

    豪华首页调用Flash自动变换效果(附源代码)

    if (Math.abs(distance) &lt; 5.000000E-001) { _loc1.movieTransform.aa = _loc2; } // end if _loc1.movieColor.setTransform(_loc1.movieTransform); trace (\"alphaObject &gt; updating alpha...\"); } ...

    简易交通信号灯

    uchar time_count=0,flash_count=0,operation_type=1; //T0中断函数 void T0_INT() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; switch (operation_type) { case 1: red_a=0;yellow_a=0;...

    低清版 大型门户网站是这样炼成的.pdf

    1.2.7 功能强大的flv流媒体服务器red5 24 1.3 门户网站开发指导思想 26 1.4 ssh 2组合框架—门户网站开发之首选 28 1.4.1 mvc混血宠儿struts 2 28 1.4.2 幕后的财政部长spring 2.5 30 1.4.3 orm中间件香馍馍...

    js使用小技巧

    clip:rect(5px 15px 15px 5px)"&gt; 获取选中内容 document.selection.createRange().duplicate().text 自动完成功能 打开该功能 关闭该功能 窗口最大化 (window.screen.width - 4,window.screen.height-...

    K790刷机方法,可重新升级

    然后就可以点下面的Flash进行刷机了,这个过程大约不到5分钟,当显示以下信息时就是结束了: 23:13:42| ++ Disconnecting phone...4T5\6e!y/]7|)I&m!o5X0\ 23:13:42| ++ You may now unplug your phone.;|7B6T%f"U o...

    ExtAspNet_v2.3.2_dll

    -Grid中TemplateField生成到页面中控件具有唯一ID,例如Grid1_ct5_Label2,Grid1_ct6_Label2(feedback:geruger)。 +2009-09-27 v2.1.2 -为Tree控件增加GetExpandAllNodesReference和...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -使用Hidden来显示隐藏ExtAspNet控件,而不是使用Visible属性(Visible目前设置为只读属性)。 -使用Hidden控制Window控件的显示隐藏,Popup已经标记为Obsolete属性。 -Window的实例方法GetCloseReference等以及...

    javascript小技巧

    &lt;tr&gt;&lt;td align=center&gt;&lt;font size=5 color=red face="Arial, Helvetica, sans-serif"&gt;下面为脚本显示区!&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=left height=110 width=240&gt;下面的信息说明10秒后消失,你也可以...

Global site tag (gtag.js) - Google Analytics