• How to log play statistics on a timer

    Use the following module 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");				
    			}
    		}
    	}
    }


    If you're having problems or want to discuss this article, post in our forum.