red5+flash已备以后使用

本文详细介绍Red5服务器的配置步骤,包括简单的示例配置、调用Flash函数的方法及视频实时播放的应用。通过具体示例代码,展示了如何利用Red5进行实时流媒体传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计到的问题:
            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);
					}
			
				}
			}
		///////////////////////////////////////////////////////////////////
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值