Streaming problem

Hello! We’re stuck with a problem of video streamed by (Wowza 2.2.4.07 + “playlists and schedules set in smil file” module + multicastpublish module + udpxy on a remote server) “crumbling” during playback. After some experiments we’ve figured out that the problem seems to origin from the content being streamed. We tried different source files; some work great, others don’t. The overall tendency is: the greater the bitrate, the worse is the playback quality. So the question is: what are the best settings for encoding/multiplexing the files to be streamed? Can Wowza 2.2.4.07 change PCR (Program Clock Reference) and the number of transport packets in a network packet?

Thank you in advance for any help!

UPD: Now testing the same files from a server in our LAN. The playback is quite smooth. Any suggestions?

Contents of Application.xml:

	<Root>
	<Application>
		<!-- Uncomment to set application level timeout values
		<ApplicationTimeout>60000</ApplicationTimeout>
		<PingTimeout>12000</PingTimeout>
		<ValidationFrequency>8000</ValidationFrequency>
		<MaximumPendingWriteBytes>0</MaximumPendingWriteBytes>
		<MaximumSetBufferTime>60000</MaximumSetBufferTime>
		<MaximumStorageDirDepth>25</MaximumStorageDirDepth>
		-->
		<Connections>
			<AutoAccept>true</AutoAccept>
			<AllowDomains></AllowDomains>
		</Connections>
		<!--
			StorageDir path variables
			
			${com.wowza.wms.AppHome} - Application home directory
			${com.wowza.wms.ConfigHome} - Configuration home directory
			${com.wowza.wms.context.VHost} - Virtual host name
			${com.wowza.wms.context.VHostConfigHome} - Virtual host config directory
			${com.wowza.wms.context.Application} - Application name
			${com.wowza.wms.context.ApplicationInstance} - Application instance name
			
		-->
		<Streams>
			<StreamType>rtp-live</StreamType>
			<StorageDir>${com.wowza.wms.context.VHostConfigHome}/content</StorageDir>
			<KeyDir>${com.wowza.wms.context.VHostConfigHome}/keys</KeyDir>
			<!-- LiveStreamPacketizers (separate with commas): cupertinostreamingpacketizer, smoothstreamingpacketizer, sanjosestreamingpacketizer, cupertinostreamingrepeater, smoothstreamingrepeater, sanjosestreamingrepeater -->
			<LiveStreamPacketizers>cupertinostreamingpacketizer, sanjosestreamingpacketizer</LiveStreamPacketizers>			
			<!-- DVRPacketizers (separate with commas): dvrpacketizer -->
			<DVRPacketizers></DVRPacketizers>			
			<!-- Properties defined here will override any properties defined in conf/Streams.xml for any streams types loaded by this application -->
			<Properties>
			</Properties>
		</Streams>
		<!-- HTTPStreamers (separate with commas): cupertinostreaming, smoothstreaming, sanjosestreaming -->
		<HTTPStreamers>cupertinostreaming,sanjosestreaming</HTTPStreamers>			
		<!-- DVRStores (separate with commas): dvrfilestorage -->
		<DVRStores></DVRStores>			
		<SharedObjects>
			<StorageDir></StorageDir>
		</SharedObjects>
		<Client>
			<IdleFrequency>-1</IdleFrequency>
			<Access>
				<StreamReadAccess>*</StreamReadAccess>
				<StreamWriteAccess>*</StreamWriteAccess>
				<StreamAudioSampleAccess></StreamAudioSampleAccess>
				<StreamVideoSampleAccess></StreamVideoSampleAccess>
				<SharedObjectReadAccess>*</SharedObjectReadAccess>
				<SharedObjectWriteAccess>*</SharedObjectWriteAccess>
			</Access>
		</Client>
		<RTP>
			<!-- RTP/Authentication/[type]Methods defined in Authentication.xml. Default setup includes; none, basic, digest -->
			<Authentication>
				<PublishMethod>digest</PublishMethod>
				<PlayMethod>none</PlayMethod>
			</Authentication>
			<!-- RTP/AVSyncMethod. Valid values are: senderreport, systemclock, rtptimecode -->
			<AVSyncMethod>senderreport</AVSyncMethod>
			<MaxRTCPWaitTime>12000</MaxRTCPWaitTime>
			<IdleFrequency>75</IdleFrequency>
			<RTSPSessionTimeout>90000</RTSPSessionTimeout>
			<RTSPMaximumPendingWriteBytes>0</RTSPMaximumPendingWriteBytes>
			<RTSPBindIpAddress>valid.server.ip.here</RTSPBindIpAddress>
			<RTSPConnectionIpAddress>valid.server.ip.here</RTSPConnectionIpAddress>
			<RTSPOriginIpAddress>valid.server.ip.here</RTSPOriginIpAddress>
			<IncomingDatagramPortRanges>*</IncomingDatagramPortRanges>
			<!-- Properties defined here will override any properties defined in conf/RTP.xml for any depacketizers loaded by this application -->
			<Properties>
				<Property>
					<Name>forceMPEGTSOut</Name>
					<Value>true</Value>
					<Type>Boolean</Type>
				</Property>
				<Property>
					<Name>rtpWrapMPEGTS</Name>
					<Value>true</Value>
					<Type>Boolean</Type>
				</Property>
			</Properties>
		</RTP>
		<MediaCaster>
			<!-- Properties defined here will override any properties defined in conf/MediaCasters.xml for any MediaCasters loaded by this applications -->
			<Properties>
			</Properties>
		</MediaCaster>
		<MediaReader>
			<!-- Properties defined here will override any properties defined in conf/MediaReaders.xml for any MediaReaders loaded by this applications -->
			<Properties>
			</Properties>
		</MediaReader>
		<MediaWriter>
			<!-- Properties defined here will override any properties defined in conf/MediaWriter.xml for any MediaWriter loaded by this applications -->
			<Properties>
			</Properties>
		</MediaWriter>
		<LiveStreamPacketizer>
			<!-- Properties defined here will override any properties defined in conf/LiveStreamPacketizers.xml for any LiveStreamPacketizers loaded by this applications -->
			<Properties>
			</Properties>
		</LiveStreamPacketizer>
		<HTTPStreamer>
			<!-- Properties defined here will override any properties defined in conf/HTTPStreamers.xml for any HTTPStreamer loaded by this applications -->
			<Properties>
			</Properties>
		</HTTPStreamer>
		<DVRPacketizer>
			<!-- Properties defined here will override any properties defined in conf/DVR.xml for any DVRPacketizer loaded by this applications -->
			<Properties>
			</Properties>
		</DVRPacketizer>
		<DVRStore>
			<!-- Properties defined here will override any properties defined in conf/DVR.xml for any DVRStore loaded by this applications -->
			<Properties>
			</Properties>
		</DVRStore>
		<Repeater>
			<OriginURL></OriginURL>
			<QueryString><![CDATA[]]></QueryString>
		</Repeater> 
		<Modules>
			<Module>
				<Name>base</Name>
				<Description>Base</Description>
				<Class>com.wowza.wms.module.ModuleCore</Class>
			</Module>
			<Module>
				<Name>properties</Name>
				<Description>Properties</Description>
				<Class>com.wowza.wms.module.ModuleProperties</Class>
			</Module>
			<Module>
				<Name>logging</Name>
				<Description>Client Logging</Description>
				<Class>com.wowza.wms.module.ModuleClientLogging</Class>
			</Module>
			<Module>
				<Name>flvplayback</Name>
				<Description>FLVPlayback</Description>
				<Class>com.wowza.wms.module.ModuleFLVPlayback</Class>
			</Module> 
			<Module>
				<Name>ModuleMulticastPublish</Name>
				<Description>ModuleMulticastPublish</Description>
				<Class>com.wowza.wms.plugin.multicastpublish.ModuleMulticastPublish</Class>
			</Module>
		</Modules>
		<!-- Properties defined here will be added to the IApplication.getProperties() and IApplicationInstance.getProperties() collections -->
		<Properties>
			<Property>
				<Name>multicastPublishMaximumStartDelay</Name>
				<Value>10000</Value>
				<Type>Integer</Type>
			</Property>
			<Property>
				<Name>multicastPublishWriteSDPFiles</Name>
				<Value>true</Value>
				<Type>Boolean</Type>
			</Property>
			<Property>
				<Name>multicastPublishRemoveSDPFiles</Name>
				<Value>true</Value>
				<Type>Boolean</Type>
			</Property>
			<Property>
				<Name>multicastPublishSDPStorageDir</Name>
				<Value>${com.wowza.wms.context.VHostConfigHome}/applications/${com.wowza.wms.context.Application}/sdp</Value>
			</Property>
			<Property>
				<Name>multicastPublishMulticastMapPath</Name>
				<Value>${com.wowza.wms.context.VHostConfigHome}/conf/multicastmap.txt</Value>
			</Property>
			<Property>
				<Name>multicastPublishMulticastMapNameDelimiter</Name>
				<Value>=</Value>
			</Property>
			<Property>
				<Name>multicastPublishAutoAssignAddresses</Name>
				<Value>false</Value>
				<Type>Boolean</Type>
			</Property>
			<Property>
				<Name>multicastPublishMulticastStartingAddress</Name>
				<Value>239.5.5.5</Value>
			</Property>
			<Property>
				<Name>multicastPublishMulticastAddressIncrement</Name>
				<Value>1</Value>
				<Type>Integer</Type>
			</Property>
			<Property>
				<Name>multicastPublishMulticastStartingPort</Name>
				<Value>10000</Value>
				<Type>Integer</Type>
			</Property>
			<Property>
				<Name>multicastPublishMulticastAddressIncrementMode</Name>
				<Value>address</Value>
			</Property>
			<Property>
				<Name>multicastPublishMPEGTSOut</Name>
				<Value>false</Value>
				<Type>Boolean</Type>
			</Property>
		</Properties>
	</Application>
