Troubleshoot HLS playback from Wowza Streaming Engine

This guide provides troubleshooting techniques for Apple HTTP Live Streaming (HLS) from Wowza Streaming Engine™ media server software to iOS devices and devices using Android 4.0 or later.

Overview of HLS playback


This section briefly describes device capabilities and supported streaming protocols.

macOS and iOS

macOS, iPhone, and iPad devices have built-in support for HLS. When using Safari on these devices, you can enter an HLS playback URL and stream content without additional configuration.

Apple TV

HLS playback is supported. You can ingest AC-3 passthrough to stream to Apple TVs by creating an app using the Apple TV SDK. The device that your Apple TV is connected to should also be able to play AC-3.

Android

Use Android OS 4.0 or later for HLS native support on Android devices, though playback may not be completely smooth. Alternatively, you can play HLS streams using third-party players such as VideoLAN VLC for Android.

Roku

HLS playback is supported. If you're using AC-3 passthrough to stream to Roku, ensure that your Roku audio settings are set to Auto mode, not Stereo. The device that your Roku is connected to should be able to play AC-3. If there is a (DD) or (DD+) next to the Auto setting, the HDMI device the Roku is connected to can decode this format.

Other devices

Most other mobile devices such as Nokia, Samsung, Sony Ericsson, Blackberry, and Windows Phone, as well as desktop operating systems such as Windows and Linux, support HLS playback through players such as VideoLAN VLC.

You can use the Wowza Test Players webpage to test your streaming applications.

Edit advanced properties


You can edit properties in Wowza Streaming Engine Manager to enable additional HLS functionality.

  1. Click Applications in the menu bar and then select your live application in the contents panel.
  2. Click the Properties tab, and in the Quick Links bar, click HTTP Streamers Cupertino Settings to control HLS playlist compatibility and features, or click Cupertino Streaming Packetizer to control how the HLS (cupertino) packetizer segments incoming live streams.
Note: Access to the Properties tab is limited to administrators with advanced permissions. For more information, see Manage credentials.
  1. In the HTTP Streamers Cupertino Settings or Cupertino Streaming Packetizer section, click Edit.
  2. Enable the property you wish to edit and enter a Value.
     
  3. Click Save, and then restart the application to apply the changes. 

Alternatively, you can edit HLS packetizer and HTTP streamer properties in XML:

  1. Use a text editor to open the [install-dir]/conf/[application-name]/Application.xml file for your live or vod application
  2. Add the property you wish to change to the HTTPStreamer/Properties or to the LiveStreamPacketizer/Properties container. Be sure to add the property to the correct <Properties> container in Application.xml, as there are several in the file.
     
  3. Restart the application to apply the changes.

Optimize encoding


For mobile streaming, it's best to encode streams using a low bitrate, frame rate, and low encoding complexity. A total bitrate of between 64Kbps and 250Kbps is best. Many mobile devices may not be able to handle a full 30 frames per second (fps). A frame rate between 15fps and 24fps may be best for mobile. It's best to encode to a lower H.264 complexity. Most mobile devices only support H.264 Baseline profile.

Test UDP ports


You don't need to open any outgoing UDP ports for HLS streaming. On the incoming side, Wowza Streaming Engine tries to use ports 6970 to 9999. Setting up UDP networking correctly is sometimes difficult and depends on your router and firewall configuration. If behind NAT (network address translation), it's important that all UDP ports are mapped to the server running Wowza Streaming Engine.

Wowza provides a RTSP/RTP test stream running on Amazon EC2, which seems to work on most mobile networks/devices. Amazon EC2 is a great place to experiment with RTSP/RTP streaming. For more information, see About deploying Wowza Streaming Engine on Amazon.

Configure the TCP port


Open the TCP streaming port that you have designated for Wowza Streaming Engine. The default port is 1935. To enable Wowza Streaming Engine to use a different TCP port for HLS streaming do the following:

  1. In Wowza Streaming Engine Manager, click the Server tab, and then click Virtual Host Setup in the contents panel.
     
  2. In the Virtual Host Setup page, click Edit in the Basic tab.
     
  3. Scroll down to the Host Ports section of the page and click Edit (pencil icon) for the Default Streaming item.
     
  4. Add your desired port number to the comma-separated Port(s) list (for example, 1935,80), and then click Apply.
     
  5. Click Save, and then restart the application to apply the changes.

For more information, see Configuring streaming ports.

