Wowza Community

Wowza 3.6.2 HLS transcoded streams artifacts/pixelating on start of each segments

Hi Guys,

We are currently having issues with HLS streams having artifacts or pixelating ever start of HLS segments. Below is the details of the current set-up and workflow:

Set-up overview:

  1. We have a dedicated WowzaMediaserver (use as live origin) with nDVR and transcoder license. This server transcodes the incoming streams form multicast UDP and records them in an NFS server. THis server is also being used as origin for the other wowza servers that are mainly use for streaming to end user.

  2. The “Edge” wowza servers (without nDVR license) accesses the NFS server and streams the recorded videos to the end users just like in a VOD.

  3. The “Edge” Wowza servers also connects to the transcoded streams from the origin server and streams the live content.

Below are the current issues we are having:

  1. The recorded streams displays artifact (pixelation) mostly at the start or end of the segment.

  2. When there are more movements on the scene and with more lights. The quality of the both live and recorded videos becomes poor.

What we did so far:

  1. We tried setting the frame interval on the Wowza transcoder to 25 since the incoming streams are 25fps. This is to have a keyframe per second.

  2. We tried setting the dvrminimum chunk size to 10 seconds.

So far this have lessen the artifacts although it still occurs once in a while. We have also noted that sometimes the stream skips a frame (like it jumps to the next frame)

  1. We have also tried setting the transcoding to baseline profile. But these produced an even more poor quality transcoding and the didn’t solve the problems with the artifacts.

I can give you guys access to the streams if you require.

Below are the application settings