</Root>

Can anybody help us?

Let’s try to narrow down where the issue is.

  1. I see you are using a multicast address to send a stream to your “remote server”. So, the remote server is on your multicast aware internal network? May I ask why you are using multicast? Are you only sending the stream from Wowza to your remote server? If so, maybe a unicast destination address would be better.

  2. What is the motivation/goal for using udpxy? How do you have it set up? Maybe you could try a dev/trial license of Wowza instead of udpxy, so that you have the resources of Wowza support involved in your setup. Perhaps you will find udpxy is where the problem is introduced.

  3. “We tried different source files; some work great, others don’t.” Can you be specific about the differences in the files. What is the exact encoding parameters and encoding tool used to generate them? Some analysis of the encoding seems like the solution here. Try the standard: H.264 baseline profile, 2sec keyframe interval, AAC 128kbit, stereo, 44.1khz.

  4. “can Wowza change PCR (Program Clock Reference) and the number of transport packets in a network packet?”

You’re talking about NAL units per Ethernet Packet, right? Yes, see here: https://www.wowza.com/forums/showthread.php?11624-MPEGTS-out-properties-to-control-playback

  1. “Now testing the same files from a server in our LAN. The playback is quite smooth.” What is the scenario here? Is this Wowza->Flash Client or Wowza->Multicast->VLC?