Alternatively, configure Wowza Streaming Engine to use a different TCP port for HLS streaming in XM::

  1. Use a text editor to open the [install-dir]/conf/VHost.xml file and add your desired port number to the HostPort/Ports list:
    <Port>1935,80</Port>
  2. Restart Wowza Streaming Engine to apply the changes.
Note: Make sure that another service isn't running on the same computer that uses your configured streaming ports, and check that the port forwarding rules on your router don't affect your streaming ports.

Add HLS debug logging


You can log extra debug information to verify that the HLS implementation in Wowza Streaming Engine is running correctly. HLS debug messages are logged in the [install-dir]/logs/wowzastreamingengine_access.log file.

To configure Wowza Streaming Engine to add HLS debug information to the log file, do the following:

  1. In Wowza Streaming Engine Manager, click the Server tab, and then click Virtual Host Setup.
  2. In the Virtual Host Setup page, click the Properties tab and then click Custom in the Quick Links bar.
Note: Access to the Properties tab is limited to administrators with advanced permissions. For more information, see Manage credentials.
  1. In the Custom section, click Edit.
  2. Click Add Custom Property, specify the following settings in the Add Custom Property dialog box, and then click Add:
     
    • Path - Select /Root/VHost.
       
    • Name - Enter cupertinoAdapterDebugLog.
       
    • Type - Select Boolean.
       
    • Value - Enter true.
  3. Click Save, and then restart the application when prompted to apply the changes.

Alternatively, configure Wowza Streaming Engine to add extra HLS debug information to the log file using XML:

  1. Use a text editor to open the [install-dir]/conf/VHost.xml file and add the following property to the VHost/Properties container. Be sure to add the property to the correct <Properties> container in VHost.xml, as there are several in the file.
     
    <Property>
        <Name>cupertinoAdapterDebugLog</Name>
        <Value>true</Value>
        <Type>Boolean</Type>
    </Property>
  2. Restart Wowza Streaming Engine to apply the changes.

Setting cupertinoAdapterDebugLog to true yields log messages similar to the following:

comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onPlaylist: vod/mp4:sample.mp4/playlist.m3u8
comment	server	INFO	200	-	MediaCasterStreamValidator.init[vod/_definst_]: Started
app-start	application	INFO	200	_definst_	vod/_definst_
connect	cupertino	INFO	200	1529581895	-
create	stream	INFO	200	sample.mp4	-
comment	server	INFO	200	-	MediaReaderH264Cupertino.indexFile[vod/_definst_/sample.mp4][mp4a.40.2]: AAC Audio info: {MediaCodecInfoAudio: codec:AAC, channels:2, frequency:48000, samplesPerFrame:1024, objectType:LC}
comment	server	INFO	200	-	MediaReaderH264Cupertino.indexFile[vod/_definst_/sample.mp4][avc1.66.30]: H.264 Video info: {MediaCodecInfoVideo: codec:H264, profile:Baseline, level:3.0, frameSize:424x240, displaySize:424x240, frameRate:24.000000}
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onPlaylist: vod/mp4:sample.mp4/chunklist_w1529581895.m3u8
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: vod/mp4:sample.mp4/media_w1529581895_0.ts
play	stream	INFO	200	sample.mp4	-
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: contentLength:905032
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: vod/mp4:sample.mp4/media_w1529581895_1.ts
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: contentLength:708384
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: vod/mp4:sample.mp4/media_w1529581895_2.ts
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: contentLength:1157892
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: vod/mp4:sample.mp4/media_w1529581895_3.ts
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: contentLength:664392
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: vod/mp4:sample.mp4/media_w1529581895_4.ts
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: contentLength:673792
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: vod/mp4:sample.mp4/media_w1529581895_5.ts
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: contentLength:532792
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: vod/mp4:sample.mp4/media_w1529581895_6.ts
comment	server	INFO	200	-	HTTPStreamerAdapterCupertinoStreamer.onMediaFile: contentLength:820056
stop	stream	INFO	200	sample.mp4	-
destroy	stream	INFO	200	sample.mp4	-
disconnect	cupertino	INFO	200	1529581895	-
app-stop	application	INFO	200	_definst_	vod/_definst_
 

Tip: To enable the extra HTTP Adapter logging for all protocols, repeat the steps above but use httpAdapterDebugLog as the custom property.

Add chunk logging


