Wowza Streaming Engine 4.4.0 Release Notes

Important: A newer version of Wowza Streaming Engine is available. For more information, see Latest software updates for Wowza Streaming Engine.

Version: Wowza Streaming Engine™ 4.4.0 build 17748 released on February 2, 2016.

 


Note: For step-by-step instructions about how to update your Wowza Streaming Engine media server software, see How to update your Wowza Streaming Engine installation.

Contents


New Features and Functionality in Wowza Streaming Engine 4.4.0

Detailed list of changes in Wowza Streaming Engine 4.4.0

New Features and Functionality in Wowza Streaming Engine 4.4.0


Wowza Streaming Engine™, formerly Wowza Media Server™, is robust, customizable, and scalable media server software that powers reliable streaming of high-quality video and audio to any device, anywhere.

Works with Wowza Integration for The Telos Alliance Audio Encoders

Wowza Streaming Engine software has integrated publishing options that simplify live streaming workflows. The Sources (Live) page for live applications in Wowza Streaming Engine Manager enables you to deliver connection settings for the application to a variety of popular encoders and cameras.

Wowza Streaming Engine 4.4.0 adds The Telos Alliance audio encoders to its growing lineup of integrated encoders and cameras. 

Cross-Origin Resource Sharing (CORS) for HTTP Connections

Cross-origin resource sharing (CORS) allows resources to be requested from a domain that's outside the domain from which the request originated. A common example is a website in one domain that requests video from a streaming media server in a different domain. Wowza Streaming Engine 4.4.0 enables you to configure cross-origin HTTP access control settings so that a website on one domain can deliver HTTP-based streaming video from a streaming media server in a different domain. For more information, see How to enable cross-origin resource sharing (CORS) for HTTP-based connections.

Stream Targets Enhancements

The Stream Targets feature in Wowza Streaming Engine allows you to send live streams to content delivery networks (CDNs), streaming servers, streaming services, and multicast networks for distributed delivery. The destinations distribute your live stream, enabling you to scale your Streaming Engine implementation, computing resources, and delivery options for a variety of scenarios. One such destination is the Wowza Streaming Cloud service, which can transcode and deliver streams to viewers anywhere around the world. Wowza Streaming Engine 4.4.0 has a new option that enables Wowza Streaming Engine to automatically start the Wowza Streaming Cloud service when you create a Wowza Streaming Cloud stream target. This option starts the Wowza Streaming Cloud transcoder immediately and publishes the source stream. For more information, see How to send a live stream to Wowza Streaming Cloud.


If you have less than 100 stream targets set up in Wowza Streaming Engine Manager, this release of the media server software updates the status of each stream target every few seconds, or you can click a Refresh button to see current status at a glance.

Media Cache Updates

The Media Cache feature in Wowza Streaming Engine is a read-through caching mechanism that increases the scalability of on-demand video streaming for your Wowza media server configuration. In this release of Wowza Streaming Engine software, we've increased the flexibility of Media Cache deployment options by adding Microsoft Azure Blob storage as a supported media cache source for media files. You can configure Wowza Streaming Engine Manager to request media files from a single container in Azure Blob storage. For HTTP-based media cache sources, you can now configure Media Cache to request media files over encrypted HTTP (https://) connections. For more information, see How to scale video on demand streaming with Media Cache.

 


Note: You can encrypt HTTP connections using Secure Sockets Layer (SSL) certificates from a certificate authority. Wowza provides free 256-bit SSL certificates to users with Subscription and Perpetual licenses via the Wowza StreamLock™ AddOn.

Transcoder Updates

  • Quick Sync accelerated transcoding - Wowza Streaming Engine 4.4.0 software uses Intel Media SDK 2015 R6 for Intel Quick Sync accelerated video decoding and encoding on Windows and Linux operating systems for greater CPU and GPU performance and reduced power consumption. Quick Sync encoding acceleration can now be used to encode H.265/HEVC video renditions when running Wowza Transcoder on Windows operating systems and Intel 6th generation Core (Skylake) processors.
     

    Note: Quick Sync acceleration is currently NOT supported on Linux with Skylake processors.
  • MainConcept (not hardware-accelerated) transcoding - Wowza Streaming Engine 4.4.0 software uses the latest SDKs for the built-in MainConcept software encoder to improve performance and to support encoding H.265/HEVC video renditions.
     
  • General Transcoder performance improvements - Wowza Streaming Engine 4.4.0 software is updated to improve Transcoder startup times to avoid issues where the Transcoder is slow to start on first use.

