【问题标题】:Wowza Server Module - Timer/Countdown on Video ChatWowza 服务器模块 - 视频聊天的定时器/倒计时
【发布时间】:2013-01-31 11:43:30
【问题描述】:

对于我们当前的项目,我们需要一个视频聊天应用程序来跟踪这些视频对话的持续时间。

每个对话都有一段有限的时间,之后聊天就会终止。

我已经构建了基本模块,但我在实现该计时器时遇到了问题。 在 WOWZA 1 对 1 视频聊天应用程序中始终是 2 个流:

User1 发布一个流,User2 播放(订阅)该流
User2 发布一个流,User1 播放(订阅)该流

有限的时间量(在聊天之前)保存在数据库中。

现在减少这个数量的最佳方法是什么?

我不能在 StreamListener 中这样做,因为总是有两个流并且它会减少两次。

也许是某种单例?

谢谢!

【问题讨论】:

  • 您是否尝试在 Wowza 支持论坛中发布问题?他们很有帮助。
  • 我会试试的。感谢您的提示。

标签: timer video-streaming wowza videochat


【解决方案1】:

如果您的视频聊天时间在聊天开始后没有改变,而不是单例,您可以实现一个模块并在playpublish 事件上附加TimerTask。下面是一个帮助您入门的示例。

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) {     
    }

}

【讨论】:

  • 好方法。我必须跟踪(剩余/经过的)时间。我发现每个流对象都有一个 ElapsedTime 对象,它跟踪那个时间。但如果聊天结束该时间结束之前,我将不得不将差异保存到数据库中。我怎样才能做到最好?
  • publish 方法上,您可以将客户端侦听器(IMediaStreamActionNotify)附加到流中,然后您可以在聊天结束时在onUnPublish 函数中获取经过的时间。我为你修改了答案。您还可以在模块中添加一个字段,在计时器任务运行时将该字段设置为某个值。然后您可以跟踪聊天会话是被定时器任务终止还是在定时器之前被终止。
  • 不是我做的确切结果,但你帮了我很多,感谢赏金。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2021-07-05
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2013-07-17
相关资源
最近更新 更多