Stream targets in Wowza Streaming Engine™ (WSE) media server software allow you to send live streams to widely distributed destinations.
This article explains how to create a stream target with a push connection to distribute your live streams using Wowza CDN. You need an AWS account and a Wowza Video account for this workflow.
For more complex streaming scenarios, such as streams with multiple language or video tracks, WebVTT captions, or redundant stream workflows, you may configure a pull-based workflow in which the destination pulls the stream data from the server. (See Scaling Wowza Streaming Engine with Wowza CDN for help determining the best CDN workflow for your streaming needs.)
Note: Closed caption support for S3 stream targets depends on the caption format and your WSE version:
- Embedded CEA-608/708 captions: Captions are carried in the media segments in all supported versions. Starting with WSE 4.12.0, they can also be declared in the master manifest as
EXT-X-MEDIA:TYPE=CLOSED-CAPTIONSentries, so players that rely on the manifest for caption discovery can find them. In earlier versions, the master manifest doesn't declare these captions, and only players that read captions directly from the segments display them. For an example, see Adaptive bitrate with CEA-608/708 captions. For the full setup, see Declare CEA-608/708 captions in stream target manifests.- WebVTT captions: WebVTT caption tracks are declared in the master manifest.
We typically recommend the built-in push-based CDN workflow that includes distribution with Wowza Video. This method was introduced with WSE 4.8.23. For earlier versions of WSE, we recommend the following options to achieve the same push-based functionality:
- WSE 4.8.18 to 4.8.22: Download a separate plugin.
- WSE 4.8.17 and earlier: Set up an S3 bucket in AWS as an origin to distribute your live streams, as described in this article.
Video tutorial: Send Apple HLS content to Amazon S3 using a push-based Wowza Streaming Engine workflow
See how to configure your connection to Wowza CDN for a push-based workflow.
Prerequisites
Before you start, you must have access to the following:
- A valid WSE license
- A Wowza Video CDN subscription
- An AWS account with create, read, and write access to Amazon S3
- A live WSE app with stream targets enabled
1. Create a bucket in Amazon S3
See Creating a bucket for instructions on how to create a bucket in AWS. You must configure some settings to allow streams to be played back from your S3 bucket.
- Create an S3 bucket in your AWS account with the following settings:
- Select ACLs enabled.
- Set Object Ownership to Object Writer.

- Enable Public Access for objects in the bucket.