-Randall

  1. We’re sending a stream from our remote server. The stream is formed by (Wowza 2.2.4.07 + “playlists and schedules set in smil file” module). Next, the stream is published in multicast via the multicastpublish module. Next, udpxy listens for client requests on http://server.ip:someport/udp/some.ip.from.multicastpublishmodule:multicastport and gives away the stream via http. Udpxy is just a way of wrapping multicast streams into http.

  2. The motivation for using udpxy is to get http (not HLS!) stream out of Wowza, playable on most devices and behind NAT. The motivation for getting http stream out of Wowza is to migrate our channel broadcast from vlc to Wowza. We have a valid commercial license of Wowza, but since it can’t stream into http, this doesn’t matter. Udpxy doesn’t have any settings that may have an impact on streaming. Udpxy MAY be where the problem is introduced, but we have an app configured in Wowza that restreams an incoming RTP stream into multicast and then udpxy gives away that multicast stream without any crumbling or other picture distortions.

  3. The encoding software is Main Concept, mostly, and the encoding is done using H.264 Main or High profile, resolution 720p, 2,5 to 4 Mbps variable bitrate. I can’t tell the exact encoding parameters right now since I’m not the one who does the encoding.

  4. Yep, that’s what I was looking for, thank you! By the way, changing mpegtsPacketsPerBlock to 5 and mpegtsAlwaysSendZeroPacketLen to true helped a lot, but didn’t fully solve the problem (picture “crumbling” still occurs, but much more rarely: once-twice a minute).

  5. The scenario is isentical to the one on the remote server.

me have the same problem, Did you get a fedora?