Red5 服务器、Flash 客户端、语音 Chat/Conference 雅虎风格的语音聊天

Red5 Server, Flash Client, Voice Chat/Conference Voice Chat Yahoo Style

我不知道是否有人还记得以前的 Yahoo 聊天室,但目前我的网站上已有一个聊天室。它是 Ajax 由 blueimp 聊天。一切都很好,它工作得很好。我想添加一个 "talk" 按钮,以便用户可以按下它并讲话,聊天室中的其他人都可以听到。我有什么作品。但在使用几分钟后,并非所有用户都能听到对方说话的声音。所以我的问题是,我该如何解决这个问题,以便所有用户都能继续听到说话者的声音?

代码如下:

import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequestMethod;
import flash.media.Microphone;
import flash.media.Sound;

var Mic:Microphone;
var aud:Sound;
var nc:NetConnection = new NetConnection;
nc.client = this;
var istream:NetStream;
var ostream:NetStream;
Security.showSettings("2");
if(Microphone.names.length <= 0) {
    //they has no mic
} else {
    Mic = Microphone.getMicrophone();
    Mic.setUseEchoSuppression(true);
    Mic.setLoopBack(false);
    Mic.addEventListener(ActivityEvent.ACTIVITY, activityHandler);
    Mic.addEventListener(StatusEvent.STATUS, statusHandler);
}
btnTalk.addEventListener(MouseEvent.MOUSE_DOWN, talkDown);
btnTalk.addEventListener(MouseEvent.MOUSE_UP, talkUp);
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
nc.connect("rtmp://MYSERVER:1935/oflaDemo");

function talkDown(e:MouseEvent):void {
    trace("talking");
    ostream.publish("charchar");
    istream.receiveAudio(false);
}

function talkUp(e:MouseEvent):void {
    trace("done talking");
    ostream.close();
    istream.receiveAudio(true);
}

function netStatusHandler(event:NetStatusEvent):void {
    trace(event.info.code)
    ostream = new NetStream(nc);
    istream = new NetStream(nc);
    istream.play("charchar");
    ostream.attachAudio(Mic);


}



function activityHandler(event:ActivityEvent):void {
            trace("activityHandler: " + event);
        }
function statusHandler(event:StatusEvent):void {
            trace("statusHandler: " + event);
        }

示例:3 个用户加载页面并且都可以听到。与某人通话几次后,User1 可以听到 User2,但 User3 听不到 User1。它是混搭的,谁能听到谁的声音,但这是正在发生的事情的一个例子。

如果您要为所有客户端使用相同的流 "charchar",您将需要实施某种锁定以防止竞争条件。顺便说一句,这将非常棘手,并且肯定需要服务器端修改代码。