Transcoder and Origin 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>liverepeater-origin</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, dvrstreamingpacketizer, dvrstreamingrepeater -->
			<LiveStreamPacketizers>dvrstreamingpacketizer</LiveStreamPacketizers>
			<!-- Properties defined here will override any properties defined in conf/Streams.xml for any streams types loaded by this application -->
			<Properties>
				<!--
				<Property>
					<Name>sortPackets</Name>
				    	<Value>true</Value>
				        <Type>Boolean</Type>
				 </Property>
				 <Property>
				        <Name>sortBufferSize</Name>
				        <Value>750</Value>
				        <Type>Integer</Type>
				 </Property>
				-->
			</Properties>
		</Streams>
		<Transcoder>
			<!-- To turn on transcoder set to: transcoder -->
			<LiveStreamTranscoder>transcoder</LiveStreamTranscoder>
			<!-- [templatename].xml or ${SourceStreamName}.xml -->
			<!--<Templates>${SourceStreamName}.xml,transcode.xml</Templates>-->
			<Templates>${SourceStreamName}.xml</Templates>
			<ProfileDir>${com.wowza.wms.context.VHostConfigHome}/transcoder/profiles</ProfileDir>
			<TemplateDir>${com.wowza.wms.context.VHostConfigHome}/transcoder/templates</TemplateDir>
			<Properties>
				<Property>
     					<Name>sortPackets</Name>
				     <Value>true</Value>
				     <Type>Boolean</Type>
				</Property>
				<Property>
     					<Name>sortBufferSize</Name>
     					<Value>10000</Value>
     					<Type>Integer</Type>
				</Property>
			</Properties>
		</Transcoder>
		<DVR>
			<!-- As a single server or as an origin, use dvrstreamingpacketizer in LiveStreamPacketizers above -->
			<!-- Or, in an origin-edge configuration, edges use dvrstreamingrepeater in LiveStreamPacketizers above -->
			<!-- As an origin, also add dvrchunkstreaming to HTTPStreamers below -->
			<!-- To turn on DVR recording set Recorders to dvrrecorder.  This works with dvrstreamingpacketizer  -->
			<Recorders>dvrrecorder</Recorders>
			<!-- As a single server or as an origin, set the Store to dvrfilestorage-->
			<!-- edges should have this empty -->
			<Store>dvrfilestorage</Store>
			<!--  Window Duration is length of live DVR window in seconds.  0 means the window is never trimmed. -->
			<WindowDuration>0</WindowDuration>
			<!-- Storage Directory is top level location where dvr is stored.  e.g. c:/temp/dvr -->
			<StorageDir>${com.wowza.wms.context.VHostConfigHome}/content/SVorigin/</StorageDir>
			<!-- valid ArchiveStrategy values are append, version, delete -->
			<ArchiveStrategy>delete</ArchiveStrategy>
			<!-- If this is a dvrstreamingrepeater, define ChunkOriginURL to point back to origin -->
			<!-- And define Application/Repeater/OriginURL to point back to the origin -->
			<Repeater>
				<ChunkOriginURL></ChunkOriginURL>
			</Repeater>
			<!-- Properties for DVR -->
			<Properties>
				<Property>
    					<Name>startRecordingOnStartup</Name>
    					<Value>false</Value>
    					<Type>boolean</Type>
				</Property>
				<Property>
					<Name>dvrPlaylistRequestDelegate</Name>
					<Value>com.wowza.wms.dvr.impl.DvrStartDurationPlaylistRequestDelegate</Value>
				</Property>
				<Property>
					<Name>dvrPlaylistDurationQueryParameter</Name>
					<Value>wowzadvrplaylistduration</Value>
				</Property>	
				<Property>
					<Name>dvrPlaylistStartQueryParameter</Name>
					<Value>wowzadvrplayliststart</Value>
				</Property>
				<Property>
				        <Name>dvrChunkDurationMinimum</Name>
				        <Value>10000</Value>
				        <Type>Integer</Type>
				</Property>
				
				<Property>
				        <Name>dvrPacketSortTime</Name>
				        <Value>10000</Value>
				        <Type>Integer</Type>
				</Property>
				
			
	
			</Properties>
		</DVR>
		<!-- HTTPStreamers (separate with commas): cupertinostreaming, smoothstreaming, sanjosestreaming, dvrchunkstreaming -->
		<HTTPStreamers>cupertinostreaming, smoothstreaming, sanjosestreaming, dvrchunkstreaming</HTTPStreamers>
		<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></RTSPBindIpAddress>
			<RTSPConnectionIpAddress>0.0.0.0</RTSPConnectionIpAddress>
			<RTSPOriginIpAddress>127.0.0.1</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>multicastInterfaceAddress</Name>
					<Value>172.18.15.20</Value>
				</Property>
				-->
				<Property>
			    		<Name>videoIsAligned</Name>
			        	<Value>false</Value>
			            	<Type>Boolean</Type>
			        </Property>
				
			</Properties>
		</RTP>
		<MediaCaster>
			<RTP>
				<RTSP>
					<!-- udp, interleave -->
					<RTPTransportMode>interleave</RTPTransportMode>
				</RTSP>
			</RTP>
			<!-- 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>
				<!--
				<Property>
					<Name>cupertinoChunkDurationTarget</Name>
					<Value>4000</Value>
					<Type>Integer</Type>
				</Property>
				<Property>
					<Name>cupertinoMaxChunkCount</Name>
					<Value>10</Value>
					<Type>Integer</Type>
				</Property>
				<Property>
					<Name>cupertinoPlaylistChunkCount</Name>
					<Value>3</Value>
					<Type>Integer</Type>
				</Property>
				<Property>
					<Name>cupertinoRepeaterChunkCount</Name>
					<Value>3</Value>
					<Type>Integer</Type>
				</Property>
				-->
			</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>
		<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>SafeviewWowzaModules</Name>
				<Description>Safeview implementation of catchup tv</Description>
				<Class>es.safeviewtv.catchup.CatchUpRecorder</Class>
			</Module>
			
			 
		</Modules>
		<!-- Properties defined here will be added to the IApplication.getProperties() and IApplicationInstance.getProperties() collections -->
		<Properties>
		
		</Properties>
	</Application>
</Root>

Here is one of the transcoding xml we are using

