Серверный модуль Wowza - таймер/обратный отсчет в видеочате

Для нашего текущего проекта нам нужно приложение видеочата, которое отслеживает продолжительность этих видеоразговоров.

Каждый разговор также имеет ограниченное время, по истечении которого чат прекращается.

Я уже построил базовый модуль, но у меня проблемы с реализацией этого таймера. В приложении видеочата WOWZA 1-to-1 всегда 2 потока:

Пользователь 1 публикует поток, который воспроизводится (подписывается) пользователем 2
Пользователь 2 публикует поток, который воспроизводится пользователем 1 (подписывается)

Ограниченное количество времени сохраняется (до чата) в базе данных.

Теперь, как лучше всего уменьшить эту сумму?

Я не могу сделать это в StreamListener, потому что всегда есть два потока, и он уменьшится вдвое.

Может быть, какой-то синглтон?

Спасибо!


person nahri    schedule 31.01.2013    source источник
comment
Вы пытались опубликовать проблему на форуме поддержки Wowza? Они весьма полезны.   -  person Salman    schedule 31.01.2013
comment
Я попробую. Спасибо за чаевые.   -  person nahri    schedule 31.01.2013


Ответы (1)


Вместо синглтона, если время вашего видеочата не меняется после начала чата, вы можете реализовать модуль и прикрепить событие TimerTask к событию play или publish. Ниже приведен пример, который поможет вам начать работу.

import java.util.Timer;
import java.util.TimerTask;

import com.wowza.wms.amf.AMFDataList;
import com.wowza.wms.client.IClient;
import com.wowza.wms.logging.WMSLogger;
import com.wowza.wms.module.*;
import com.wowza.wms.request.RequestFunction;
import com.wowza.wms.stream.IMediaStream;
import com.wowza.wms.stream.IMediaStreamActionNotify;

public class KillAfterNSeconds extends ModuleBase implements IMediaStreamActionNotify {

    private class StreamKiller extends TimerTask{       
        private IMediaStream stream;        
        public StreamKiller(IMediaStream s){
            this.stream = s;
        }       
        @Override
        public void run() {
            try{
                // Complete all your clean up, such as :
                if(stream != null){
                    WMSLogger.getLogger("").info("Killing stream: " + stream.getName());
                    stream.getClient().shutdownClient();
                    stream.shutdown();
                    stream.close();
                }               
            }catch(Exception e){}
        }
    }

    public void publish(IClient paramIClient,
            RequestFunction paramRequestFunction, AMFDataList paramAMFDataList) {
        WMSLogger.getLogger("").info("Start running publish..");
        IMediaStream stream = getStream(paramIClient, paramRequestFunction);
        stream.addClientListener(this);
        Timer timer = new Timer();
        TimerTask task = new StreamKiller(stream);
        // replace here with the actual time to kill stream
        timer.schedule(task, 10000); 
        invokePrevious(paramIClient, paramRequestFunction, paramAMFDataList);
        WMSLogger.getLogger("").info("Finish running publish..");
        return;
    }

    @Override
    public void onUnPublish(IMediaStream stream, String streamName,
            boolean isRecord, boolean isAppend) {
        WMSLogger.getLogger("").info("Start onUnPublish..");
        double elapSeconds = stream.getElapsedTime().getTimeSeconds();
        WMSLogger.getLogger("").info("Elapsed time " + elapSeconds);
        WMSLogger.getLogger("").info("Finish running onUnPublish..");
    }

    @Override
    public void onPause(IMediaStream arg0, boolean arg1, double arg2) {     
    }
    @Override
    public void onPlay(IMediaStream arg0, String arg1, double arg2,
            double arg3, int arg4) {
    }
    @Override
    public void onPublish(IMediaStream arg0, String arg1, boolean arg2,
            boolean arg3) {
    }
    @Override
    public void onSeek(IMediaStream arg0, double arg1) {
    }
    @Override
    public void onStop(IMediaStream arg0) {     
    }

}
person ikikenis    schedule 20.02.2013
comment
Хороший подход. Мне придется отслеживать (оставшееся/прошедшее) время. Я обнаружил, что у каждого объекта потока есть объект ElapsedTime, который отслеживает это время. Но если чат закончится до того, как истечет это время, мне придется сохранить разницу в базе данных. Как я могу сделать это лучше всего? - person nahri; 22.02.2013
comment
В методе publish вы можете прикрепить к потоку прослушиватель клиента (IMediaStreamActionNotify), после чего вы сможете получить прошедшее время в функции onUnPublish по окончании чата. Я изменил ответ для вас. Вы также можете добавить поле в модуль, установить для поля какое-то значение при запуске задачи таймера. И тогда вы можете отслеживать, была ли сессия чата завершена задачей таймера или она была завершена до таймера. - person ikikenis; 22.02.2013
comment
не точный результат, как я это сделал, но вы мне очень помогли, спасибо за награду. - person nahri; 27.02.2013