PDA

Просмотр полной версии : wowza textchat


Silencе
22.10.2011, 10:37
использую медиа сервер wowza. не могу разобраться в реализации общения сервера и флешки.
документация на английском - с этим у меня неважно. поэтому это затрудняет поиск необходимой мне информации по их сайту.

я не понимаю два момента - методы на сервере нужно создавать самим или уже есть готовые решения? где можно увидеть готовые примеры текстовых чатов?
был бы признателен за ссылки с ответами на интересующие меня вопросы, пусть даже на английском.

stweet
22.10.2011, 10:43
А при установке сервера вы в папочку exempls не пробовали заглянуть?

Silencе
22.10.2011, 11:52
пробовали. но что там? swf и фла. исходников кода нету же.

as классов нету. а все остальное, например файлы с джава расширением(jar. java) - никогда с ними не работал.

stweet
22.10.2011, 12:12
red5 скачай, я ещё и там исходники видел, но на флексе, в целом понятно.

Добавлено через 1 минуту
это, java - это на чём сервер написан, а class это откомпилированная java.

Silencе
22.10.2011, 12:18
мне нужен именно wowza. это принципиально.
я java класс открыл, там более-менее интуитивно понятно. к методам этого класса нужно обращаться NetConnection.call(...)?

stweet
22.10.2011, 12:26
Секунду, у меня по моему серв ещё остался, посмотрю исходники. Помнится как то писал на заказ могучий чат со всеми прибамбасами.

Добавлено через 7 минут


// то что нашёл на флешке, сам проект видимо на работе. Ну думаю это тоже не помешает прочесть.

package
{
import flash.display.Sprite;
import flash.events.NetStatusEvent;
import flash.media.Camera;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.net.ObjectEncoding;

public class PlayVideo extends Sprite
{
private var vo :Video;
private var ns :NetStream;
private var nc :NetConnection;

private var pf :String; // путь к файлу на сервере;
private var nf :String; // имя файла на сервере;

private var cw :int; // ширина ролика;
private var ch :int; // высота ролика;

private var tw :int; // ширина этого объекта;
private var th :int; // высота этого объекта;

private var ld :Boolean; // значение загрузки этого объекта;
private var dc :Number; // продолжительность ролика;

public function PlayVideo(p:String, n:String, w:int, h:int)
{
pf = p;
nf = n;

tw = w;
th = h;
}

public function startUp ():void
{
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, ON_STATUS);
nc.connect(pf);
}

private function connectStream():void
{
ns = new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS, ON_STATUS);
ns.client = {
onMetaData:function(ob:Object):void { // Выводит инфу по треку.
cw = ob.width;
ch = ob.height;
dc = Number(Number(ob.duration / 60).toFixed(2));
addVideo();
},
onCuePoint:function(ob:Object):void { // Походу выводит место маркера.
trace("onCuePoint");
for (var propName:String in ob)
trace("\t" + propName + ":\t" + ob[propName]);
},
onPlayStatus:function(ob:Object):void { // хз ... по идее должен возвращать статус.
trace("onPlayStatus");
for (var prop:String in ob)
trace("\t" + prop + ":\t" + ob[prop]);
}
};

ns.bufferTime = 10;

ns.play(nf);
ns.pause();
}

// запускаем или приостанавливаем ролик;
public function playPause ():void { ns.togglePause(); }

// удаляем коннект;
public function removeConnect ():void
{
ns.togglePause();

ns.removeEventListener(NetStatusEvent.NET_STATUS, ON_STATUS);
nc.removeEventListener(NetStatusEvent.NET_STATUS, ON_STATUS);

ns.close();
nc.close();

vo.clear();
removeChild(vo);

ld = false;
}

private function addVideo ():void
{
var cx:Number = tw / cw;
var cy:Number = th / ch;

var cs:Number = Number((cx > cy) ? cy.toFixed(1) : cx.toFixed(1));

vo = new Video(cw * cs, ch * cs);
vo.attachNetStream(ns);
addChild(vo);

ld = true;
}

private function ON_STATUS(e:NetStatusEvent):void
{
switch (e.info.code) {
case "NetConnection.Connect.Success": connectStream(); break;
case "NetStream.Play.StreamNotFound": trace("нет пути к файлу!"); break;
}
trace(e.info.code);
}

public function get complete ():Boolean { return ld; }
public function get durationClip ():Number { return dc; }
public function get fps ():Number { return ns.currentFPS; }
public function get timeMove ():Number { return ns.time; }
public function get bufferLoad ():Number { return ns.bufferLength; }
}
}

Silencе
22.10.2011, 12:42
спасибо за помощь. в видеоплеере все ясно в принципе.
а по флеш чату буду ковырять джава класс

stweet
22.10.2011, 12:47
Ну там ни совсем простой плеер был, это как раз часть самого чата, т.е. можно писать с вэбки а после ещё и просматривать, что то типа видео логи.
а по чату там всё тоже самое, коннектимся, и пишем в файлик лог, который в свою очередь и отображает твой чат. Так же в вовзе можно писать настройки по истории передачи данных, очень удобно. сам движёк трогать не надо, он полностью по AS заточен, т.е. все клиенты к нему пишутся на as.

Silencе
22.10.2011, 12:51
не пойму, как обрабатывать оповещения сервера о том, что кто-то написал сообщение?

//код java-класса. функция вызываемая из флешки для отправки сообщения.
public void addMessage(IClient client, RequestFunction function, AMFDataList params)
{
String soName = params.getString(PARAM1);
AMFDataObj chatData = params.getObject(PARAM2);

while(true)
{
ISharedObject textchat_so = getChatSharedObject(soName, client.getAppInstance());
if (textchat_so == null)
break;

textchat_so.lock();
try
{
// add the chat item to the list
nextChatId++;
String propName = "chatData"+nextChatId;
getLogger().info("ModuleTextChat.addMessage: message id: "+propName);
textchat_so.setProperty(propName, chatData);
textchat_so.setProperty("lastChatId", new AMFDataItem(nextChatId));

// remove old messages
if ((nextChatId % keepCount) == 0)
{
long startId = nextChatId - keepCount;
while(startId > 0)
{
String delName = "chatData"+startId;

if (textchat_so.getSlot(delName) != null)
textchat_so.deleteSlot(delName);
else
break;

startId--;
}

purgeDeleted(textchat_so);
}
}
catch(Exception e)
{
getLogger().error("ModuleTextChat.addMessage: "+e.toString());
}
finally
{
textchat_so.unlock();
}

break;
}
}


пользователь послал сообщение на сервер. как об этом узнают все остальные?
сначало мне казалось что NetConnection.client() , но ведь в него передается объект. а мне нужно чтобы сервак вызывал функцию у всех клиентов и передавал в нее сообщение которое отправил пользователь.