Timer Wowza服务器模块-视频聊天计时器/倒计时
对于我们当前的项目,我们需要一个视频聊天应用程序来跟踪这些视频对话的持续时间 每一次对话都有一段有限的时间,在这段时间之后,聊天结束 我已经构建了基本模块,但在实现计时器时遇到了问题。 在WOWZA 1对1视频聊天应用程序中,始终有2个流: User1发布一个流,User2播放(订阅)Timer Wowza服务器模块-视频聊天计时器/倒计时,timer,video-streaming,wowza,videochat,Timer,Video Streaming,Wowza,Videochat,对于我们当前的项目,我们需要一个视频聊天应用程序来跟踪这些视频对话的持续时间 每一次对话都有一段有限的时间,在这段时间之后,聊天结束 我已经构建了基本模块,但在实现计时器时遇到了问题。 在WOWZA 1对1视频聊天应用程序中,始终有2个流: User1发布一个流,User2播放(订阅) User2发布一个流,User1播放(订阅) 有限的时间量保存在数据库中(聊天前) 现在,减少这个数量的最好方法是什么 我不能在StreamListener中这样做,因为总是有两个流,它会减少两倍 也许是单身汉
User2发布一个流,User1播放(订阅) 有限的时间量保存在数据库中(聊天前) 现在,减少这个数量的最好方法是什么 我不能在StreamListener中这样做,因为总是有两个流,它会减少两倍 也许是单身汉
谢谢 如果视频聊天时间在聊天开始后没有改变,您可以在
play
或publish
事件上实现一个模块并附加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) {
}
}
您是否尝试过在Wowza支持论坛上发布此问题?他们很有帮助,我试试看。谢谢你的提示,很好的方法。我必须跟踪(剩余/经过的)时间。我发现每个流对象都有一个ElapsedTime对象,它跟踪那个时间。但是如果聊天在时间结束之前结束,我必须将差异保存到数据库中。我如何才能做到最好?在
publish
方法中,您可以将客户端侦听器(IMediaStreamActionNotify
)附加到流,然后在聊天结束后,您可以在onUnPublish
功能中获取经过的时间。我为你修改了答案。您还可以向模块添加一个字段,在计时器任务运行时将该字段设置为某个值。然后你可以追踪聊天会话是被计时器任务终止还是在计时器前终止。不是确切的结果,但你帮了我很多,gratz。