How to dynamically switch between RTP and MPEG-TS when streaming RTSP

Below is an example module that will dynamically switch between native RTP and MPEG-TS delivery when streaming out using RTSP. Adding the query parameter ?mpegts to the RTSP URL will force the session to MPEG-TS. An example scenario would be if you want to use one application to stream to mobile devices over RTP and to have set-top boxes request MPEG-TS.

Note: Wowza Media Server™ 3.0.0 or later is required.
package com.wowza.wms.plugin.test.module;

import com.wowza.wms.module.*;
import com.wowza.wms.application.*;
import com.wowza.wms.rtp.model.*;
import com.wowza.wms.rtsp.*;

public class ModuleRTSPTransportSwitcher extends ModuleBase
{
	IApplicationInstance appInstance = null;

	class TransportSwitcher implements IRTSPActionNotify
	{
		public void onDescribe(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
			while(true)
			{
				RTPStream rtpStream = rtspSession.getRTSPStream();
				if (rtpStream == null)
					break;

				boolean isForceMPEGTS = false; 

				String queryStr = rtspSession.getQueryStr();
				if (queryStr != null)
					isForceMPEGTS = queryStr.toLowerCase().contains("mpegts");

				getLogger().info("ModuleRTSPTransportSwitcher#TransportSwitcher.onDescribe["+appInstance.getContextStr()+"]: mpegts:"+isForceMPEGTS+" context:"+req.getHeader("context"));
				rtpStream.setForceMPEGTSOut(isForceMPEGTS);
				break;
			}
		}

		public void onAnnounce(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onSetParameter(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onGetParameter(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onOptions(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onPause(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onPlay(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onRecord(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onRedirect(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onSetup(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}

		public void onTeardown(RTPSession rtspSession, RTSPRequestMessage req, RTSPResponseMessages resp)
		{
		}
	}

	public void onAppStart(IApplicationInstance appInstance)
	{
		getLogger().info("ModuleRTSPTransportSwitcher.onAppStart["+appInstance.getContextStr()+"]");
		this.appInstance = appInstance;
	}

	public void onRTPSessionCreate(RTPSession rtpSession)
	{
		rtpSession.addActionListener(new TransportSwitcher());
	}
}

To add this module to Application.xml, edit [install-dir]/conf/[application]/Application.xml and add the following <Module> entry as the last entry in the <Modules> list:

<Module>
	<Name>ModuleRTSPTransportSwitcher</Name>
	<Description>ModuleRTSPTransportSwitcher</Description>
	<Class>com.wowza.wms.plugin.test.module.ModuleRTSPTransportSwitcher</Class>
</Module>

Originally Published: 10-09-2011.

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