<Root>
	<Transcode>
		<Encodes>
			<!-- Setup for 720p, high bandwith, main profile for desktop or set-top box -->
			<Encode>
				<Enable>true</Enable>
				<Name>720p</Name>
				<StreamName>mp4:${SourceStreamName}_720p</StreamName>
				<Video>
					<!-- H.264, H.263, PassThru, Disable -->
					<Codec>H.264</Codec>
					<!-- default, CUDA, QuickSync -->
					<Transcoder>default</Transcoder>
					<GPUID>-1</GPUID>
					<FrameSize>
						<!-- letterbox, fit-width, fit-height, crop, stretch, match-source -->
						<FitMode>fit-height</FitMode>
						<Width>720</Width>
						<Height>576</Height>
						<!-- <Crop>0,0,0,0</Crop> -->
						<!-- <SourceRectangle>0,0,320,240</SourceRectangle> -->
					</FrameSize>
					<Profile>main</Profile>
					<Bitrate>2400000</Bitrate>
					<KeyFrameInterval>
						<FollowSource>false</FollowSource>
						<Interval>25</Interval>
					</KeyFrameInterval>
					<Overlays>
						<Overlay>
							<Enable>true</Enable>
							<Index>0</Index>
							<ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/logo_720.png</ImagePath>
							<CheckForUpdates>true</CheckForUpdates>
							<Opacity>100</Opacity>
							<Location>
								<X>10</X>
								<Y>10</Y>
								<Width>${ImageWidth}</Width>
								<Height>${ImageHeight}</Height>
								<!-- horiz: left, right, hcenter - vert: top, bottom, vcenter -->
								<Align>left,top</Align>
							</Location>
						</Overlay>
					</Overlays>
					<Parameters>
					</Parameters>
				</Video>
				<Audio>
					<!-- AAC, PassThru, Disable -->
					<Codec>AAC</Codec>
					<Bitrate>96000</Bitrate>
					<Parameters>
					</Parameters>
				</Audio>
				<Properties>
				</Properties>
			</Encode>
			<Encode>
				<Enable>true</Enable>
				<Name>7202p</Name>
				<StreamName>mp4:${SourceStreamName}_7202p</StreamName>
				<Video>
					<!-- H.264, H.263, PassThru, Disable -->
					<Codec>H.264</Codec>
					<!-- default, CUDA, QuickSync -->
					<Transcoder>default</Transcoder>
					<GPUID>-1</GPUID>
					<FrameSize>
						<!-- letterbox, fit-width, fit-height, crop, stretch, match-source -->
						<FitMode>fit-height</FitMode>
						<Width>720</Width>
						<Height>576</Height>
						<!-- <Crop>0,0,0,0</Crop> -->
						<!-- <SourceRectangle>0,0,320,240</SourceRectangle> -->
					</FrameSize>
					<Profile>main</Profile>
					<Bitrate>4096000</Bitrate>
					<KeyFrameInterval>
						<FollowSource>false</FollowSource>
						<Interval>25</Interval>
					</KeyFrameInterval>
					<Overlays>
						<Overlay>
							<Enable>false</Enable>
							<Index>0</Index>
							<ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/logo_7202.png</ImagePath>
							<CheckForUpdates>true</CheckForUpdates>
							<Opacity>100</Opacity>
							<Location>
								<X>10</X>
								<Y>10</Y>
								<Width>${ImageWidth}</Width>
								<Height>${ImageHeight}</Height>
								<!-- horiz: left, right, hcenter - vert: top, bottom, vcenter -->
								<Align>left,top</Align>
							</Location>
						</Overlay>
					</Overlays>
					<Parameters>
					</Parameters>
				</Video>
				<Audio>
					<!-- AAC, PassThru, Disable -->
					<Codec>AAC</Codec>
					<Bitrate>96000</Bitrate>
					<Parameters>
					</Parameters>
				</Audio>
				<Properties>
				</Properties>
			</Encode>
			<!-- Setup for 360p, high bandwith, main profile for desktop -->
			<Encode>
				<Enable>true</Enable>
				<Name>360p</Name>
				<StreamName>mp4:${SourceStreamName}_360p</StreamName>
				<Video>
					<!-- H.264, H.263, PassThru, Disable -->
					<Codec>H.264</Codec>
					<!-- default, CUDA, QuickSync -->
					<Transcoder>default</Transcoder>
					<GPUID>-1</GPUID>
					<FrameSize>
						<!-- letterbox, fit-width, fit-height, crop, stretch, match-source -->
						<FitMode>fit-height</FitMode>
						<Width>720</Width>
						<Height>576</Height>
						<!-- <Crop>0,0,0,0</Crop> -->
						<!-- <SourceRectangle>0,0,320,240</SourceRectangle> -->
					</FrameSize>
					<Profile>main</Profile>
					<Bitrate>850000</Bitrate>
					<KeyFrameInterval>
						<FollowSource>false</FollowSource>
						<Interval>25</Interval>
					</KeyFrameInterval>
					<Overlays>
						<Overlay>
							<Enable>false</Enable>
							<Index>0</Index>
							<ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/logo_360.png</ImagePath>
							<CheckForUpdates>true</CheckForUpdates>
							<Opacity>100</Opacity>
							<Location>
								<X>10</X>
								<Y>10</Y>
								<Width>${ImageWidth}</Width>
								<Height>${ImageHeight}</Height>
								<!-- horiz: left, right, hcenter - vert: top, bottom, vcenter -->
								<Align>left,top</Align>
							</Location>
						</Overlay>
					</Overlays>
					<Parameters>
					</Parameters>
				</Video>
				<Audio>
					<!-- AAC, PassThru, Disable -->
					<Codec>AAC</Codec>
					<Bitrate>96000</Bitrate>
					<Parameters>
					</Parameters>
				</Audio>
				<Properties>
				</Properties>
			</Encode>
			<Encode>
				<Enable>false</Enable>
				<Name>3602p</Name>
				<StreamName>mp4:${SourceStreamName}_3602p</StreamName>
				<Video>
					<!-- H.264, H.263, PassThru, Disable -->
					<Codec>H.264</Codec>
					<!-- default, CUDA, QuickSync -->
					<Transcoder>default</Transcoder>
					<GPUID>-1</GPUID>
					<FrameSize>
						<!-- letterbox, fit-width, fit-height, crop, stretch, match-source -->
						<FitMode>fit-height</FitMode>
						<Width>640</Width>
						<Height>360</Height>
						<!-- <Crop>0,0,0,0</Crop> -->
						<!-- <SourceRectangle>0,0,320,240</SourceRectangle> -->
					</FrameSize>
					<Profile>baseline</Profile>
					<Bitrate>350000</Bitrate>
					<KeyFrameInterval>
						<FollowSource>false</FollowSource>
						<Interval>60</Interval>
					</KeyFrameInterval>
					<Overlays>
						<Overlay>
							<Enable>true</Enable>
							<Index>0</Index>
							<ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/logo_3602.png</ImagePath>
							<CheckForUpdates>true</CheckForUpdates>
							<Opacity>100</Opacity>
							<Location>
								<X>10</X>
								<Y>10</Y>
								<Width>${ImageWidth}</Width>
								<Height>${ImageHeight}</Height>
								<!-- horiz: left, right, hcenter - vert: top, bottom, vcenter -->
								<Align>left,top</Align>
							</Location>
						</Overlay>
					</Overlays>
					<Parameters>
					</Parameters>
				</Video>
				<Audio>
					<!-- AAC, PassThru, Disable -->
					<Codec>Passthru</Codec>
					<Bitrate>96000</Bitrate>
					<Parameters>
					</Parameters>
				</Audio>
				<Properties>
				</Properties>
			</Encode>
			<!-- Setup for 240p, medium bandwidth, baseline profile -->
			<Encode>
				<Enable>false</Enable>
				<Name>240p</Name>
				<StreamName>mp4:${SourceStreamName}_240p</StreamName>
				<Video>
					<!-- H.264, H.263, PassThru, Disable -->
					<Codec>H.264</Codec>
					<!-- default, CUDA, QuickSync -->
					<Transcoder>default</Transcoder>
					<GPUID>-1</GPUID>
					<FrameSize>
						<!-- letterbox, fit-width, fit-height, crop, stretch, match-source  -->
						<FitMode>fit-height</FitMode>
						<Width>360</Width>
						<Height>240</Height>
						<!-- <Crop>0,0,0,0</Crop> -->
						<!-- <SourceRectangle>0,0,320,240</SourceRectangle> -->
					</FrameSize>
					<Profile>baseline</Profile>
					<Bitrate>350000</Bitrate>
					<KeyFrameInterval>
						<FollowSource>false</FollowSource>
						<Interval>60</Interval>
					</KeyFrameInterval>
					<Overlays>
						<Overlay>
							<Enable>true</Enable>
							<Index>0</Index>
							<ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/logo_240.png</ImagePath>
							<CheckForUpdates>false</CheckForUpdates>
							<Opacity>100</Opacity>
							<Location>
								<X>10</X>
								<Y>10</Y>
								<Width>${ImageWidth}</Width>
								<Height>${ImageHeight}</Height>
								<!-- horiz: left, right, hcenter - vert: top, bottom, vcenter -->
								<Align>left,top</Align>
							</Location>
						</Overlay>
					</Overlays>
					<Parameters>
					</Parameters>
				</Video>
				<Audio>
					<!-- AAC, PassThru, Disable -->
					<Codec>Passthru</Codec>
					<Bitrate>96000</Bitrate>
					<Parameters>
					</Parameters>
				</Audio>
				<Properties>
				</Properties>
			</Encode>
			<!-- Setup for 160p, low bandwith, baseline profile for 3G mobile devices such as iOS, Android, Blackberry. -->
			<Encode>
				<Enable>false</Enable>
				<Name>160p</Name>
				<StreamName>mp4:${SourceStreamName}_160p</StreamName>
				<Video>
					<!-- H.264, H.263, PassThru, Disable -->
					<Codec>H.264</Codec>
					<!-- default, CUDA, QuickSync -->
					<Transcoder>default</Transcoder>
					<GPUID>-1</GPUID>
					<FrameSize>
						<!-- letterbox, fit-width, fit-height, crop, stretch, match-source  -->
						<FitMode>fit-height</FitMode>
						<Width>284</Width>
						<Height>160</Height>
						<!-- <Crop>0,0,0,0</Crop> -->
						<!-- <SourceRectangle>0,0,320,240</SourceRectangle> -->
					</FrameSize>
					<Profile>baseline</Profile>
					<Bitrate>200000</Bitrate>
					<KeyFrameInterval>
						<FollowSource>false</FollowSource>
						<Interval>60</Interval>
					</KeyFrameInterval>
					<Overlays>
						<Overlay>
							<Enable>false</Enable>
							<Index>0</Index>
							<ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath>
							<CheckForUpdates>false</CheckForUpdates>
							<Opacity>100</Opacity>
							<Location>
								<X>5</X>
								<Y>5</Y>
								<Width>${ImageWidth}</Width>
								<Height>${ImageHeight}</Height>
								<!-- horiz: left, right, hcenter - vert: top, bottom, vcenter -->
								<Align>left,top</Align>
							</Location>
						</Overlay>
					</Overlays>
					<Parameters>
					</Parameters>
				</Video>
				<Audio>
					<!-- AAC, PassThru, Disable -->
					<Codec>AAC</Codec>
					<Bitrate>96000</Bitrate>
					<Parameters>
					</Parameters>
				</Audio>
				<Properties>
				</Properties>
			</Encode>
			<!-- Setup for H.263, low bandwith, streaming to older mobile devices -->
			<Encode>
				<Enable>false</Enable>
				<Name>h263</Name>
				<StreamName>mp4:${SourceStreamName}_h263</StreamName>
				<Video>
					<!-- H.264, H.263, PassThru, Disable -->
					<Codec>H.263</Codec>
					<!-- default, CUDA, QuickSync -->
					<Transcoder>default</Transcoder>
					<GPUID>-1</GPUID>
					<FrameSize>
						<!-- letterbox, fit-width, fit-height, crop, stretch, match-source  -->
						<FitMode>letterbox</FitMode>
						<Width>176</Width>
						<Height>144</Height>
						<!-- <Crop>0,0,0,0</Crop> -->
						<!-- <SourceRectangle>0,0,320,240</SourceRectangle> -->
					</FrameSize>
					<Profile>baseline</Profile>
					<Bitrate>150000</Bitrate>
					<KeyFrameInterval>
						<FollowSource>false</FollowSource>
						<Interval>60</Interval>
					</KeyFrameInterval>
					<Overlays>
						<Overlay>
							<Enable>false</Enable>
							<Index>0</Index>
							<ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath>
							<CheckForUpdates>false</CheckForUpdates>
							<Opacity>100</Opacity>
							<Location>
								<X>5</X>
								<Y>5</Y>
								<Width>${ImageWidth}</Width>
								<Height>${ImageHeight}</Height>
								<!-- horiz: left, right, hcenter - vert: top, bottom, vcenter -->
								<Align>left,top</Align>
							</Location>
						</Overlay>
					</Overlays>
					<Parameters>
					</Parameters>
				</Video>
				<Audio>
					<!-- AAC, PassThru, Disable -->
					<Codec>AAC</Codec>
					<Bitrate>64000</Bitrate>
					<Parameters>
					</Parameters>
				</Audio>
				<Properties>
				</Properties>
			</Encode>
		</Encodes>
		<Decode>
			<Video>
				<Deinterlace>false</Deinterlace>
				<Overlays>
					<Overlay>
						<Enable>false</Enable>
						<Index>0</Index>
						<ImagePath>${com.wowza.wms.context.VHostConfigHome}/content/wowzalogo.png</ImagePath>
						<CheckForUpdates>false</CheckForUpdates>
						<Opacity>100</Opacity>
						<Location>
							<X>5</X>
							<Y>5</Y>
							<Width>${ImageWidth}</Width>
							<Height>${ImageHeight}</Height>
							<!-- horiz: left, right, hcenter - vert: top, bottom, vcenter -->
							<Align>left,top</Align>
						</Location>
					</Overlay>
				</Overlays>
				<Parameters>
				</Parameters>
			</Video>
			<Properties>
			</Properties>
		</Decode>
		<StreamNameGroups>
			<!-- Note: Play stream using stream name ngrp:[stream-name]. -->
			<StreamNameGroup>
				<Name>${SourceStreamName}_all</Name>
				<Members>
					<Member>
						<EncodeName>720p</EncodeName>
					</Member>
					
					<Member>
						<EncodeName>7202p</EncodeName>
					</Member>
					<Member>
						<EncodeName>360p</EncodeName>
					</Member>
					
					<!--
					<Member>
						<EncodeName>3602p</EncodeName>
					</Member>
					
					<Member>
						<EncodeName>240p</EncodeName>
					</Member>
					
					<Member>
						<EncodeName>160p</EncodeName>
					</Member>
					-->
				</Members>
			</StreamNameGroup>
			<!--
			<StreamNameGroup>
				<Name>${SourceStreamName}_mobile</Name>
				<Members>
					<Member>
						<EncodeName>240p</EncodeName>
					</Member>
					<Member>
						<EncodeName>160p</EncodeName>
					</Member>
				</Members>
			</StreamNameGroup>
			-->
		</StreamNameGroups>
		<Properties>
		</Properties>
	</Transcode>
