Fluid idea for Life

随笔,杂记

在linux下安装red5可能会遇到的问题

1、jdk的设置 有些系统自带安装了java,但可能仅仅是装了 jre,而没有安装编译环境

最好检测java,javac,java-version等命令,还有就是JAVA_HOME命令,在red5的编译过程中,使用了这个变量,必须设置。

2、ant的设置 我就是因为ant的设置,导致总是无法编译成功。最好是不要使用系统安装的版本,手动安装最放心。安装了一定要设置ANT_HOME环境变量

3、编译red5 0.6.3后,使用ant server命令编译会出错,这个也是我惨痛的经验。

总结,jdk,ant手动安装是最好的方法,有时对linux的软件安装路径搞不懂。

whereis是个有用的命令,可以将当前路径下的程序都找出来,比如: whereis java 就可以将jdk的所有路径找到

red5,red5...

red5 终于出了0.63版,距离0.62版本的发布有3个月之久.

可惜新版太令我失望了,和上一版本相比变化太小,很多Bug依然存在,郁闷之极.

无法手工kill掉连接是现在最头痛的事情,只能看red5的源代码,看可不可以hack下.

0.63中提到一个重要的新功能,那就是也可以和FMS一样,加载程序,不用重启服务,不过找了半天,管理后台中并没有这个功能,在示例程序中提供了一个例子,但是要手工写代码,用起来不是一般的麻烦.

总体上看,这是一个过渡性的版本,我想新版本应该快了吧,应该是0.7了,加油啊

Red5 remoting bug?

测试环境:Red50.62 + amfphp 1.2

Red5里由于Remoting的两个对象是:

org.red5.server.net.remoting.RemotingClient

org.red5.server.net.remoting.IRemotingCallback

其中RemotingClient起主要作用,用来建立连接并调用服务器的方法。

RemotingClient一共有两个函数:

invokeMethod(String method, Object[] params) Invoke a method synchronously on the remoting server. 这个表示同步调用远程方法

void invokeMethod(String method, Object[] methodParams, IRemotingCallback callback) Invoke a method asynchronously on the remoting server. 异步调用远程方法,callback对象用来处理返回的数据

远程调用也可以同步完成?不知道是什么意思? 开始我使用异步调用,发现有时可以成功,有时同时收到结果和出错信息。如果换作是amfphp 1.9,则无法获得返回结果,对amf3的支持有问题。

换作同步调用后,一切居然正常!不明白Red5的remoting到底是个怎样的工作流程?

Red5和amfPHP

Red5支持Remoting,但一直没有试过,最近在项目中要用到,于是研究了下。

package tree;</p>
<p>import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IScope;</p>
<p>import org.red5.server.net.remoting.RemotingClient;</p>
<p>import org.red5.server.net.remoting.IRemotingCallback;</p>
<p>//实现IRemotingCallback,处理返回信息
public class Application extends ApplicationAdapter implements IRemotingCallback{</p>
<p>	public IScope app;</p>
<p>	public Log log = LogFactory.getLog(Application.class);</p>
<p>	private RemotingClient _service;</p>
<p>	@Override
	public boolean appStart(IScope app){
		this.app = app;
		//Remoting的网关地址
		String gateway = "http://192.168.0.180/amfphp/gateway.php";
		//定义一个RemotingClient对象
		_service = new RemotingClient(gateway);		
		//调用服务器上HelloWorld对象的的函数
		_service.invokeMethod("HelloWorld.hello",new Object[]{"red5"},this);</p>
<p>		return true;
	}
	public void errorReceived(RemotingClient client, String method, Object[] params, Throwable error){
		//An error occured while performing the remoting call.
		log.debug("error:"+error);
		error.printStackTrace();
	}
	public void resultReceived(RemotingClient client, String method, Object[] params, Object result) {
		//
		log.debug("method:"+method+" params: "+params+" result:"+result);
	}</p>
<p>}

反复实验了几次,AMFPHP可以接收到red5服务器端的数据,但red5却总收不到AMFPHP的返回数据?

不知道是不是不支持amf3的原因?有待进一步研究

Red5从服务端断开视频流

当客户端有用户还在发布视频时,管理员如何从后台强行中止,其实代码很简单:

IBroadcastStream stream = this.getBroadcastStream(app,streamName);</p>
<p>stream.close();

app是区域程序名,streamName指视频流名称

Red5的文档感觉不怎么友好,提示太少了