Enable additional chunk logging using the maxChunkLogCount property.

To configure Wowza Streaming Engine to use the maxChunkLogCount, do the following:

  1. In Wowza Streaming Engine Manager, click the Applications tab, and then select your application on the content menu.
  2. In the application setup page, click the Properties tab and then click Custom in the Quick Links bar.
Note: Access to the Properties tab is limited to administrators with advanced permissions. For more information, see Manage credentials.
  1. In the Custom section, click Edit.
  2. Click Add Custom Property, specify the following settings in the Add Custom Property dialog box, and then click Add:
     
    • Path - Select /Root/Application/LiveStreamPacketizer.
       
    • Name - Enter maxChunkLogCount.
       
    • Type - Select Integer.
       
    • Value - Enter 0.
  3. Click Save, and then restart the application to apply the changes. 

Alternatively, configure Wowza Streaming Engine to use the maxChunkLogCount using XML: 

  1. Use a text editor to open the [install-dir]/conf/[application-name]/Application.xml file and add the following property to the Root/Application/LiveStreamPacketizer/Properties container. Be sure to add the property to the correct <Properties> container in Application.xml, as there are several in the file.
     
    <Property>
        <Name>maxChunkLogCount</Name>
        <Value>0</Value>
        <Type>Integer</Type>
    </Property>

A value of 0 logs all TS chunks created. A value greater than 0 (n) logs the first n chunks created.

  1. Restart Wowza Streaming Engine to apply the changes.

Note: For help debugging time drift issues or audio/video out-of-sync issues, see Debug AAC or MP3 timecode issues with HLS packetization in Wowza Streaming Engine.

Review logs


Review log messages to monitor the HLS implementation in Wowza Streaming Engine. Server log messages are written to the [install-dir]/logs/wowzastreamingengine_access.log file and error log messages are written to [install-dir]/logs/wowzastreamingengine_error.log file by default.

It's a good idea to review log files frequently and regularly to identify potential issues before they escalate.

The following are typical log messages for an HLS playback session using a Wirecast encoder for the source stream:

app-start	application	INFO	200	_definst_	live/_definst_	-	-	-	76247.994	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
connect-pending	session	INFO	100	127.0.0.1	-	_defaultVHost_	live	_definst_	0.047	[any]	1935	rtmp://localhost:1935/live	127.0.0.1	rtmp	-	Wirecast/FM 1.0 (compatible; MSS/1.0)	1026716875	3270	3073	-	-	-	-	-	-	-	-	-	-	-	-	-	rtmp://localhost:1935/live	-
connect	session	INFO	200	127.0.0.1	-	_defaultVHost_	live	_definst_	0.047	[any]	1935	rtmp://localhost:1935/live	127.0.0.1	rtmp	-	Wirecast/FM 1.0 (compatible; MSS/1.0)	1026716875	3270	3073	-	-	-	-	-	-	-	-	-	-	-	-	-	rtmp://localhost:1935/live	-
create	stream	INFO	200	-	-	_defaultVHost_	live	_definst_	0	[any]	1935	rtmp://localhost:1935/live	127.0.0.1	rtmp	-	Wirecast/FM 1.0 (compatible; MSS/1.0)	1026716875	3401	3565	1	0	0	0	-	-	-	-	-	-	rtmp://localhost:1935/live	rtmp://localhost:1935/live	-	rtmp://localhost:1935/live	-
publish	stream	INFO	200	myStream	-	_defaultVHost_	live	_definst_	0.014	[any]	1935	rtmp://localhost:1935/live	127.0.0.1	rtmp	-	Wirecast/FM 1.0 (compatible; MSS/1.0)	1026716875	3451	3606	1	0	0	0	myStream	-	-	-	-	-	rtmp://localhost:1935/live/myStream	rtmp://localhost:1935/live/myStream	-	rtmp://localhost:1935/live	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.init[live/_definst_/myStream]: chunkDurationTarget: 10000	-	-	-	76249.408	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.init[live/_definst_/myStream]: audioGroupCount: 3	-	-	-	76249.409	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.init[live/_definst_/myStream]: playlistChunkCount:3	-	-	-	76249.409	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	MediaStreamMap.getLiveStreamPacketizer[live/_definst_/myStream]: Create live stream packetizer: cupertinostreamingpacketizer:myStream	-	-	-	76249.409	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	CupertinoPacketHandler.startStream[live/_definst_/myStream]	-	-	-	76249.41	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.handlePacket[live/_definst_/myStream]: Video codec:H264 isCompatible:true	-	-	-	76249.412	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.handlePacket[live/_definst_/myStream][avc1.77.31]: H.264 Video info: {H264CodecConfigInfo: codec:H264, profile:Main, level:3.1, frameSize:1280x720, displaySize:1280x720, frameRate:3000.0, PAR:1:1}	-	-	-	76249.412	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.handlePacket[live/_definst_/myStream]: Audio codec:AAC isCompatible:true	-	-	-	76251.093	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.handlePacket[live/_definst_/myStream][mp4a.40.2]: AAC Audio info: {AACFrame: codec:AAC, channels:2, frequency:44100, samplesPerFrame:1024, objectType:LC}	-	-	-	76251.094	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.endChunkTS[live/_definst_/myStream]: Add chunk: id:1 mode:TS[H264,AAC] a/v/k:220/265/2 duration:16200	-	-	-	76265.913	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.endChunkTS[live/_definst_/myStream]: Add chunk: id:2 mode:TS[H264,AAC] a/v/k:115/170/1 duration:8000	-	-	-	76273.77	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
connect	cupertino	INFO	200	269353695	-	_defaultVHost_	live	_definst_	30.378	localhost	1935	http://localhost:1935/live/myStream/playlist.m3u8	127.0.0.1	http (cupertino)	http://localhost/jwenterprise/index.asp	Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36	269353695	0	0	-	0	-	-	myStream	-	-	-	-	-	http://localhost:1935/live/myStream/playlist.m3u8	http://localhost:1935/live/myStream/playlist.m3u8	-	http://localhost:1935/live/myStream/playlist.m3u8	-
create	stream	INFO	200	myStream	-	_defaultVHost_	live	_definst_	0.001	localhost	1935	http://localhost:1935/live/myStream/playlist.m3u8	127.0.0.1	http (cupertino)	http://localhost/jwenterprise/index.asp	Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36	269353695	0	0	1	0	0	0	myStream	-	-	-	-	-	http://localhost:1935/live/myStream/playlist.m3u8	http://localhost:1935/live/myStream/playlist.m3u8	-	http://localhost:1935/live/myStream/playlist.m3u8	-
play	stream	INFO	200	myStream	-	_defaultVHost_	live	_definst_	0.178	localhost	1935	http://localhost:1935/live/myStream/playlist.m3u8	127.0.0.1	http (cupertino)	http://localhost/jwenterprise/index.asp	Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36	269353695	0	718	1	16200	0	0	myStream	-	-	-	-	-	http://localhost:1935/live/myStream/playlist.m3u8	http://localhost:1935/live/myStream/playlist.m3u8	-	http://localhost:1935/live/myStream/playlist.m3u8	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.endChunkTS[live/_definst_/myStream]: Add chunk: id:3 mode:TS[H264,AAC] a/v/k:114/132/1 duration:8000	-	-	-	76282.355	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
comment	server	INFO	200	-	LiveStreamPacketizerCupertino.endChunkTS[live/_definst_/myStream]: Add chunk: id:4 mode:TS[H264,AAC] a/v/k:115/131/1 duration:8000	-	-	-	76290.165	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-	-
unpublish	stream	INFO	200	myStream	-	_defaultVHost_	live	_definst_	47.15	[any]	1935	rtmp://localhost:1935/live	127.0.0.1	rtmp	-	Wirecast/FM 1.0 (compatible; MSS/1.0)	1026716875	7629644	3956	1	0	7620391	0	myStream	-	-	-	-	-	rtmp://localhost:1935/live/myStream	rtmp://localhost:1935/live/myStream	-	rtmp://localhost:1935/live	-
destroy	stream	INFO	200	myStream	-	_defaultVHost_	live	_definst_	48.161	[any]	1935	rtmp://localhost:1935/live	127.0.0.1	rtmp	-	Wirecast/FM 1.0 (compatible; MSS/1.0)	1026716875	7629644	4104	1	0	7620391	0	myStream	-	-	-	-	-	rtmp://localhost:1935/live/myStream	rtmp://localhost:1935/live/myStream	-	rtmp://localhost:1935/live	-
disconnect	session	INFO	200	1026716875	-	_defaultVHost_	live	_definst_	48.224	[any]	1935	rtmp://localhost:1935/live	127.0.0.1	rtmp	-	Wirecast/FM 1.0 (compatible; MSS/1.0)	1026716875	7629644	4104	-	-	-	-	-	-	-	-	-	-	-	-	-	rtmp://localhost:1935/live	-