</Root>

And here is the Application xml of the edge servers

<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>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, dvrstreamingpacketizer, dvrstreamingrepeater -->
			<!--<LiveStreamPacketizers>cupertinostreamingrepeater, smoothstreamingrepeater, sanjosestreamingrepeater, dvrstreamingrepeater</LiveStreamPacketizers>-->
			<LiveStreamPacketizers>cupertinostreamingpacketizer, smoothstreamingpacketizer, sanjosestreamingpacketizer, dvrstreamingpacketizer</LiveStreamPacketizers>
			<!-- Properties defined here will override any properties defined in conf/Streams.xml for any streams types loaded by this application -->
			<Properties>
				<!--
				<Property>
					<Name>sortPackets</Name>
				    	<Value>true</Value>
				        <Type>Boolean</Type>
				 </Property>
				 <Property>
				        <Name>sortBufferSize</Name>
				        <Value>750</Value>
				        <Type>Integer</Type>
				 </Property>
				-->
			</Properties>
		</Streams>
		<Transcoder>
			<!-- To turn on transcoder set to: transcoder -->
			<LiveStreamTranscoder></LiveStreamTranscoder>
			<!-- [templatename].xml or ${SourceStreamName}.xml -->
			<!--<Templates>${SourceStreamName}.xml,transcode.xml</Templates>-->
			<Templates>${SourceStreamName}.xml</Templates>
			<ProfileDir>${com.wowza.wms.context.VHostConfigHome}/transcoder/profiles</ProfileDir>
			<TemplateDir>${com.wowza.wms.context.VHostConfigHome}/transcoder/templates</TemplateDir>
			<Properties>
			</Properties>
		</Transcoder>
		<DVR>
			<!-- As a single server or as an origin, use dvrstreamingpacketizer in LiveStreamPacketizers above -->
			<!-- Or, in an origin-edge configuration, edges use dvrstreamingrepeater in LiveStreamPacketizers above -->
			<!-- As an origin, also add dvrchunkstreaming to HTTPStreamers below -->
			<!-- To turn on DVR recording set Recorders to dvrrecorder.  This works with dvrstreamingpacketizer  -->
			<!--<Recorders>dvrrecorder</Recorders>-->
			<Recorders></Recorders>
			<!-- As a single server or as an origin, set the Store to dvrfilestorage-->
			<!-- edges should have this empty -->
			<Store>dvrfilestorage</Store>
			<!--  Window Duration is length of live DVR window in seconds.  0 means the window is never trimmed. -->
			<WindowDuration>0</WindowDuration>
			<!-- Storage Directory is top level location where dvr is stored.  e.g. c:/temp/dvr -->
			<StorageDir>${com.wowza.wms.context.VHostConfigHome}/content/SVcatchup/</StorageDir>
			<!-- valid ArchiveStrategy values are append, version, delete -->
			<ArchiveStrategy>delete</ArchiveStrategy>
			<!-- If this is a dvrstreamingrepeater, define ChunkOriginURL to point back to origin -->
			<!-- And define Application/Repeater/OriginURL to point back to the origin -->
			<Repeater>
				<!--<ChunkOriginURL>wowz://172.18.15.135:1935/SVorigin</ChunkOriginURL>-->
				<ChunkOriginURL></ChunkOriginURL>-->
			</Repeater>
			<!-- Properties for DVR -->
			<Properties>
				<Property>
    					<Name>startRecordingOnStartup</Name>
    					<Value>false</Value>
    					<Type>boolean</Type>
				</Property>
			</Properties>
		</DVR>
		<!-- HTTPStreamers (separate with commas): cupertinostreaming, smoothstreaming, sanjosestreaming, dvrchunkstreaming -->
		<HTTPStreamers>cupertinostreaming, smoothstreaming, sanjosestreaming</HTTPStreamers>
		<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></RTSPBindIpAddress>
			<RTSPConnectionIpAddress>0.0.0.0</RTSPConnectionIpAddress>
			<RTSPOriginIpAddress>127.0.0.1</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>multicastInterfaceAddress</Name>
					<Value>172.18.15.20</Value>
				</Property>
				-->
			</Properties>
		</RTP>
		<MediaCaster>
			<RTP>
				<RTSP>
					<!-- udp, interleave -->
					<RTPTransportMode>interleave</RTPTransportMode>
				</RTSP>
			</RTP>
			<!-- 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>
