我正在尝试编写一个应用程序,它将在Red5服务器上创建负载,类似于视频聊天时创建的负载。一切都应该自动运行。因此,我正在努力了解聊天应用程序是如何工作的。以下是我的发现。如果我错了,请纠正我:
User1和User2正在聊天。编写了一个flex客户端,它将在User1和User2的本地运行。flex客户端User1和User2将同时开始录制网络摄像头视频和麦克风音频。这将创建一个原始视频文件(此视频的格式是什么?)流式传输。将与Red5建立一个流通道。在Flex代码中,我将使用NetConnection命令来建立到Red5应用程序的流。来自客户端的原始音频和视频将流式传输到服务器,并保存为FLV文件。来自User1的FLV文件将保存为.FLV,来自User2的FLV将保存为.FLV。现在,User2将与Red5建立连接以在.FLV中进行流式传输,User1将与Red5建立连接,以在.flf中进行流化传输。每次在任何用户端更新视频时,都会更新相应的FLV。最终用户仍然打开流,新视频现在将流式传输给最终用户。这就是视频聊天的工作原理。
现在,如果这是正确的理解,我有以下问题:
-
为了在没有网络摄像头和麦克风的情况下模拟这种聊天,我可以编写一个flex客户端,通过已建立的流将FLV文件从客户端上传到服务器端吗?从客户端,我将使用NetConnection连接到流。应该编写什么样的服务器端代码来从客户端接收FLV并保存在服务器端?而且,这种流媒体应该类似于网络摄像头视频的流媒体。
-
我如何告诉User2流式下载User1上传的同一个FLV文件?我的意思是,假设我想让多个用户"聊天"。这意味着,将创建多个流。每个最终用户将如何知道要下载哪个特定的FLV文件?此外,最终用户如何知道何时开始下载FLV文件?User1正在不断更新保存在服务器端的FLV文件。User2如何知道视频文件已经更新,是时候流式传输了。
非常感谢您的帮助!!
我想您使用的是Red5 1.0最终版本。
让我们首先回答您的问题"流媒体视频的格式是什么?":Red5可以流式传输FLV视频和MP3音频,但它只录制FLV(现在Red5可以传输h264视频)。
你问过使用FLV文件来代替网络摄像头(…)只是为了测试,这不是一个好主意,我"不认为"有一个简单的方法可以做到这一点。但你可以使用第三个软件(如manycam.com)来创建许多虚拟网络摄像头,以帮助你测试你的应用程序。
但是,如果你有兴趣将视频上传(不发布-没有实时)到red5服务器,那么你可以在没有red5服务的情况下完成,因为red5是Tomcat服务器,所以你可以像在Java web应用程序中一样上传视频,忘记了rtmp,使用简单的Java http文件上传,那么你就可以播放这个视频。
应该编写什么样的服务器端代码才能接收该FLV?如果你只需要流式传输视频,你不必在服务器端做任何思考!只需在red5/webapps/your_application_name上创建一个应用程序空文件夹。但是,如果您需要做更多的工作,那么您必须实现您的应用程序。
接下来是一组注释代码,可以帮助你做到这一点!
将网络摄像头/麦克风流式传输到red5服务器:这是如何将网络摄像头/麦克风从client_1发布到red5服务器的示例代码:
var nsOut:NetStream; //Out NetStream var cam:Camera; //camera instance var mic:Microphone;//microphone instance //"nc" is a NetConnection instance connected to red5 application. nsOut = new NetStream(nc); //setting the microphone mic = Microphone.getMicrophone(0); mic.codec = SoundCodec.SPEEX; mic.encodeQuality = 4; mic.setUseEchoSuppression(true); //setting the microphone try{ //Create camera instance using Camera.names array to choose the right one! cam = Camera.getCamera(Camera.names[0]); //Camera.names[1] for second camera and so on. //Camera Settings cam.setKeyFrameInterval (15); cam.setMode (240,180,15,false); cam.setMotionLevel (35,3000); cam.setQuality (40000 / 8,0); }catch(e:Error){ Alert.show("Webcam error!"); } nsOut.attachCamera (cam); // attach camera to NetStream nsOut.attachAudio(mic); //attach microphone to NetStream nsOut.publish ("client_1_stream"); //start streaming //finaly to show outgoing cam video var vid:Video = new Video(160,120); this.addChild (vid); vid.attachCamera(cam);
播放视频流:现在,我们在Red5服务器上发布了一个NetStream"client_1_stream",并准备由其他连接的用户播放,所以这就是client_2显示该流的方式:
var nsIn:NetStream; //Incoming NetStream nsIn = new NetStream(nc); nsIn.play("client_1_stream"); //finaly to show incoming video var vid:Video = new Video(160,120); this.addChild(vid); vid.attachNetStream(nsIn);
现在你有了发布/播放视频的想法,为此你不需要任何服务器端代码。
将文件上载到red5服务器:这是一篇关于使用javaservlet将文件上传到red5的好文章。上传文件到Red5服务器
如何告诉client_2流式下载相同的FLV文件,客户端1上传了哪些
在这种情况下,我们的目标是将上传的文件名发送给client_2来播放。要完成这一任务,client_1必须调用服务器端的一个函数,该函数调用client_2代码中的一个功能。client_1 function -- call --> server function -- call --> client_2 function.
在客户端,我们需要两个功能,在服务器端需要一个功能!第一个名为fileUploadSuccess()的客户端函数调用red5应用程序userFileUploded(fileName)上的一个函数,最后该函数找到合适的用户并调用名为onFileUploadSuc成功(fileName。fileUploadSuccess() -- call --> userFileUploded(fileName) -- call --> onFileUploadSuccess(fileName).
这是一种在FMS和red5应用程序上使用的非常著名的技术,你可以在网上找到许多示例,如果你需要更多帮助,我可以与你分享一些代码。
您也可以使用red5 sharedObject来实现这一点,但就我个人而言,我更喜欢第一种解决方案。
认为你:)