Improve HLS playback on Android devices


Android OS 4.0 or later supports HLS, but playback may not be smooth. Use the cupertinoOnChunkStartResetCounter custom property to try to improve playback on Android.

To reset the chunk counter in Wowza Streaming Engine Manager:

  1. Click the Applications tab and then click the name of your application.
  2. On the application page Properties tab, click Custom in the Quick Links bar.
Note: Access to the Properties tab is limited to administrators with advanced permissions. For more information, see Manage credentials.
  1. In the Custom section, click Edit.
  2. Click Add Custom Property, specify the following settings in the Add Custom Property dialog box, and then click Add:
     
    For a Live application
    For a VOD application
    • Path - Select /Root/Application/LiveStreamPacketizer.
       
    • Name - Enter cupertinoOnChunkStartResetCounter.
       
    • Type - Select Boolean.
       
    • Value - Enter false.
    • Path - Select /Root/Application/HTTPStreamer.
       
    • Name - Enter cupertinoOnChunkStartResetCounter.
       
    • Type - Select Boolean.
       
    • Value - Enter false.
  3. Click Save, and then restart the application to apply the changes. 

Alternatively, reset the chunk counter in XML:

  1. Use a text editor to open the [install-dir]/conf/Application.xml file and add the following property. For live applications, add the property to the <LiveStreamPacketizer>/<Properties> container. For VOD applications, add the property to the <HTTPStreamer>/<Properties> container. Be sure to add the property to the correct <Properties> container in Application.xml, as there are several in the file.
     
    <Property>
        <Name>cupertinoOnChunkStartResetCounter</Name>
        <Value>false</Value>
        <Type>Boolean</Type>
    </Property>
  2. Restart Wowza Streaming Engine to apply the changes.

Follow the client/server communications flow


A typical HLS streaming session uses the following exchanges.

The client initiates streaming by sending an HTTP GET request to the server.

The server creates a playlist in an Extended M3U file encoded in UTF-8 (.m3u8). This playlist (index) is a manifest file that includes a set of URLs to media files (.ts segments) with their bitrates and sequence numbers.