<!--
			<Property>
				<Name>cupertinoChunkDurationTarget</Name>
				<Value>4000</Value>
				<Type>Integer</Type>
			</Property>-->
			</Properties>
		</HTTPStreamer>
		<Repeater>
			<!--<OriginURL>wowz://172.18.15.135:1935/SVorigin</OriginURL>-->
			<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>SafeviewWowzaModules</Name>
				<Description>Safeview implementation of catchup tv</Description>
				<Class>es.safeviewtv.catchup.CatchUpRecorder</Class>
			</Module>
		-->	
			 
		</Modules>
		<!-- Properties defined here will be added to the IApplication.getProperties() and IApplicationInstance.getProperties() collections -->
		<Properties>
		
		</Properties>
	</Application>
</Root>

I appreciate your help, thanks

Best regards,

Ferdinand

I forgot to mention, as you can see in the configuration xmls, we have also tried putting sort buffer almost everywhere (even in the Vhost.xml buffer for incoming udp was changed to 2Mb) hoping it might improve the streams but to no avail.

As per your description, it looks like an encoding/k frame matching issue in the workflow. If you are using HLS, you are wasting bits inserting one Key frame per second … the more K frames, the less compression on the video, so, less quality in general.

I’d suggest to test following

a) check the k-frames setting on your original encoder. Try to match them all the way in the workflow. Increase the K frame insertion based on your desired output. Again, 1 per second is a waste of bits if you’ll be doing HLS. You are not letting compression to take advantage.

