使用RTMP和Red5模拟视频聊天,无需摄像头和麦克风

时间:2014-09-02 20:33:28

标签: flex video stream red5 flv

我正在尝试编写一个应用程序,它将在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建立连接以在.flv中流式传输。每次在任何用户侧更新视频时,相应的FLV文件都会更新。最终用户仍然打开流,新视频现在将流式传输给最终用户。这就是视频聊天的工作原理。

现在,如果这是正确的理解,我有以下问题:

  1. 要在没有网络摄像头和麦克风的情况下模拟此聊天,我是否可以编写一个Flex客户端,只需通过已建立的流将FLV文件从客户端上传到服务器端?从客户端我将使用NetConnection连接到流。应该写什么样的服务器端代码来从客户端接收FLV以保存在服务器端?而且,此流媒体应类似于网络摄像头视频流。

  2. 如何告诉User2流下载User1上传的同一个FLV文件?我的意思是,假设我希望多个用户“聊天”#34;这意味着,会创建多个流。如何知道每个终端的使用情况,下载哪个特定的FLV文件?此外,最终用户将如何知道何时开始下载FLV文件? User1不断更新FLV文件,该文件将保存在服务器端。 User2将如何知道视频文件已更新,是时候将其流式传输。

  3. 感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

我想您使用的是Red5 1.0 Final版本。

让我们首先回答您的问题"流视频的格式是什么?": Red5可以传输FLV视频和MP3音频,但它只记录FLV(现在red5可以传输h264视频)。

您询问使用FLV文件替换网络摄像头(...)juste进行测试,这不是一个好主意,我不会想到"有一种简单的方法可以做到这一点。但您可以使用第三个软件(如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);

播放视频流: 现在我们有一个NetStream" client_1_stream"发布在Red5服务器上并准备好由其他连接用户播放,因此这就是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服务器 这是一篇关于使用java servlet将文件上传到red5的好文章。 Upload file to Red5 server

如何告诉client_2流下载相同的FLV文件, 哪个已被client_1上传?

在这种情况下,我们的目标是将上传的文件名发送给client_2进行播放。要完成此操作,client_1必须调用服务器端的函数,该函数调用client_2代码中的函数。 client_1 function -- call --> server function -- call --> client_2 function.

在客户端,我们需要两个功能,以及服务器端的一个功能! 名为fileUploadSuccess()的第一个客户端函数在red5应用程序userFileUploded(fileName)上调用一个函数,最终该函数找到正确的用户并调用名为onFileUploadSuccess(fileName)的client_2函数。 fileUploadSuccess() -- call --> userFileUploded(fileName) -- call --> onFileUploadSuccess(fileName).

这是一个在FMS和red5应用程序上使用的非常着名的技术,你可以在网上找到很多例子,否则我可以与你分享一些代码,如果你需要更多的帮助。

您也可以使用red5 sharedObject执行此操作,但我个人更喜欢第一种解决方案。

想你:)