GET /vod/mp4:sample.mp4/playlist.m3u8 HTTP/1.1
Host: localhost:1935
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
Accept: */*
Referer: http://localhost/jwenterprise/index.asp
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: ASPSESSIONIDCQBSBCRR=IAKNOGHCJMDALEDFLDFFNDJH; ASPSESSIONIDASASBDQQ=CKDJNKHCFFKAMNNFJDFPKOHC; DoNotShowFTU=true; ASPSESSIONIDASDRDASR=LEDFLOEAJNIHIGOADDIBHBHD; ASPSESSIONIDAQCTCDRR=IKNPGEPAOANIIPNALACLPAAD; jwplayer.volume=90; jwplayer.mute=false; ASPSESSIONIDCSATDASR=GNLNCBGAGFHHCEOBNFOJJHCC; ASPSESSIONIDAQBTDBSQ=HFFHCHLBBEGPKMHCOKMPNHMJ; ASPSESSIONIDAQAQCBSR=JGMFMLNAMFDJGMDDPOODGLBJ; ASPSESSIONIDAQBTCCRR=GHNFNAOAEHMBONHLCMFBNPOD; ASPSESSIONIDAQAQCASQ=FFONELHBJKLDKODLKLGOJICP; ASPSESSIONIDAQBQDBTQ=AHOJKDLBOEBGPPCANNMDMBKF; ASPSESSIONIDASARDDSR=MBDJOHNAAADKBOJGAODPCLAD; ASPSESSIONIDCQCSDCRR=PPLJLLNADCCAGEIOGEMFOFEA; ASPSESSIONIDAQCRDDTR=DJNDDLHBCOMLONODBMOLGKMD; ASPSESSIONIDAQDQCBRT=GLFFFFECGAFKDOMKGKBMABEN; lastMediaCacheSource=amazons3; ASPSESSIONIDAQCTCCSQ=EEAPGCPCAIHKHHAIJMIIJNFG; lastTemplateApp=; lastTemplateEncodeApp=; ASPSESSIONIDSSQDQQDT=GDNFIPOACECEJKNIEFPKPGNF; jwplayer.qualityLabel=160p; ASPSESSIONIDSQSDQSDS=HAPDCKIBEPCIACFHGKAILPLP; incomingStreamViewByStream=true; lastMangerHost=http%3A//localhost%3A8087; showRightRail=true; lastTab=Basic; ASPSESSIONIDQQTDSTDS=IFEHEILCAJJFFKHKAKIKKKIK

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Date: Thu, 02 Apr 2015 17:01:00 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 137

The server sends the client a chunklist, which is a subset of the files in the playlist.

GET /vod/mp4:sample.mp4/chunklist_w1556499301.m3u8 HTTP/1.1
Host: localhost:1935
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
Accept: */*
Referer: http://localhost/jwenterprise/index.asp
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: ASPSESSIONIDCQBSBCRR=IAKNOGHCJMDALEDFLDFFNDJH; ASPSESSIONIDASASBDQQ=CKDJNKHCFFKAMNNFJDFPKOHC; DoNotShowFTU=true; ASPSESSIONIDASDRDASR=LEDFLOEAJNIHIGOADDIBHBHD; ASPSESSIONIDAQCTCDRR=IKNPGEPAOANIIPNALACLPAAD; jwplayer.volume=90; jwplayer.mute=false; ASPSESSIONIDCSATDASR=GNLNCBGAGFHHCEOBNFOJJHCC; ASPSESSIONIDAQBTDBSQ=HFFHCHLBBEGPKMHCOKMPNHMJ; ASPSESSIONIDAQAQCBSR=JGMFMLNAMFDJGMDDPOODGLBJ; ASPSESSIONIDAQBTCCRR=GHNFNAOAEHMBONHLCMFBNPOD; ASPSESSIONIDAQAQCASQ=FFONELHBJKLDKODLKLGOJICP; ASPSESSIONIDAQBQDBTQ=AHOJKDLBOEBGPPCANNMDMBKF; ASPSESSIONIDASARDDSR=MBDJOHNAAADKBOJGAODPCLAD; ASPSESSIONIDCQCSDCRR=PPLJLLNADCCAGEIOGEMFOFEA; ASPSESSIONIDAQCRDDTR=DJNDDLHBCOMLONODBMOLGKMD; ASPSESSIONIDAQDQCBRT=GLFFFFECGAFKDOMKGKBMABEN; lastMediaCacheSource=amazons3; ASPSESSIONIDAQCTCCSQ=EEAPGCPCAIHKHHAIJMIIJNFG; lastTemplateApp=; lastTemplateEncodeApp=; ASPSESSIONIDSSQDQQDT=GDNFIPOACECEJKNIEFPKPGNF; jwplayer.qualityLabel=160p; ASPSESSIONIDSQSDQSDS=HAPDCKIBEPCIACFHGKAILPLP; incomingStreamViewByStream=true; lastMangerHost=http%3A//localhost%3A8087; showRightRail=true; lastTab=Basic; ASPSESSIONIDQQTDSTDS=IFEHEILCAJJFFKHKAKIKKKIK

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Date: Thu, 02 Apr 2015 17:01:01 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 2247

The client accesses the segmented (.ts) media files in the chunklist with an established bitrate via an HTTP request, and then plays the .ts files.