b) you are setting HLS for live to have chunks of 4 seconds, so, one K frame every 4 seconds is enough. Each HLS chunk needs to start with a K frame, so if you are going to keep chunks of 4 seconds, make sure your encoder also sends on K frame every 4 seconds

c) your DVR minimum is set to 10 secs … make it match to a factor of your encoder K frames as well.

By the way, poorer quality when sudden change of lights or bad movement, it’s a “feature” of encoding. Those changes require more information per pixel, so to get that, the overall quality loses

Understood.

Try with basic. Set the key frames to be every 5 secs on the transcoder, and set HLS segments to be 5 or 10 secs each. DVR minimum to be 5 secs as well.

Check if that gives you a better quality overall.

do you mind sharing what fixed the issue?

Hi Tavius,

Thanks for the reply. The problem is that we are receiving these streams directly from DVB-T, the only thing our receiver does is encapsulate the signal to multicast SPTS. That been said, we have no control on the encoding of the video. Most of the streams doesn’t even have any constant key frame interval so it’s really hard to calculate what chunk size should be configured.

Would you recommend setting the transcoder to follow source and just set the minimum DVR chunk to 10 seconds? From what I understood the DVR will still be split from the key-frame so I guess 10 seconds will only be the minimum but actual chunks could be any duration from that figure. I am not sure what would be the effects of having segments with different durations.