Note: Support for encoding H.265/HEVC video output renditions is included as a technology preview feature in Wowza Streaming Engine software. Unexpected results can occur when using technology preview software.

WebM Stream Encryption (MPEG-DASH)

Wowza Streaming Engine software can use key files to protect on demand and live MPEG-DASH streams using the Common Encryption (CENC) standard. Wowza Streaming Engine 4.4.0 software adds key-file support to enable encryption of WebM streams on the fly. The encryption follows The WebM Project specifications, and browsers that support Encrypted Media Extensions (EME) and WebM, such as Google Shaka Player, should be able to decrypt and play the streams. More information.

 


Notes:
  • WebM streams are compressed with the VP8 and VP9 video codecs and the open-source Vorbis and Opus audio codecs. Your live application in Wowza Streaming Engine can ingest WebM-encoded source streams or you can download a transcoder template to transcode an H.264-encoded source stream to the WebM format. For more information about how to transcode live streams to WebM, see How to transcode live streams to WebM for MPEG-DASH playback.
     
  • Important: Support for the WebM file format and codecs is included as a technology preview feature in Wowza Streaming Engine software and may be updated in a later release of the software. Unexpected results can occur when using technology preview software.

Detailed list of changes in Wowza Streaming Engine 4.4.0


  • Added automatic page refresh for the main Stream Targets page in Wowza Streaming Engine Manager
  • Added support for EC3 codec and .ec3 suffix for audio-only renditions
  • Improved nDVR file converter to reduce audio/video synchronization issues
  • Fixed Media Cache HTTP/File properties editing in Wowza Streaming Engine Manager
  • Fixed module Order element when requesting application configuration via the REST API
  • Fixed an issue where the media server didn't ingest HEVC/H265 because we weren't detecting keyframes that were included in the same frame with the VPS NAL unit
  • Fixed Media Cache memory auto-tuning
  • Fixed 'See Incoming Stream' link when creating an Axis live source in Wowza Streaming Engine Manager
  • Fixed the Update tool to handle Wowza Streaming Engine software installations to the root of a drive on Windows
  • Added class CupertinoUserManifestHeaders to wrap Apple HLS (cupertino) user manifest headers. API:
    void addHeader(String header, String key, double value)
    void addHeader(String header, String key, boolean value)
    void addHeader(String header, String key, long value)
    void addHeader(String header, String key, int value)
    void addHeader(String header, String key)
    void addHeader(String header)
    void addHeader(String header, String key, String value)
    void addHeader(String header, String key, String value, boolean quoteStr)
    void clearHeaders()
    boolean removeHeader(String header)
    boolean removeHeader(String header, String key)
    boolean isEmpty()
  • Fixed potential synchronization issues with Apple HLS (cupertino) user manifest headers
  • Added support for user manifest headers for each chunk in Apple HLS (cupertino) chunklists through LiveStreamPacketizerCupertinoChunk interface (propagated through live stream repeater):
    CupertinoUserManifestHeaders LiveStreamPacketizerCupertinoChunk.getUserManifestHeaders()
  • Reworked LiveStreamPacketizerCupertino, HTTPStreamerCupertinoIndexBase, HTTPStreamerSessionCupertino to enable a user manifest header for each rendition (audio/video, audio-only, and video-only):
    CupertinoUserManifestHeaders LiveStreamPacketizerCupertino.getUserManifestHeaders() (audio/video)
    CupertinoUserManifestHeaders LiveStreamPacketizerCupertino.getUserManifestHeadersAudio() (audio-only)
    CupertinoUserManifestHeaders LiveStreamPacketizerCupertino.getUserManifestHeadersVideo() (video-only)
  • Added string LiveStreamPacketizers/Properties and HTTPStreamer/Properties cupertinoManifestHeadersAudio and cupertinoManifestHeadersVideo to enable setting of audio-only and video-only manifest headers
  • Improved cupertinoManifestHeaders, cupertinoManifestHeadersAudio, and cupertinoManifestHeadersVideo LiveStreamPacketizers/Properties and HTTPStreamer/Properties property parsing to include setting values in format header:key=value|header:key|header:key="value"|header to enable unquoted value and standalone keys
  • Added improved interface IHTTPStreamerCupertinoLivePacketizerDataHandler2 for conversion of AMF event to ID3 tags for Apple HLS (cupertino) streaming. Includes methods:
    onFillChunkStart(LiveStreamPacketizerCupertinoChunk chunk);
    onFillChunkEnd(LiveStreamPacketizerCupertinoChunk chunk, long timecode);
    onFillChunkDataPacket(LiveStreamPacketizerCupertinoChunk chunk, CupertinoPacketHolder holder, AMFPacket packet, ID3Frames id3Frames);
    onFillChunkMediaPacket(LiveStreamPacketizerCupertinoChunk chunk, CupertinoPacketHolder holder, AMFPacket packet);
  • Added support for systemd services
  • Fixed Source Username/Password creation in Wowza Streaming Engine Manager first-time user walkthrough
  • Fixed implementation of cupertinoLiveWebVTTAddSpecialEmptyCaption
  • Added liveStreamRecordSkipAudioUntilVideo property (/Root/Application/Properties) to drop audio packets being recorded until video is available. Default behavior is to record audio/video when available
  • Fixed mp4 H264 media reader code to properly handle requests for discrete audio, video, or data media, as is done for MPEG-DASH streaming
  • Fixed NPE when using SMIL file to specify caption file for VOD
  • Added LiveStreamPacketizerCupertino convenience API to get ID3 tag header and footer based on rendition:
    ID3Frames LiveStreamPacketizerCupertino.getID3FramesHeader(CupertinoStreamingRendition rendition)
    ID3Frames LiveStreamPacketizerCupertino.getID3FramesFooter(CupertinoStreamingRendition rendition)
  • Added support for MPEG-DASH WebM encryption (http://www.webmproject.org/docs/webm-encryption/)
  • Fixed a bug where all the settings provided weren't being saved when creating a new application
  • Fixed push publishing map file upgrade logic to greatly reduce upgrade time for large map files, and to reduce related logging
  • Fixed Transcoder memory leak with NVENC5 encoder API, needed to delete CUDA context on shutdown
  • Added support for setting the MPEG-DASH CENC PSSH box version through the CencInfo object:
    public int getPSSHVersion()
    public void setPSSHVersion(int psshVersion)
    public int getPSSHFlags()
    public void setPSSHFlags(int psshFlags)
  • Added support for setting the MPEG-DASH CENC PSSH box version through key file:
    mpegdashstreaming-cenc-pssh-version: 1
    mpegdashstreaming-cenc-pssh-flags: 0
  • Fixed potential NPE in MPEG-DASH manifest generation code when using NGRP
  • Improved Apple HLS (cupertino) stream encryption to properly handle enhanced AC3 (Dolby Digital Plus) streams
  • Fixed push publishing HLS-Akamai so that the pushed media file names will never (again) contain placeholder variables such as "{captionFile}"
  • Added CORS support to HTTP Providers. Each provider can be overridden by setting property httpCORSHeadersEnabled to false
  • Fixed REST API application adv endpoint when trying to update an application that isn't configured
  • Added lib-native/win64/wms-vencoder-h265-quicksync.dll to the updater manifest to fix QuickSync not working after update on Windows
  • Fixed bug where the colon (:) character in a query string caused an invalid media type to be selected
  • Added LiveStreamPacketizers/Properties properties to control discontinuity markers in Apple HLS (cupertinto) streams if chunk duration is out of bounds:
    cupertinoAutoAdjustDurationIfOutOfBounds: Boolean property to turn on/off marking of discontinuities if duration is out of bounds (default is true)
    cupertinoMaxChunkDuration: Integer property to set the maximum chunk duration. If set to -1 it will be set to 3*cupertinoChunkDurationTarget; if set to 0 the maximum is not checked (default -1)
    cupertinoMinChunkDuration: Integer property to set the minimum chunk duration (default is 0)
  • Added the following API to LiveStreamPacketizerCupertinoChunk to force insertion of discontinuity into Apple HLS (cupertino) live streams:
    forceDiscontinuity(boolean value): value control if discontinuity is shown in chunklist for this chunk (false will clear any discontinuities due to chunk duration or change in codecs)
  • Added HTTPStreamer/Properties properties to control display of discontinuity headers in Apple HLS (cupertino) chunklists for live streams:
    cupertinoEnableDiscontinuity: Boolean property to control if EXT-X-DISCONTINUITY headers are added to chunklist (default is true)
    cupertinoEnableDiscontinuitySeq: Boolean property to control if EXT-X-DISCONTINUITY-SEQUENCE headers are added to chunklist (default is false)
  • Added HTTPStreamer/Properties property to control display of program date and time headers in Apple HLS (cupertino) chunklists for live streams. This property must be true and program date and time set in chunk for the header to display:
    cupertinoEnableProgramDateTime: Boolean property to control if EXT-X-PROGRAM-DATE-TIME headers are added to chunklist (default is false)
  • Added API to Apple HLS (cupertino) LiveStreamPacketizerCupertinoChunk to set program date and time for a given chunk:
    LiveStreamPacketizerCupertinoChunk.setProgramDateTime(String programDateTime)
  • Added IHTTPStreamerHTTPOriginSessionIdProvider interface to control how HTTP origin requests are combine into sessions
  • Added API to IHTTPStreamerApplicationContext to set/get IHTTPStreamerHTTPOriginSessionIdProvider provider:
    IHTTPStreamerHTTPOriginSessionIdProvider getHTTPOriginSessionIdProvider();
    void setHTTPOriginSessionIdProvider(IHTTPStreamerHTTPOriginSessionIdProvider httpOriginSessionIdProvider);
  • Fixed LiveStreamRecord to use the file template parameter correctly
  • Embedded wowzaCaptionFile information in Apple HLS URLs instead of passing as query parameters
  • Improved the HTTP streaming query string removal system (HTTPStreamers/Properties httpQueryStrRemoveList, cupertinoQueryStrRemoveList, mpegdashQueryStrRemoveList, sanjoseQueryStrRemoveList, smoothQueryStrRemoveList) to enable wildcard (*) characters: * (remove all query strings), name* (remove query strings that start with), and *name (remove query strings that end with)
  • Fixed H.265 file writing (codec config packet wasn't being recorded correctly)
  • Fixed missing H.265 codec information in Cupertino manifests
  • Fixed Apple HLS SecureToken session timeout issue
  • Added SecureToken support to closed captions
  • Fixed Apple HLS and MPEG-DASH live streaming to correctly mark HE-AAC streams as mp4a.40.5 instead of mp4a.40.2
  • Fixed logging of HE-AAC audio streams in several places to be properly recognized as HE-AAC and not LC
  • Fixed Stream Target "restart" functionality so that only published (incoming) streams trigger push publishing sessions, not client (outgoing) streams
  • Fixed property values that contain the backslash character () to enable them to be displayed and edited in Wowza Streaming Engine Manager
  • Updated Transcoder to MainConcept Codec SDK version 10.0.1
  • Updated Transcoder to MainConcept HEVC SDK version 6.0
  • Updated Transcoder to libVPX SDK version 1.5.0
  • Updated Transcoder to Intel Media SDK for Windows (Quick Sync) version 6.0.0.388
  • Added Transcoder support for Quick Sync accelerated HEVC/H.265 (Windows only, Skylake processor only)
  • Improved Transcoder Quick Sync inspection code to indicate if accelerated HEVC/H.265 encoding is available
  • Added Transcoder/PluginPaths section to Server.xml to support setting the path where Transcoder looks for Quick Sync shared libraries
  • Updated Transcoder Quick Sync library path on Linux to point to correct shared library folder (quicksync-2014r1)
  • Updated update tool for new Quick Sync Transcoder shared libraries (quicksync-2014r1, quicksync-2014r2, and quicksync-2015r6) on Linux
  • Fixed MPEG-DASH logic issues for handling AAC rounding errors for on-demand media with edit lists
  • Added mpegdashLogAACAudioGaps property (/Root/Application/LiveStreamPacketizer) for MPEG-DASH live streaming to enable detection and logging of gaps in AAC audio
  • Added support for The Telos Alliance encoder configuration on the Sources (Live) page in Wowza Streaming Engine Manager
  • Added support for cross-origin resource sharing (CORS) headers for all HTTP streaming connections. There are multiple properties prefixed by protocol name (using the protocol name of http means all HTTP streaming protocols). The following properties can be added to HTTPStreamer/Properties:
    [protocol]CORSHeadersEnabled - Boolean property to enable/disable CORS headers for the protocol
    [protocol]CORSHeadersEnableMain - Boolean property to enable/disable Main CORS headers. Defaults are Allow Origin/Credentials/Methods/Header and Expose-Headers
    [protocol]CORSHeadersEnableAge - Boolean property to enable/disable Age CORS headers. Default is Max-Age
    [protocol]CORSHeadersAddMain - String property that specifies a pipe-separated list of headers to add to the Main header list
    [protocol]CORSHeadersAddAge - String property that specifies a pipe-separated list of headers to add to the Age header list
    [protocol]CORSHeadersRemoveMain - String property that specifies a comma-separated list of headers to remove from the Main header list
    [protocol]CORSHeadersRemoveAge - String property that specifies a comma-separated list of headers to remove from the Age header list
  • Added API support for CORS headers - IHTTPStreamerSession.getCORSHeaders()
  • Added option for enabling/disabling CORS when creating/editing an application in the manager
  • Fixed OPTIONS support to return 404 instead of timeout response when an application or application instance isn't available
  • Added Boolean Server/Properties property udpPortManagerDebugLog to enable/disable debug logging of UDP port manager
  • Fixed an issue with UDP port manager that might cause ports lower than UDP starting ports to be recycled
  • Added more debug logging to RTSP/RTP processing when Boolean RTP/Property property debugRTSPSession is enabled to help troubleshoot UDP port issues
  • Fixed the creation of a new live, live edge, and live/VOD HTTP origin applications that were missing all the Application/MediaCaster/StreamValidator settings, preventing the settings from being modified in the manager
  • Fixed null pointer exception when server stats database isn't available
  • Fixed synchronization issue with I/O erformance and push publishing sessions
  • Improved ServerListenerStreamDemoPublisher by adding and modifying the following configuration items:
  • Renamed "repeat" to "playlistRepeat" ("repeat" is also supported) - If true, playlist items are repeated
    Added "publishDuration" - Time, in seconds, the stream will publish (format: HH:MM:SS.mmm)
    Added "publishRepeat" - If true, the stream is re-published in a loop after the "publishDuration" time has elapsed ("publishDuration" must be greater than zero, default is false)
    Added "publishPauseTime" - Time, in seconds, the stream pauses before being republished if "publishRepeat" it set to true (format: HH:MM:SS.mmm, default is 1 second)
  • Added Apple HLS (cupertino) LiveStreamPacketizers/Properties integer property cupertinoMaxTimecodeGap (in milliseconds). If the gap in time between the previous packet and the next packet is greater than this value, the packetizer is reset (default is -1, which disables this mechanism)
  • Fixed Swagger documentation for the application publisher endpoint such that the singular "publisher" field that was presented to the user is now "publisherName" to match the rest of the documentation nomenclature
  • Added new server listener (com.wowza.wms.module.ServerListenerTranscoderPreload) to preload Transcoder libraries on server startup to avoid issues where Transcoder is slow to load on first use
  • Fixed Transcoder issue with B-frame timecodes to avoid negative DTS to PTS offsets
  • Removed extra "Send the stream to the backup entry point at the destination" option from Akamai RTMP stream target Basic tab "view" page
  • Fixed SecureToken hash generation for RTMP when using certain media type prefixes
  • Added User-Agent HTTP header to all HDS and HLS file pushes to Akamai, allowing Wowza Streaming Engine software releases to be fully certified by Akamai for RTMP, HLS, and HDS going forward
  • Normalized Akamai HLS and HDS ingest/playback URL construction to correct ingest HDS URL issues and to align HLS and HDS ingest/playback URLs
  • Fixed issue where a push publishing output session wouldn't reset correctly when its source stream had intermittent re-connection issues, resulting in orphaned push publishing sessions
  • Updated Destination Stream Name derivation for PushPublishing Akamai RTMP targets so that when adding a default bitrate value to the Destination Stream Name (when not properly specified by the user), a calculated or stream metadata-based value for the bitrate is used (if available), instead of the current default value ("200"), when the PushPublishing session starts
  • Improved the live-record recording process to ensure that audio and video are in sync by trimming audio and video from the start of recordings if audio is delayed from video. The following Streams/Properties are available to control the recording process:
    recordDebugRecordWrites - Turns on debug logging of recording sessions (default is false)
    recordVersionFile - If true, file versions are created if a previous file with the same name exists (default is true, property name versionFile is also supported)
    recordWaitForVideoKeyFrame - If true, audio, video, and data are trimmed from the stream until the first keyframe is encountered (default is true)
    recordUseCalculatedAudioTimecodes - If true, more accurate timecodes are calculated for audio frames (default is true)
    recordSkipKeyFrameIfNoAudio - If true, and recordWaitForVideoKeyFrame is true, keyframes that don't have audio within a tolerance value are skipped (default is true, more aggressive trimming to ensure audio/video synchronization)
    recordSkipKeyFrameIfNoAudioTolerance - The tolerance value, in milliseconds (ms), for recordSkipKeyFrameIfNoAudio (default is 150 ms)
    recordSkipKeyFrameIfNoAudioMaxDropTime - The maximum stream duration, in milliseconds, that recordSkipKeyFrameIfNoAudio system will drop (default is 4000 ms)
    recordMinBufferTime - The time, in milliseconds, the stream is buffered before the first write operation to synchronize the audio and video
    recordMaxWaitingPackets - The maximum time, in milliseconds, a packet remains in the synchronization buffer before it's flushed
  • Added API to get the incoming framerate of a live stream that's published to the media server. There are two sources of framerate data: measured (IMediaStream.PUBLISH_FRAMERATE_SOURCE_MEASURE) and metadata (IMediaStream.PUBLISH_FRAMERATE_SOURCE_METADATA):
    int IMediaStream.getPublishFramerateVideo(); // if metadata available, it is returned; if not, measured is returned
    int IMediaStream.getPublishFramerateAudio(); // if metadata available, it is returned; if not, measured is returned
    int IMediaStream.getPublishFramerateVideo(int source); // IMediaStream.PUBLISH_FRAMERATE_SOURCE_MEASURE or IMediaStream.PUBLISH_FRAMERATE_SOURCE_METADATA
    int IMediaStream.getPublishFramerateAudio(int source); // IMediaStream.PUBLISH_FRAMERATE_SOURCE_MEASURE or IMediaStream.PUBLISH_FRAMERATE_SOURCE_METADATA
  • Added API to get the number of audio, video, and data frames received for an incoming live stream:
    long IMediaStream.getPublishFrameCountVideo();
    long IMediaStream.getPublishFrameCountAudio();
    long IMediaStream.getPublishFrameCountData();
  • Added API to get the last 10 video GOP sizes/keyframe intervals received for an incoming live stream (the most recent GOP is first in the list):
    int[] IMediaStream.getPublishKeyFrameIntervalsVideo();
  • Improved stream ingestion to detect video and audio codecs earlier in the publishing process by inspecting the onMetaData event
  • Improved compatibility of MPEG-DASH live streaming with the Shaka and bitdash players
  • Fixed query parameter support for SMIL file <video> entries
  • Fixed Live Stream Record segment recording file names to reflect the time zone name instead of an hour offset
  • Added TimedText Boolean property "cupertinoLiveWebVTTAddSpecialEmptyCaption" to control creation of a special empty chunk in live webVTT subtitle chunk (default is true)
  • Added IRTPPacketizerMPEGTSPacketNotify interface to monitor and control outgoing MPEG-TS streams
  • Added Streams/Property string property "mpegtsPacketNotifyClass" which can be set to the full class path of the IRTPPacketizerMPEGTSPacketNotify class that's called back for each AMF packet handled during MPEG-TS playback/output
  • Added the following RTPPacketizerMPEGTS API to enable insertion of ID3 metadata into an MPEG-TS stream:
    RTPPacketizerMPEGTS.addDataEvent(long timecode, byte[] buffer, int offset, int len) (timecode should be aligned with stream being output, byte[] should be serialization of ID3Frames object - id3Frames.serialize(true, false, ID3Frames.ID3HEADERFLAGS_DEFAULT))
    RTPPacketizerMPEGTS.setDataPID(int dataPID) (set to RTPPacketizerMPEGTS.DEFAULT_PID_DATA in init method of IRTPPacketizerMPEGTSPacketNotify to turn on ID3 metadata output in MPEG-TS program map)