GET /vod/mp4:sample.mp4/media_w1556499301_0.ts HTTP/1.1
Host: localhost:1935
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
Accept: */*
Referer: http://localhost/jwenterprise/index.asp
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: ASPSESSIONIDCQBSBCRR=IAKNOGHCJMDALEDFLDFFNDJH; ASPSESSIONIDASASBDQQ=CKDJNKHCFFKAMNNFJDFPKOHC; DoNotShowFTU=true; ASPSESSIONIDASDRDASR=LEDFLOEAJNIHIGOADDIBHBHD; ASPSESSIONIDAQCTCDRR=IKNPGEPAOANIIPNALACLPAAD; jwplayer.volume=90; jwplayer.mute=false; ASPSESSIONIDCSATDASR=GNLNCBGAGFHHCEOBNFOJJHCC; ASPSESSIONIDAQBTDBSQ=HFFHCHLBBEGPKMHCOKMPNHMJ; ASPSESSIONIDAQAQCBSR=JGMFMLNAMFDJGMDDPOODGLBJ; ASPSESSIONIDAQBTCCRR=GHNFNAOAEHMBONHLCMFBNPOD; ASPSESSIONIDAQAQCASQ=FFONELHBJKLDKODLKLGOJICP; ASPSESSIONIDAQBQDBTQ=AHOJKDLBOEBGPPCANNMDMBKF; ASPSESSIONIDASARDDSR=MBDJOHNAAADKBOJGAODPCLAD; ASPSESSIONIDCQCSDCRR=PPLJLLNADCCAGEIOGEMFOFEA; ASPSESSIONIDAQCRDDTR=DJNDDLHBCOMLONODBMOLGKMD; ASPSESSIONIDAQDQCBRT=GLFFFFECGAFKDOMKGKBMABEN; lastMediaCacheSource=amazons3; ASPSESSIONIDAQCTCCSQ=EEAPGCPCAIHKHHAIJMIIJNFG; lastTemplateApp=; lastTemplateEncodeApp=; ASPSESSIONIDSSQDQQDT=GDNFIPOACECEJKNIEFPKPGNF; jwplayer.qualityLabel=160p; ASPSESSIONIDSQSDQSDS=HAPDCKIBEPCIACFHGKAILPLP; incomingStreamViewByStream=true; lastMangerHost=http%3A//localhost%3A8087; showRightRail=true; lastTab=Basic; ASPSESSIONIDQQTDSTDS=IFEHEILCAJJFFKHKAKIKKKIK

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Date: Thu, 02 Apr 2015 17:01:01 GMT
Content-Type: video/MP2T
Content-Length: 905032

Before the client reaches the end of the chunklist, another request is issued for the next chunklist. Since this is a new request, the server can respond with a chunklist of media files with a different bitrate, resulting in dynamic, adaptive bitrate switching between different renditions as required by network performance.

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID = 1,BANDWIDTH = 1280000
http://localhost/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID = 1,BANDWIDTH = 2560000
http://localhost/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID = 1,BANDWIDTH = 7680000
http://localhost/hi.m3u8
Note: A chunklist must have a minimum of a few seconds of program segments (chunks), so there's inherent latency when accessing the server.
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:5
#EXTINF:10.016,
media_w333646421_5.ts
#EXTINF:10.016,
media_w333646421_6.ts
#EXTINF:10.016,
media_w333646421_7.ts

Fix problematic SDP files


Many RTSP sources, especially IP cameras, incorrectly publish the H.264 profile-level-id value in the Session Description Protocol (SDP) message. This can cause the video to be either blank or corrupted. You can configure Wowza Streaming Engine to ignore the profile-level-id value in the SDP data and instead derive this value from the sprop-parameter-sets value.

To derive an ID value from sprop-parameter-sets in Wowza Streaming Engine Manager:

  1. Click the Applications tab and select your application in the contents panel.  
  2. In the details page, click the Properties tab, and then click Custom in the Quick Links bar.
     
    Note: Access to the Properties tab is limited to administrators with advanced permissions. For more information, see Manage credentials.
  3. In the Custom section, click Edit.  
  4. Click Add Custom Property, specify the following settings in the Add Custom Property dialog box, and then click Add:
     
    • Path - Select /Root/Application/RTP.  
    • Name - Enter rtpIgnoreProfileLevelId.  
    • Type - Select Boolean.  
    • Value - Enter true.
  5. Click Save, and then restart the application when prompted to apply the changes.

Alternatively, set the custom property in XML:

  1. Use a text editor to open the [install-dir]/conf/[application-name]/Application.xml file for your live application and add the following property to the RTP/Properties container. Be sure to add the properties to the correct <Properties> container in Application.xml, as there are several in the file.
     
    <Property>
        <Name>rtpIgnoreProfileLevelId</Name>
        <Value>true</span><span class="tag"></Value>
        <Type>Boolean</span><span class="tag"></Type>
    </Property>
  2. Restart Wowza Streaming Engine to apply the changes.

Use Apple troubleshooting tools


Apple provides its own tools for troubleshooting HLS playback, including the Media Streaming Validator tool. For information, see About Apple's HTTP Live Streaming Tools on the Apple Developer website.

Test stream URLs


Wowza provides a RTSP/RTP test stream running on Amazon EC2, which seems to work on most mobile networks/devices. Amazon EC2 is a great place to experiment with RTSP/RTP streaming. For more information, see About deploying Wowza Streaming Engine on Amazon.

You may also use our H.264 test stream, which is a H.264 test VOD clip.

More resources