用摄像头录视频:
//从麦和设像头显示视频 my_video.attachVideo(Camera.get()); my_video.attachAudio(Microphone.get()); //连接 nc = new NetConnection(); nc.connect("rtmp://localhost/aaaa"); nsOut = new NetStream(nc); nsOut.attachVideo(Camera.get()); nsOut.attachAudio(Microphone.get()); //发布2.flv nsOut.publish("2", "record");
publish后边的参数有record,则录成文件2.flv,
不加参数默认为live,即现场流,类似在线直播,不需要录成文件,其他人可以同时播放视频流
把fla发布一下, 录一会儿,把视频关掉,打开你的
叉盘:\Program Files\Macromedia\Flash Media Server 2\applications\aaaa\
是不是多了个streams\_definst_
打开C:\Program Files\Macromedia\Flash Media Server 2\applications\aaaa\streams\_definst_
看见2.flv了吧。。
播放
几行代码而已
nc = new NetConnection(); nc.connect("rtmp://localhost/aaaa"); res = new NetStream(nc); view.attachVideo(res); view.attachAudio(res); res.play("2");
我们已经看过怎样跟服务器建立连接了,忘了的回头看看。。 http://www.nshen.net/blog/article.asp?id=394
现在我们深入一点点。。看看有些细节问题
info.code:
连接后info.code会告诉你连接的状态,以前看的都是NetConnection.Connect.Success, 还有一些其他值,和这些值是什么意思,自己看看。
值得注意的是。NetConnection.Connect.Rejected,收到这条消息的时候说明服务器端拒绝了你,接着马上你会收到另一条,NetConnection.Connect.Closed,连接就关闭了~~~
mync = new NetConnection(); mync.onStatus = function(info) { switch (info.code) { case "NetConnection.Connect.Success" : trace("连接成功"); break; case "NetConnection.Connect.Failed" : //关掉服务器的情况 trace("连接失败,请检查你的网络"); break; case "NetConnection.Connect.Rejected" : //注意这里,服务器拒绝你的情况,如果遭到拒绝,将会调用两次mync.onStatus, //第一次"NetConnection.Connect.Rejected"第2次"NetConnection.Connect.Closed" trace("遭到服务器拒绝"); trace("服务器返回信息:"+info.application.msg); break; case "NetConnection.Connect.Closed" : trace("连接关闭"); break; } }; mync.connect("rtmp://localhost/connect", "N神"); //mync.connect("rtmp://localhost/connect","小新")
服务器端拒绝连接?好象见过。。。回头找找。。。。。。。。哦在这里
application.onConnect = function(client) {
this.rejectConnection(client);
}
我不能所有人都拒绝了。。我要把讨厌的人拒绝了。。。
传给服务器一个人名~~
mync.connect("rtmp://localhost/connect", "N神");
服务器看看是不是讨厌的人。。
application.onConnect = function(client, name) { trace(name); if (name == "N神") { //拒绝连接,并返回个错误对象{msg:"服务器不想"+name+"进去,哈哈~"},包含错误消息 application.rejectConnection(client, {msg:"服务器不想"+name+"进去,哈哈~"}); } else { application.acceptConnection(client); //成功不能返回客户端信息 } };
看最上边的代码。。
case "NetConnection.Connect.Rejected" : //注意这里,服务器拒绝你的情况,如果遭到拒绝,将会调用两次mync.onStatus, //第一次"NetConnection.Connect.Rejected"第2次"NetConnection.Connect.Closed" trace("遭到服务器拒绝"); trace("服务器返回信息:"+info.application.msg); break;
遭到服务器拒绝后会trace出服务器返回的错误消息
=======================================
还有一些代码。是在一本电子书上学到的。。。传上来看看
//test2 ,拒绝多余的回调信息 mync = new NetConnection(); mync.onStatus = function(info) { if (info.code == "NetConnection.Connect.Success") { trace("连接成功"); this.handleCloseEvents = true; } if (!this.isConnected && this.handleCloseEvents) { this.handleCloseEvents = false; if (info.code == "NetConnection.Connect.Rejected") { trace("遭到服务器拒绝"); } else { trace("连接关闭"); } } }; mync.handleCloseEvents = true; mync.connect("rtmp://localhost/connect", "N神"); //mync.connect("rtmp://localhost/connect","小新") //test3 ,连接时显示正在连接,检查是否uri错误 mync = new NetConnection(); mync.onStatus = function(info) { if (info.code == "NetConnection.Connect.Success") { trace("连接成功"); this.handleCloseEvents = true; } if (!this.isConnected && this.handleCloseEvents) { this.handleCloseEvents = false; if (info.code == "NetConnection.Connect.Rejected") { trace("遭到服务器拒绝"); } else { trace("连接关闭"); } } }; mync.handleCloseEvents = true; //uri="rtmp://localhost/connect" uri = "rtmp2://localhost/connect"; //错误的uri if (mync.connect(uri, "N神")) { trace("尝试连接服务器中。。"); } else { trace("没有尝试连接服务器~是uri错误???"); } //mync.connect("rtmp://localhost/connect","小新")
onStatus都有什么,看清楚~~~
// onStatus( ) handler. NetConnection.prototype.onStatus = function (info) { trace("this.isConnected: " + this.isConnected); trace(" info.level: " + info.level); trace(" info.code: " + info.code); trace("info.description: " + info.description); if (info.application) { for (var prop in info.application) { trace("info.application." + prop + ": " + info.application[prop]); } } trace("\n"); };
说明:很简单的东西,基本上就是共享对象的运用,没有用到服务器端,大型聊天室可能不会这么做,这个只适用于初学者:/
注释很详细,不说多了:
//用户名 myname="游客" //建立连接 var myNC = new NetConnection(); myNC.connect("rtmp://localhost/smallchat"); //搞到rso Talk_SO = SharedObject.getRemote("Talk", myNC.uri, false); Talk_SO.onSync = function() { //先把聊天文本框清空 remoteText.text = ""; //把聊天列表显示出来,talklist的格式就是[谁谁说:啊啊啊,谁谁谁说:2222] var t = this.data.talklist; for (var i = 0; i<t.length; i++) { writeln(t[i]); } }; Talk_SO.connect(myNC); //发消息函数 function post() { //如果不存在talklist就建一个,这里没用server端,是个技巧 if (Talk_SO.data.talklist[0] == undefined) { Talk_SO.data.talklist = []; } //限制数组长度,是个队列。保证里边有5条消息,当然也可以更多,但如果没有限制,flash会垮的 if (Talk_SO.data.talklist.length>=5) { Talk_SO.data.talklist.shift(); } //把消息装到so里 Talk_SO.data.talklist.push(myname+"说:"+meText.text); meText.text = ""; } //文字显示,换行 function writeln(msg) { remoteText.text += msg+"\n"; remoteText.vPosition =remoteText.maxVPosition } //----------------------------------------------- Btn.onRelease = function() { post(); }; this.onKeyDown = function() { if (Key.isDown(Key.ENTER)) { post(); } }; Key.addListener(this);
原文件
http://www.nshen.net/blog/attachments/200602/smallchat.fla