设计到的问题:
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);
}
}
}
///////////////////////////////////////////////////////////////////
分享到:
相关推荐
关于red5的一些学习文档,资料很齐全。 d5_demo 服务器端调用客户端as的方法 as3.0+red5 --- hello world FMS&Red5 RED5 – Project Roadmap Open Source Flash 等等文档
用flex写的一个简单的聊天室的例子 本例子中的后台用到了red5 包括使用了red5的前后台通信及前台调用后台方法以及后台调用前台方法的实例 可供初学者了解其原理及一些基本的技术
red5服务器-Red5服务器核心 Red5是用Java编写的开源Flash Server,它支持: 串流视讯(FLV,F4V,MP4、3GP) 流音频(MP3,F4A,M4A,AAC) 记录客户端流(FLV容器中的FLV和AVC + AAC) 共享对象直播发布远程处理...
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是用Java编写的开源Flash Server,它支持: 串流视讯(FLV,F4V,MP4、3GP) 流音频(MP3,F4A,M4A,AAC) 记录客户端流(FLV容器中的FLV和AVC + AAC) 共享对象 直播发布 远程处理 协议:RTMP,RTMPT,...
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; ...
4、代码使用KEIL开发,当前在STM32F103C8T6运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 5、软件下载时,请注意keil选择项是jlink还是stlink. 6、硬件设计、软件开发、...
r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z 开发板:CB-S 1、(可选修改/调试技巧:) 除了ov5640.c之外,其它的驱动都不编译,节省编译时间!...
│ │ │ FlashControl.h │ │ │ GameEngineHead.h │ │ │ GameFrameApp.h │ │ │ GameFrameAvatar.h │ │ │ GameFrameControl.h │ │ │ GameFrameEngine.h │ │ │ GameFrameHead.h │ │ │ ...
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, ...
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...
if (Math.abs(distance) < 5.000000E-001) { _loc1.movieTransform.aa = _loc2; } // end if _loc1.movieColor.setTransform(_loc1.movieTransform); trace (\"alphaObject > 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;...
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中间件香馍馍...
clip:rect(5px 15px 15px 5px)"> 获取选中内容 document.selection.createRange().duplicate().text 自动完成功能 打开该功能 关闭该功能 窗口最大化 (window.screen.width - 4,window.screen.height-...
然后就可以点下面的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...
-Grid中TemplateField生成到页面中控件具有唯一ID,例如Grid1_ct5_Label2,Grid1_ct6_Label2(feedback:geruger)。 +2009-09-27 v2.1.2 -为Tree控件增加GetExpandAllNodesReference和...
-使用Hidden来显示隐藏ExtAspNet控件,而不是使用Visible属性(Visible目前设置为只读属性)。 -使用Hidden控制Window控件的显示隐藏,Popup已经标记为Obsolete属性。 -Window的实例方法GetCloseReference等以及...
<tr><td align=center><font size=5 color=red face="Arial, Helvetica, sans-serif">下面为脚本显示区!</strong></font></td></tr><tr><td align=left height=110 width=240>下面的信息说明10秒后消失,你也可以...