создание видео чата
Вопрос к экспертам .Решил написать себе на сайт простенький FLEX видео чат на RED5.
Появилось два вопроса
1. При количестве трансляций не более 10 потянит ли VQ12 hetzner (только RED5).
2.У меня дома оптика 10Мбит может тупо дома сервер поставить это будет работать ?
2. Если канал позволяет - то можно. Но 10Мбит - это на самом деле не так уж и много для видео-чата.
Заранее спасибо..
У меня приложение (видеочат с использованием OpenMeetings) на RED5 работало под 4 Гб памяти - и этого хватало впритык на 5-6 подключений с видео и голосом. Сейчас просто лень искать конфигурацию сервера. Но больше ничего работать на нем в этот момент не могло - ядра были загружены на 50%, а память загружалась практически вся. Возможно это особенность данной конкретной платформы - в любом случае, тут надо брать начиная с минимальной и по нарастающей.
Блин не думал что такие ресурсы нужны, интересно какие же сервера на видео ресурсах работают...???
Цитата: vadim_k
Блин не думал что такие ресурсы нужны, интересно какие же сервера на видео ресурсах работают...???
Перекодирование графики, сжатие видеопотока требует ресурсов - в первую очередь оперативной памяти.
для начала решил простенький шаблон сделать и запустить локально захват видео с вебки это не сложно
а вот остановить чтобы замерло и запусть снова не получается может кто сталкивался
Код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();" layout="absolute" width="1000" height="600" cornerRadius="10" borderColor="#0E4E7B">
<mx:Script>
<![CDATA[
var camera:Camera;
public function initApp():void {
bcam.addEventListener(MouseEvent.CLICK, InitCamera);
}
public function InitCamera(event:Event):void{
camera=Camera.getCamera ();
if ( camera != null )
{
var widthcam:int = 640;
var heightcam:int = 480;
camera.setMode ( widthcam, heightcam, 30 );
camera.setQuality ( 0, 80 );
vd.attachCamera(camera);
bcam.label="Выключить";
bcam.addEventListener(MouseEvent.CLICK, StopCamera);
}
}
public function StopCamera(event:Event):void{
bcam.label="Включить Видео";
bcam.addEventListener(MouseEvent.CLICK, InitCamera);
vd.attachCamera(null);
}
]]>
</mx:Script>
<mx:TextArea y="39" width="216" height="551" x="20" cornerRadius="15" backgroundColor="#9AB9BF"/>
<mx:TextInput x="244" y="499" width="528" height="51"/>
<mx:Button x="673" y="558" label="Button"/>
<mx:TextArea x="244" y="39" width="504" height="452"/>
<mx:Panel x="756" y="39" width="234" height="272" layout="absolute" title="Моя WEB Камера" cornerRadius="10" themeColor="#494B4C" alpha="1.0" backgroundColor="#92A9B7">
<mx:VideoDisplay x="0" y="0" width="214" height="164" id="vd"/>
<mx:Button id="bcam" x="10" y="181" label="Включить Видео" width="194" height="32"/>
</mx:Panel>
</mx:Application>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();" layout="absolute" width="1000" height="600" cornerRadius="10" borderColor="#0E4E7B">
<mx:Script>
<![CDATA[
var camera:Camera;
public function initApp():void {
bcam.addEventListener(MouseEvent.CLICK, InitCamera);
}
public function InitCamera(event:Event):void{
camera=Camera.getCamera ();
if ( camera != null )
{
var widthcam:int = 640;
var heightcam:int = 480;
camera.setMode ( widthcam, heightcam, 30 );
camera.setQuality ( 0, 80 );
vd.attachCamera(camera);
bcam.label="Выключить";
bcam.addEventListener(MouseEvent.CLICK, StopCamera);
}
}
public function StopCamera(event:Event):void{
bcam.label="Включить Видео";
bcam.addEventListener(MouseEvent.CLICK, InitCamera);
vd.attachCamera(null);
}
]]>
</mx:Script>
<mx:TextArea y="39" width="216" height="551" x="20" cornerRadius="15" backgroundColor="#9AB9BF"/>
<mx:TextInput x="244" y="499" width="528" height="51"/>
<mx:Button x="673" y="558" label="Button"/>
<mx:TextArea x="244" y="39" width="504" height="452"/>
<mx:Panel x="756" y="39" width="234" height="272" layout="absolute" title="Моя WEB Камера" cornerRadius="10" themeColor="#494B4C" alpha="1.0" backgroundColor="#92A9B7">
<mx:VideoDisplay x="0" y="0" width="214" height="164" id="vd"/>
<mx:Button id="bcam" x="10" y="181" label="Включить Видео" width="194" height="32"/>
</mx:Panel>
</mx:Application>
Итак, поболтавшись по сети прочитав кучу инфы про Видео чаты принял решение пройти весь путь от начала и до конца всё равно вечерами делать нечего.
Пока поставил себе простенькую задачу создать небольшой простенький чатик с возможностью включать вебки и интегрировать его в свой сайт (аватарки, личные сообщения..)
Шаг первый
Создании простенького FLEX чатика пока без вебок.
Я думаю, серверную часть напишите сами
Она должна выдавать по запросу XML файлик с пользователями онлайн и новыми сообщениями
Код:
<response>
<refrash>10</refrash>
<chatname>vadim_k</chatname>
<online>
<num>295</num>
<user>vadim_k</user>
<avatar>http://..../avatar/1_0m.jpeg?r=777</avatar>
</online>
<messege>
<value>
<nu>130</nu>
<nm>vadim_k</nm>
<tx>eter eert re tert re er er er ter </tx>
<color>0x3300ff</color>
<data>25.01.2013</data>
<time>15:07:14</time>
<avat>http://..../avatar/1_0m.jpeg?r=581</avat>
</value>
</messege>
</response>
<refrash>10</refrash>
<chatname>vadim_k</chatname>
<online>
<num>295</num>
<user>vadim_k</user>
<avatar>http://..../avatar/1_0m.jpeg?r=777</avatar>
</online>
<messege>
<value>
<nu>130</nu>
<nm>vadim_k</nm>
<tx>eter eert re tert re er er er ter </tx>
<color>0x3300ff</color>
<data>25.01.2013</data>
<time>15:07:14</time>
<avat>http://..../avatar/1_0m.jpeg?r=581</avat>
</value>
</messege>
</response>
"FlashVars","sessionid=<?=session_id();?>"
При отправке сообщения к запросу отправляемому на сервер присоединяется переменная /op/ содержащая текст сообщения
Код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();" layout="absolute" width="1000" height="600" cornerRadius="10" borderColor="#66AFE2" themeColor="#14547C">
<mx:Script>
<![CDATA[
import mx.containers.Canvas;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.utils.ObjectUtil;
import mx.controls.Label;
import mx.controls.Image;
import mx.utils.ArrayUtil;
import mx.rpc.xml.SimpleXMLDecoder;
import mx.events.ValidationResultEvent;
public var server_script:String="http://...../video-chat/chat_response.php";
public var camera:Camera;
private var service:HTTPService;
private var t:Timer;
public var NewArray:Array = new Array();
public var NewMessegeArray:Array = new Array();
public var lastmessege:int;
public var sendparams:Object = new Object();
public var makemessege: Boolean;
public var blokmessegearea: Boolean = false;
public function initApp():void {
bcam.addEventListener(MouseEvent.CLICK, InitCamera);
startInt();
}
public function startInt():void {
t = new Timer(10000);
t.addEventListener(TimerEvent.TIMER, TimeReboot);
t.start();
//startButton.enabled = false;
//stopButton.enabled = true;
}
public function TimeReboot(event:Event):void{
sendparams.s_v=Application.application.parameters.sessionid;
loadUserAndmessege(server_script,sendparams)
}
private function loadUserAndmessege(src:String,params:Object):void {
httpService.url = src;
httpService.send(sendparams);
if(blokmessegearea == true){
textmessege.text="";
newtextmessege.label="Отправить";
blokmessegearea = false;
}
}
private function httpService_fault(evt:FaultEvent):void {
var title:String = evt.type + " (" + evt.fault.faultCode + ")";
var text:String = evt.fault.faultString;
t.stop();
}
private function httpService_result(evt:ResultEvent):void {
verifiUserOnline();
sendparams.op="";
}
private function convertXmlToArray( file:String ):Array {
var xml:XMLDocument = new XMLDocument( file );
var decoder:SimpleXMLDecoder = new SimpleXMLDecoder();
var data:Object = decoder.decodeXML( xml );
var array:Array = ArrayUtil.toArray( data.response.online );
return array;
}
private function getItemIndex(item:int):int {
var n:int = NewArray.length;
for (var i:int = 0; i < n; i++){
if (NewArray[i].num == UserOnline.getChildAt(item).name) return i;
}
return -1;
}
private function verifiUserOnline():void {
NewArray = convertXmlToArray(httpService.lastResult.toString());
//Alert.show(ObjectUtil.toString(httpService.lastResult));AddUserOnline(n);
for (var n:int = 0; n < NewArray.length; ++n) {
if(UserOnline.numChildren == 0 ){ for (var nz:int = 0; nz < NewArray.length; ++nz) {AddUserOnline(nz); } break;}
else {
//Alert.show("UserOnline.numChildren=" + UserOnline.numChildren + "NewArray.length=" + NewArray.length + "n=" + n);
if(UserOnline.numChildren-1 < n ){ AddUserOnline(n); }
else {
if(UserOnline.getChildAt(n).name == NewArray[n].num){ }
else {
if(getItemIndex(n) == -1){ UserOnline.removeChildAt(n); }
else {
//Alert.show("1");
AddUserOnline(n,n);
}
}
}
}
}
if(UserOnline.numChildren > NewArray.length){ for(var ty:int=NewArray.length; ty < UserOnline.numChildren; ++ty){ UserOnline.removeChildAt(ty); } }
//Alert.show(ObjectUtil.toString(httpService.lastResult));
//
NewMessegeArray=ArrayUtil.toArray(httpService.lastResult.messege.value)
for (n = 0; n < NewMessegeArray.length; ++n) {
if(NewMessegeArray[n].nu > 0){
lastmessege=NewMessegeArray[n].nu;
sendparams.last_mess=lastmessege;
//Alert.show(ObjectUtil.toString(httpService.lastResult));
AddMessegeArea(n);
}
}
}
private function AddMessegeArea(num:int):void {
var OnlineBox:Canvas = new Canvas();
OnlineBox.width= 350;
OnlineBox.verticalScrollPolicy="off";
OnlineBox.horizontalScrollPolicy="off";
OnlineBox.setStyle("borderColor",0xff0f00);
var OnlineBoxImg:Image = new Image ();
OnlineBoxImg.source=NewMessegeArray[num].avat;
OnlineBoxImg.x=0;
OnlineBoxImg.y=0;
OnlineBox.addChild(OnlineBoxImg);
var OnlineBoxLabel:Label = new Label ();
OnlineBoxLabel.text=NewMessegeArray[num].tx;
OnlineBoxLabel.x=53;
OnlineBoxLabel.y=5;
OnlineBoxLabel.setStyle("color",NewMessegeArray[num].color);
OnlineBox.addChild(OnlineBoxLabel);
idmessege.addChild(OnlineBox);
}
private function AddUserOnline(num:int,aftenum:int=-1):void {
var OnlineBox:Canvas = new Canvas();
OnlineBox.name=NewArray[num].num;
OnlineBox.width= 150;
OnlineBox.height=52;
OnlineBox.verticalScrollPolicy="off";
OnlineBox.horizontalScrollPolicy="off";dissolveIn
OnlineBox.setStyle("borderColor",0xff0000);
OnlineBox.setStyle("addedEffect", zoomAll);
var OnlineBoxImg:Image = new Image ();
OnlineBoxImg.source=NewArray[num].avatar;
OnlineBoxImg.x=0;
OnlineBoxImg.y=0;
OnlineBox.addChild(OnlineBoxImg);
var OnlineBoxLabel:Label = new Label ();
OnlineBoxLabel.text=NewArray[num].user;
OnlineBoxLabel.x=53;
OnlineBoxLabel.y=5;
OnlineBox.addChild(OnlineBoxLabel);
if(aftenum == -1){ UserOnline.addChild(OnlineBox); }
else{
UserOnline.addChildAt(OnlineBox, aftenum);
}
}
private function InitCamera(event:Event):void{//sessionid Application.application.parameters.sessionid
camera=Camera.getCamera ();
if ( camera != null )
{
var widthcam:int = 640;
var heightcam:int = 480;
camera.setMode ( widthcam, heightcam, 30 );
camera.setQuality ( 0, 80 );
vd.attachCamera(camera);
bcam.label="Выключить";
bcam.removeEventListener(MouseEvent.CLICK, InitCamera);
bcam.addEventListener(MouseEvent.CLICK, StopCamera);
} else Alert.show("WEB cam bad");
}
private function StopCamera(event:Event):void{
bcam.label="Включить Видео";
vd.attachCamera(null);
camera = null;
bcam.removeEventListener(MouseEvent.CLICK, StopCamera);
bcam.addEventListener(MouseEvent.CLICK, InitCamera);
}
private function makesendmessege(event:Event):void{
//Alert.show("makesendmessege");
var result:ValidationResultEvent = stringValidator.validate();
switch (result.type) {
case ValidationResultEvent.INVALID:
Alert.show(result.message, result.type);
break;
case ValidationResultEvent.VALID:
blokmessegearea=true;
sendparams.op=textmessege.text;
sendparams.color="0x"+youcolor.selectedColor.toString(16);
newtextmessege.label="Отправляется";
break;
}
}
]]>
</mx:Script>
<mx:Dissolve id="dissolveOut" duration="1000" alphaFrom="1.0" alphaTo="0.0"/>
<mx:Dissolve id="dissolveIn" duration="1000" alphaFrom="0.0" alphaTo="1.0"/>
<mx:Zoom id="zoomAll" zoomWidthTo="1" zoomHeightTo="1" zoomWidthFrom="1" zoomHeightFrom="0" />
<mx:StringValidator id="stringValidator"
source="{textmessege}"
property="text"
minLength="2"
maxLength="200" />
<mx:HTTPService id="httpService"
resultFormat="e4x"
fault="httpService_fault(event);"
result="httpService_result(event)"
method="POST"/>
<mx:Panel x="756" y="10" width="234" height="272" layout="absolute" title="Моя WEB Камера" cornerRadius="10" themeColor="#494B4C" alpha="1.0" backgroundColor="#92A9B7">
<mx:VideoDisplay x="0" y="0" width="214" height="164" id="vd"/>
<mx:Button id="bcam" x="10" y="181" label="Включить Видео" width="194" height="32"/>
</mx:Panel>
<mx:VBox x="10" y="10" height="580" width="226" id="UserOnline">
</mx:VBox>
<mx:TextInput x="244" y="499" width="504" height="61" id="textmessege" fontSize="13" fontWeight="bold"/>
<mx:Button x="619" y="568" click="makesendmessege(event)" label="Отправить" id="newtextmessege" />
<mx:VBox x="244" y="10" height="481" width="504" id="idmessege" backgroundColor="#C4C5E4">
</mx:VBox>
<mx:ColorPicker x="244" y="568" width="51" id="youcolor" change="textmessege.setStyle("color",'0x'+youcolor.selectedColor.toString(16));" fontSize="15"/>
</mx:Application>
<mx:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();" layout="absolute" width="1000" height="600" cornerRadius="10" borderColor="#66AFE2" themeColor="#14547C">
<mx:Script>
<![CDATA[
import mx.containers.Canvas;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.utils.ObjectUtil;
import mx.controls.Label;
import mx.controls.Image;
import mx.utils.ArrayUtil;
import mx.rpc.xml.SimpleXMLDecoder;
import mx.events.ValidationResultEvent;
public var server_script:String="http://...../video-chat/chat_response.php";
public var camera:Camera;
private var service:HTTPService;
private var t:Timer;
public var NewArray:Array = new Array();
public var NewMessegeArray:Array = new Array();
public var lastmessege:int;
public var sendparams:Object = new Object();
public var makemessege: Boolean;
public var blokmessegearea: Boolean = false;
public function initApp():void {
bcam.addEventListener(MouseEvent.CLICK, InitCamera);
startInt();
}
public function startInt():void {
t = new Timer(10000);
t.addEventListener(TimerEvent.TIMER, TimeReboot);
t.start();
//startButton.enabled = false;
//stopButton.enabled = true;
}
public function TimeReboot(event:Event):void{
sendparams.s_v=Application.application.parameters.sessionid;
loadUserAndmessege(server_script,sendparams)
}
private function loadUserAndmessege(src:String,params:Object):void {
httpService.url = src;
httpService.send(sendparams);
if(blokmessegearea == true){
textmessege.text="";
newtextmessege.label="Отправить";
blokmessegearea = false;
}
}
private function httpService_fault(evt:FaultEvent):void {
var title:String = evt.type + " (" + evt.fault.faultCode + ")";
var text:String = evt.fault.faultString;
t.stop();
}
private function httpService_result(evt:ResultEvent):void {
verifiUserOnline();
sendparams.op="";
}
private function convertXmlToArray( file:String ):Array {
var xml:XMLDocument = new XMLDocument( file );
var decoder:SimpleXMLDecoder = new SimpleXMLDecoder();
var data:Object = decoder.decodeXML( xml );
var array:Array = ArrayUtil.toArray( data.response.online );
return array;
}
private function getItemIndex(item:int):int {
var n:int = NewArray.length;
for (var i:int = 0; i < n; i++){
if (NewArray[i].num == UserOnline.getChildAt(item).name) return i;
}
return -1;
}
private function verifiUserOnline():void {
NewArray = convertXmlToArray(httpService.lastResult.toString());
//Alert.show(ObjectUtil.toString(httpService.lastResult));AddUserOnline(n);
for (var n:int = 0; n < NewArray.length; ++n) {
if(UserOnline.numChildren == 0 ){ for (var nz:int = 0; nz < NewArray.length; ++nz) {AddUserOnline(nz); } break;}
else {
//Alert.show("UserOnline.numChildren=" + UserOnline.numChildren + "NewArray.length=" + NewArray.length + "n=" + n);
if(UserOnline.numChildren-1 < n ){ AddUserOnline(n); }
else {
if(UserOnline.getChildAt(n).name == NewArray[n].num){ }
else {
if(getItemIndex(n) == -1){ UserOnline.removeChildAt(n); }
else {
//Alert.show("1");
AddUserOnline(n,n);
}
}
}
}
}
if(UserOnline.numChildren > NewArray.length){ for(var ty:int=NewArray.length; ty < UserOnline.numChildren; ++ty){ UserOnline.removeChildAt(ty); } }
//Alert.show(ObjectUtil.toString(httpService.lastResult));
//
NewMessegeArray=ArrayUtil.toArray(httpService.lastResult.messege.value)
for (n = 0; n < NewMessegeArray.length; ++n) {
if(NewMessegeArray[n].nu > 0){
lastmessege=NewMessegeArray[n].nu;
sendparams.last_mess=lastmessege;
//Alert.show(ObjectUtil.toString(httpService.lastResult));
AddMessegeArea(n);
}
}
}
private function AddMessegeArea(num:int):void {
var OnlineBox:Canvas = new Canvas();
OnlineBox.width= 350;
OnlineBox.verticalScrollPolicy="off";
OnlineBox.horizontalScrollPolicy="off";
OnlineBox.setStyle("borderColor",0xff0f00);
var OnlineBoxImg:Image = new Image ();
OnlineBoxImg.source=NewMessegeArray[num].avat;
OnlineBoxImg.x=0;
OnlineBoxImg.y=0;
OnlineBox.addChild(OnlineBoxImg);
var OnlineBoxLabel:Label = new Label ();
OnlineBoxLabel.text=NewMessegeArray[num].tx;
OnlineBoxLabel.x=53;
OnlineBoxLabel.y=5;
OnlineBoxLabel.setStyle("color",NewMessegeArray[num].color);
OnlineBox.addChild(OnlineBoxLabel);
idmessege.addChild(OnlineBox);
}
private function AddUserOnline(num:int,aftenum:int=-1):void {
var OnlineBox:Canvas = new Canvas();
OnlineBox.name=NewArray[num].num;
OnlineBox.width= 150;
OnlineBox.height=52;
OnlineBox.verticalScrollPolicy="off";
OnlineBox.horizontalScrollPolicy="off";dissolveIn
OnlineBox.setStyle("borderColor",0xff0000);
OnlineBox.setStyle("addedEffect", zoomAll);
var OnlineBoxImg:Image = new Image ();
OnlineBoxImg.source=NewArray[num].avatar;
OnlineBoxImg.x=0;
OnlineBoxImg.y=0;
OnlineBox.addChild(OnlineBoxImg);
var OnlineBoxLabel:Label = new Label ();
OnlineBoxLabel.text=NewArray[num].user;
OnlineBoxLabel.x=53;
OnlineBoxLabel.y=5;
OnlineBox.addChild(OnlineBoxLabel);
if(aftenum == -1){ UserOnline.addChild(OnlineBox); }
else{
UserOnline.addChildAt(OnlineBox, aftenum);
}
}
private function InitCamera(event:Event):void{//sessionid Application.application.parameters.sessionid
camera=Camera.getCamera ();
if ( camera != null )
{
var widthcam:int = 640;
var heightcam:int = 480;
camera.setMode ( widthcam, heightcam, 30 );
camera.setQuality ( 0, 80 );
vd.attachCamera(camera);
bcam.label="Выключить";
bcam.removeEventListener(MouseEvent.CLICK, InitCamera);
bcam.addEventListener(MouseEvent.CLICK, StopCamera);
} else Alert.show("WEB cam bad");
}
private function StopCamera(event:Event):void{
bcam.label="Включить Видео";
vd.attachCamera(null);
camera = null;
bcam.removeEventListener(MouseEvent.CLICK, StopCamera);
bcam.addEventListener(MouseEvent.CLICK, InitCamera);
}
private function makesendmessege(event:Event):void{
//Alert.show("makesendmessege");
var result:ValidationResultEvent = stringValidator.validate();
switch (result.type) {
case ValidationResultEvent.INVALID:
Alert.show(result.message, result.type);
break;
case ValidationResultEvent.VALID:
blokmessegearea=true;
sendparams.op=textmessege.text;
sendparams.color="0x"+youcolor.selectedColor.toString(16);
newtextmessege.label="Отправляется";
break;
}
}
]]>
</mx:Script>
<mx:Dissolve id="dissolveOut" duration="1000" alphaFrom="1.0" alphaTo="0.0"/>
<mx:Dissolve id="dissolveIn" duration="1000" alphaFrom="0.0" alphaTo="1.0"/>
<mx:Zoom id="zoomAll" zoomWidthTo="1" zoomHeightTo="1" zoomWidthFrom="1" zoomHeightFrom="0" />
<mx:StringValidator id="stringValidator"
source="{textmessege}"
property="text"
minLength="2"
maxLength="200" />
<mx:HTTPService id="httpService"
resultFormat="e4x"
fault="httpService_fault(event);"
result="httpService_result(event)"
method="POST"/>
<mx:Panel x="756" y="10" width="234" height="272" layout="absolute" title="Моя WEB Камера" cornerRadius="10" themeColor="#494B4C" alpha="1.0" backgroundColor="#92A9B7">
<mx:VideoDisplay x="0" y="0" width="214" height="164" id="vd"/>
<mx:Button id="bcam" x="10" y="181" label="Включить Видео" width="194" height="32"/>
</mx:Panel>
<mx:VBox x="10" y="10" height="580" width="226" id="UserOnline">
</mx:VBox>
<mx:TextInput x="244" y="499" width="504" height="61" id="textmessege" fontSize="13" fontWeight="bold"/>
<mx:Button x="619" y="568" click="makesendmessege(event)" label="Отправить" id="newtextmessege" />
<mx:VBox x="244" y="10" height="481" width="504" id="idmessege" backgroundColor="#C4C5E4">
</mx:VBox>
<mx:ColorPicker x="244" y="568" width="51" id="youcolor" change="textmessege.setStyle("color",'0x'+youcolor.selectedColor.toString(16));" fontSize="15"/>
</mx:Application>
Видео Чат сделал, подскажите как на этом сайте статью разместить хочу поделиться опытом ??
Цитата: vadim_k
Видео Чат сделал, подскажите как на этом сайте статью разместить хочу поделиться опытом ??
Сервер решил дома ставить? Подумал тут, что облака были бы круче. С такими-то возможностями по управлению ресурсами. И, наверное, дешевле.
У меня был старенький ноутбук Пентиум 4 1Гб ОЗУ поставил на нём Ubuntu 12 и RED5 у провайдера белый IP попросил побаловаться с приятелем друг на друга смотрели не тормозит...
Цитата: vadim_k
Видео Чат сделал, подскажите как на этом сайте статью разместить хочу поделиться опытом ??
я думаю что вот так Добавить статью
версия мини RED5 Flex Видео Чата.
Чат работает на версии Red5 1.0 и Java 7.0
Демка здесь red5-flex-videochat
Скачать исходники там же..
пишет не связи свидеосервером
на сервере Ubuntu 12 может из за небольшой разницы в версиях Java 1.7 и 1.7.12
не работает сегодня везде однинаковые версии установлю...
Вроде заработало !!!
да. удалось войти в чат - видеокамера не работает
какая операционка
у меня по Win Xp всё работает , под другими нет возможности теститровать,
вечером с приятелем соединюсь у него W7, кстати раньше мы с ним друг на друга смотрели , а в работе с камерой я ничего не менял..
смотреть и скачивать red5.reolan.ru
http://chat.exompies.ru/ ОШИБКА Нет соединения с медиа сервером
сделал как по инструкции
сделал как по инструкции