I don’t know really, I am lost…

As per your description, it looks like an encoding/k frame matching issue in the workflow. If you are using HLS, you are wasting bits inserting one Key frame per second … the more K frames, the less compression on the video, so, less quality in general.

I’d suggest to test following

a) check the k-frames setting on your original encoder. Try to match them all the way in the workflow. Increase the K frame insertion based on your desired output. Again, 1 per second is a waste of bits if you’ll be doing HLS. You are not letting compression to take advantage.

b) you are setting HLS for live to have chunks of 4 seconds, so, one K frame every 4 seconds is enough. Each HLS chunk needs to start with a K frame, so if you are going to keep chunks of 4 seconds, make sure your encoder also sends on K frame every 4 seconds

c) your DVR minimum is set to 10 secs … make it match to a factor of your encoder K frames as well.

By the way, poorer quality when sudden change of lights or bad movement, it’s a “feature” of encoding. Those changes require more information per pixel, so to get that, the overall quality loses

Hi guys,

I analyzed the segment of the HLS streams (using elecard streameye) which have pixelation/artifact problems and it turns out that the problematic frame in question is actually in the middle of the stream and not at the beginning or end. The segments begins with IFrame/KeyFrame correctly. I can send you guys the segment if ever you would require it.

What might be the cause of this? Could this have anything to do with CPU utilization. The source UDP shows no sign of having this problem. So I am guessing it has to be somewhere from receiving upto the transcoding of the wowza server.

I installed the new patch 3.6.2.10 build 6427 and one of the changelog is the improvement of decoder handling to properly deal with errors. I am not sure of this could be the problem I am experiencing but I will give it a shot. I will let you guys know. Thanks

Hi Tavius,

Thanks for the reply. The problem is that we are receiving these streams directly from DVB-T, the only thing our receiver does is encapsulate the signal to multicast SPTS. That been said, we have no control on the encoding of the video. Most of the streams doesn’t even have any constant key frame interval so it’s really hard to calculate what chunk size should be configured.

Would you recommend setting the transcoder to follow source and just set the minimum DVR chunk to 10 seconds? From what I understood the DVR will still be split from the key-frame so I guess 10 seconds will only be the minimum but actual chunks could be any duration from that figure. I am not sure what would be the effects of having segments with different durations.

I don’t know really, I am lost…

Hi Tavius,

Thanks for the advice. The streams are working fine now although some artifacts still occasionally appears but I think this could already be a problem of the source.