- (Optional) Enable cross-origin resource sharing (CORS). CORS is required for direct playback from the bucket, but not for playback through Wowza CDN. To enable CORS, select the bucket's Permissions tab and add the following CORS configuration:
[
{
"AllowedHeaders": [],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
- AWS bucket name: For example,
my-s3-bucket. - AWS bucket region: For example,
us-west-1. - AWS bucket URL: This is used with the Wowza CDN stream target in Wowza Video. The format for the AWS bucket URL is:
https://[bucket-name].s3.[region].amazonaws.com/
For example:
https://my-s3-bucket.s3.us-west-1.amazonaws.com/
Note: Wowza CDN stream targets always require the AWS region in the URL.
- Record your IAM credentials. These are set per user in AWS. See Create an IAM admin and user group in AWS for more information. You'll need the following:
- AWS access key ID: For example,
AKIAIOSFODNN7EXAMPLE. - AWS secret access key: For example,
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY.
2. Create a WSE stream target
After you've created your S3 bucket and recorded your credentials, you're ready to create a stream target. The stream target will direct your stream from WSE to the S3 bucket you created in step 1. The S3 bucket is used as a storage location and works as an origin with Wowza Video. You can create an S3 stream target using WSE Manager or by editing the PushPublishMap.txt stream target map file.
Cloud storage stream targets can be configured in WSE Manager with WSE 4.12+. If you are using an older version, create the stream target by editing the PushPublishMap.txt stream target map file directly.
Create a stream target in WSE Manager
- Open WSE Manager.
- Click the Applications tab.
- In the contents panel, click the name of your live app.
- Click Stream Targets.
- Click + Add Stream Target.
- Under Third-Party Target Destinations, select Cloud Storage.
- In the Cloud Storage configuration wizard, provide the following information:
- Stream Target Name: A descriptive name for this target in WSE. The name must be unique and cannot contain any of the following characters:
<,>,:,',",/,\,|,?,*,..,~. - Source Stream Name: The name of the incoming stream that you specified in WSE when you set up the video source.
- Storage Provider: Select Amazon S3.
- Bucket Name: The name of the S3 bucket you set up in step 1.
- Region: The region of the S3 bucket you set up in step 1.
- Access Key ID: The access key ID you recorded in step 1.
- Secret Access Key: The secret access key you recorded in step 1.
- Destination Stream Name: The name of the stream that you provisioned at this stream target's destination. The stream target will send the stream with this stream name.
- Any additional settings, as needed.
Note: To declare embedded CEA-608/708 captions in the master manifest, add the
cupertino.closed-captions.*parameters to the stream target's map entry. For an example, see Adaptive bitrate with CEA-608/708 captions. - Stream Target Name: A descriptive name for this target in WSE. The name must be unique and cannot contain any of the following characters:
- Click Add this target.
Add a stream target map entry
Follow the steps below to create an S3 stream target by adding a new map entry to the PushPublishMap.txt file.
- Open your app's
[install-dir]/conf/[app-name]/PushPublishMap.txtfile. - Add a new entry to
PushPublishMap.txtwith the parameters listed below. (See the stream target examples below for additional help.)
entryName: A descriptive name for this target in WSE. The name must be unique and cannot contain any of the following characters:<,>,:,',",/,\,|,?,*,..,~.streamName: The name of the incoming stream that you specified in WSE when you set up the video source.profile: Set tocupertino-cloudstoragefor a single stream, orgroup-managerfor an adaptive bitrate group. (See the examples below.)cloudstorage.provider: Set toS3.cloudstorage.bucketName: The name of the S3 bucket you set up in step 1.cloudstorage.region: The region of the S3 bucket you set up in step 1.cloudstorage.accessID: The access key ID you recorded in step 1.cloudstorage.secretAccessKey: The secret access key you recorded in step 1.http.relativePlaylists: Set totrue.
- Save the file.
- Restart the WSE server.
- Test playback of your playlist URL in your player. (See Test playback.)
3. Create a Wowza CDN stream target in Wowza Video
After sending your content to your S3 bucket, continue with these steps to use that storage location as an origin with Wowza Video. Setting up a Wowza CDN stream target allows you to manage traffic to your S3 bucket more efficiently while reducing costs when pulling content from that location.
Note: Only one Wowza CDN stream target needs to be created for each S3 bucket.
- Sign in to Wowza Video.
- Click Advanced > Stream targets in the sidebar navigation.
- On the Stream targets page, click the Add new button.
- Select Wowza CDN.
- On the Wowza CDN stream target setup page, enter a Target name.
- Confirm the delivery protocol.
- Select the Enable a custom origin checkbox.
- For the Region, add your AWS bucket region.
- In the Custom origin URL field, add your AWS bucket URL. For example:
https://[bucket-name].s3.[region].amazonaws.com/
- Click Save changes.
- Go to the Settings tab of the stream target details page. Note the playback path, which you'll use as the root of your playback URL. It looks similar to this:
https://cdn3.wowza.com/5/QkxIcU9S-example/
4. Test playback
As the root for your playback URL, you can use the AWS bucket URL or the playback path for the Wowza CDN stream target in Wowza Video. You can find this Wowza CDN stream target playback path on the stream target's Settings tab in Wowza Video. To test playback, append the path to the specific file inside the S3 bucket, as shown in the following examples.
Single bitrate with stream name in the URL
Wowza CDN URL: https://cdn3.wowza.com/5/QkxIcU9S-example/myStream/playlist.m3u8
Amazon S3 URL: https://my-s3-bucket.s3.us-west-1.amazonaws.com/myStream/playlist.m3u8
Adaptive bitrate with group name in the URL
Wowza CDN URL: https://cdn3.wowza.com/5/QkxIcU9S-example/myStream-ABR/playlist.m3u8
Amazon S3 URL: https://my-s3-bucket.s3.us-west-1.amazonaws.com/myStream-ABR/playlist.m3u8
Stream target map file examples
The examples below show map entries in the PushPublishMap.txt stream target map file for S3 stream targets. By default, the map file is created in the [install-dir]/conf/[app-name]/ directory when stream targets are enabled on the app.
For more information on map entries, see Use CDNs and services to distribute live streams from Wowza Streaming Engine. The group-manager profile and child profiles can be used to publish HLS streams to cloud providers such as AWS.
Single bitrate with video
This example entry can be used to send a single HLS stream from WSE to your S3 bucket.
stream_name={"entryName": "wv_via_S3", "streamName": "stream_name", "profile": "cupertino-cloudstorage", "cloudstorage.provider": "S3", "cloudstorage.bucketName": "[s3-bucket-name]", "cloudstorage.region": "[aws-region]", "cloudstorage.accessID": "[aws-access-id]", "cloudstorage.secretAccessKey": "[aws-secret-access-key]", "debugLog": "false", "cloudstorage.transportDebug": "false", "http.relativePlaylists": "true"}
Single bitrate with a single audio track
This example entry can be used to send a single audio track from WSE to your S3 bucket. With the cupertino.audiotagtype parameter, you can add an Apple-compliant rendition from a specific source.
myStream={"entryName": "myStream_av_a", "streamName": "myStream_av_a", "adaptiveGroup": "myStream", "profile": "cupertino-cloudstorage", "cloudstorage.provider": "S3", "cloudstorage.bucketName": "[s3-bucket-name]", "cloudstorage.region": "[aws-region]", "cloudstorage.accessID": "[aws-access-id]", "cloudstorage.secretAccessKey": "[aws-secret-access-key]", "cupertino.renditions": "audioonly", "cupertino.audiotagtype": "stream-inf", "debugLog": "false", "cloudstorage.transportDebug": "false", "http.relativePlaylists": "true"}
Single bitrate with multiple, alternative audio tracks
This example can be used to send a single HLS stream with multiple language tracks from WSE to your S3 bucket for storage. Use the cupertino-cloudstorage profile in this scenario. For more, see cupertino-cloudstorage profile parameters.
The map file must include a separate entry for each rendition you're sending. In this example, there are separate entries for a video-only track, an English audio-only track, and a Russian audio-only track. The English output is an Apple-compliant rendition, while the Russian output is an alternative audio rendition. With a successful setup, viewers can select alternative audio language tracks in the player during playback. Replace any placeholder text with your own values.
myStream_video={"entryName": "myStream-s3-video", "streamName": "myStream_video", "adaptiveGroup": "myStream", "profile": "cupertino-cloudstorage", "cloudstorage.provider": "S3", "cloudstorage.bucketName": "[s3-bucket-name]", "cloudstorage.region": "[aws-region]", "cloudstorage.accessID": "[aws-access-id]", "cloudstorage.secretAccessKey": "[aws-secret-access-key]", "cupertino.renditions": "videoonly", "http.relativePlaylists": "true"}
myStream_ao_eng={"entryName": "myStream-s3-audio-eng", "streamName": "myStream_ao_eng", "adaptiveGroup": "myStream", "profile": "cupertino-cloudstorage", "cloudstorage.provider": "S3", "cloudstorage.bucketName": "[s3-bucket-name]", "cloudstorage.region": "[aws-region]", "cloudstorage.accessID": "[aws-access-id]", "cloudstorage.secretAccessKey": "[aws-secret-access-key]", "cupertino.renditions": "audioonly", "cupertino.audiotagtype": "stream_inf|media", "http.relativePlaylists": "true", "cupertino.language": "en"}
myStream_ao_rus={"entryName": "myStream-s3-audio-rus", "streamName": "myStream_ao_rus", "adaptiveGroup": "myStream", "profile": "cupertino-cloudstorage", "cloudstorage.provider": "S3", "cloudstorage.bucketName": "[s3-bucket-name]", "cloudstorage.region": "[aws-region]", "cloudstorage.accessID": "[aws-access-id]", "cloudstorage.secretAccessKey": "[aws-secret-access-key]", "cupertino.renditions": "audioonly", "http.relativePlaylists": "true", "cupertino.language": "ru"}
For each entry in this example, an asset is created for each streamName in the S3 bucket. The adaptiveGroup parameter groups all assets together into one stream during playback. The cupertino.renditions parameter is used to create separate audio and video tracks.
A master playlist generated from these sample entries looks like this:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audioGroup",NAME="English",LANGUAGE="en",URI="myStream_ao_eng/chunklist_ao.m3u8" #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audioGroup",NAME="русский",LANGUAGE="ru",URI="myStream_ao_rus/chunklist_ao.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=959502,CODECS="avc1.42c01e,mp4a.40.2",RESOLUTION=656x274,AUDIO="audioGroup" myStream_video/chunklist_vo.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=112863,CODECS="mp4a.40.2",AUDIO="audioGroup" myStream_ao_eng/chunklist_ao.m3u8
Adaptive bitrate
This example entry can be used to send a group of transcoded live stream renditions from WSE to your S3 bucket.
stream_name={"entryName":"wv_via_S3", "profile":"group-manager", "group.name":"stream_name_ABR", "cloudstorage.transportDebug":"false", "cloudstorage.secretAccessKey":"[aws-secret-access-key]", "http.relativePlaylists":"true", "cloudstorage.provider":"S3", "cloudstorage.region":"[aws-region]", "cloudstorage.accessID":"[aws-access-id]", "cloudstorage.bucketName":"[s3-bucket-name]", "childProfile":"cupertino-cloudstorage", "group.streamMatcher":"namePrefix"}
Adaptive bitrate with CEA-608/708 captions
This example entry sends a group of transcoded live stream renditions with embedded CEA-608/708 captions from WSE to your S3 bucket and declares the caption channels in the master manifest. It requires WSE 4.12.0 or later. Your live app must also be configured to ingest the embedded captions. For more, see Configure CEA-608/708 captions for output in live streams.
stream_name={"entryName":"wv_via_S3", "profile":"group-manager", "group.name":"stream_name_ABR", "cloudstorage.transportDebug":"false", "cloudstorage.secretAccessKey":"[aws-secret-access-key]", "http.relativePlaylists":"true", "cloudstorage.provider":"S3", "cloudstorage.region":"[aws-region]", "cloudstorage.accessID":"[aws-access-id]", "cloudstorage.bucketName":"[s3-bucket-name]", "childProfile":"cupertino-cloudstorage", "group.streamMatcher":"namePrefix", "cupertino.closed-captions.cc1.language":"eng", "cupertino.closed-captions.cc1.autoselect":"true"}
A master playlist generated from this entry includes an EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS entry for each caption channel, and each variant stream references the caption group. For example:
#EXTM3U #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS,GROUP-ID="captions",LANGUAGE="eng",NAME="English",DEFAULT=YES,INSTREAM-ID="CC1" #EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CLOSED-CAPTIONS="captions" stream_name_1080p/chunklist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3000000,RESOLUTION=1280x720,CLOSED-CAPTIONS="captions" stream_name_720p/chunklist.m3u8





