Use the following module in the Wowza Streaming Engine™ Java API to log stats for each play stream on a timer.
package com.wowza.wms.example.module;
import java.util.*;
import com.wowza.wms.application.*;
import com.wowza.wms.amf.*;
import com.wowza.wms.application.WMSProperties;
import com.wowza.wms.media.model.MediaCodecInfoAudio;
import com.wowza.wms.media.model.MediaCodecInfoVideo;
import com.wowza.wms.module.*;
import com.wowza.wms.stream.IMediaStream;
import com.wowza.wms.stream.IMediaStreamActionNotify3;
import java.util.Timer;
import com.wowza.util.IOPerformanceCounter;
public class ModuleStreamStats extends ModuleBase {
public void onStreamCreate(IMediaStream stream) {
getLogger().info("onStreamCreate by: " + stream.getClientId());
IMediaStreamActionNotify3 actionNotify = new StreamListener();
WMSProperties props = stream.getProperties();
synchronized(props)
{
props.put("streamActionNotifier", actionNotify);
}
stream.addClientListener(actionNotify);
}
public void onStreamDestroy(IMediaStream stream) {
getLogger().info("onStreamDestroy by: " + stream.getClientId());
IMediaStreamActionNotify3 actionNotify = null;
WMSProperties props = stream.getProperties();
synchronized(props)
{
actionNotify = (IMediaStreamActionNotify3)stream.getProperties().get("streamActionNotifier");
}
if (actionNotify != null)
{
stream.removeClientListener(actionNotify);
getLogger().info("removeClientListener: "+stream.getSrc());
}
}
class StreamListener implements IMediaStreamActionNotify3
{
public void onPlay(IMediaStream stream, String streamName, double playStart, double playLen, int playReset)
{
streamName = stream.getName();
getLogger().info("Stream Name: " + streamName);
StreamStats watchdog = new StreamStats();
IApplicationInstance appInstance;
try
{
try
{
appInstance = stream.getClient().getAppInstance();
}
catch(Exception ex)
{
appInstance = stream.getRTPStream().getAppInstance();
}
watchdog.stream = stream;
watchdog.start();
appInstance.getProperties().setProperty(streamName, watchdog);
}
catch(Exception ex)
{
}
}
public void onMetaData(IMediaStream stream, AMFPacket metaDataPacket)
{
getLogger().info("onMetaData By: " + stream.getClientId());
}
public void onPauseRaw(IMediaStream stream, boolean isPause, double location)
{
getLogger().info("onPauseRaw By: " + stream.getClientId());
}
public void onSeek(IMediaStream stream, double location)
{
}
public void onStop(IMediaStream stream)
{
getLogger().info("onStop By: " + stream.getClientId());
String streamName = stream.getName();
StreamStats watchdog = (StreamStats)stream.getClient().getAppInstance().getProperties().getProperty(streamName);
if (watchdog != null)
watchdog.stop();
}
public void onUnPublish(IMediaStream stream, String streamName, boolean isRecord, boolean isAppend)
{
}
public void onPublish(IMediaStream stream, String streamName, boolean isRecord, boolean isAppend)
{
}
public void onPause(IMediaStream stream, boolean isPause, double location)
{
}
public void onCodecInfoAudio(IMediaStream stream,
MediaCodecInfoAudio codecInfoAudio) {
}
public void onCodecInfoVideo(IMediaStream stream,
MediaCodecInfoVideo codecInfoVideo) {
}
}
private class StreamStats
{
public Timer mTimer;
public TimerTask mTask;
public IMediaStream stream;
public StreamStats(){
mTask = new TimerTask()
{
public void run()
{
getLogger().info("Run StreamStats");
if (stream!=null)
{
IOPerformanceCounter perf = stream.getMediaIOPerformance();
getLogger().info("Perf: " + perf.getMessagesOutBytes());
}
}
};
}
public void start(){
if (mTimer==null)
mTimer = new Timer();
mTimer.schedule(mTask, 10000, 10000);
getLogger().info("Start StreamStats");
}
public void stop(){
if (mTimer != null){
mTimer.cancel();
mTimer=null;
getLogger().info("Stop StreamStats");
}
}
}
}




