GoCoder SDK for Android release notes

Wowza GoCoder is sunset and should only be used with existing Ultra-Low Latency (ULL) streams until that technology is also sunset.

Wowza GoCoder™ SDK is regularly updated with bug fixes as well as new features and functionality. This article describes the latest updates of Wowza GoCoder SDK for Android.

Latest version

The latest version of Wowza GoCoder SDK for Android is Wowza GoCoder SDK 1.9.1 build 0636.

Enhancements and fixed issues (since

  • Fixed an issue that was preventing stable broadcasting using GoCoder SDK for Android on certain devices running Android versions 9 or 10.

Known issues

For a full list of known issues that are still in effect, see the GoCoder SDK for Android known issues.

Earlier versions of Wowza GoCoder SDK for Android

Version 1.9.0 build 632

  • Created separate state machines for broadcast and playback with updated states and classes. We’ve streamlined the number of states and created consistency between platforms for a more unified developer experience. This is a breaking change.

    The WOWZStatus and WOWZStatusCallback classes are no longer publicly available.

    For broadcast, as of version 1.9.0, use WOWZBroadcastStatus and WOWZBroadcastCallback classes with these states:
    • BroadcastState.IDLE
    • BroadcastState.READY
    • BroadcastState.BROADCASTING (replaces WOWZStatus.RUNNING)
    For playback, as of version 1.9.0, use WOWZPlayerStatus and WOWZPlayerStatusCallback classes with these states:
    • PlayerState.IDLE
    • PlayerState.CONNECTING
    • PlayerState.BUFFERING
    • PlayerState.PLAYING
    • PlayerState.STOPPING
    The states below are no longer publicly available as of version 1.9.0. To avoid an interruption in playback or broadcast when migrating to version 1.9.0, you’ll need to update your code to remove these states and replace them with the states above, where applicable.
    • WOWZStatus.ERROR
    • WOWZStatus.MAX_STATE
    • WOWZStatus.MIN_STATE
    • WOWZStatus.PAUSED
    • WOWZStatus.RUNNING
    • WOWZStatus.STOPPED
    • WOWZStatus.UNKNOWN
  • Updated the Android sample app build.gradle file to resolve a compile error.
  • Deprecated the method isPlaying in the WOWZPlayerView class. To see if a GoCoder SDK player is actively playing a stream, use the getCurrentState method instead.
  • Fixed an issue that was preventing stable broadcasting using GoCoder SDK for Android from Pixel 3a, Pixel 3 XL, and devices running Android version 9.

Version 1.8.0 build 0463

  • Added the method setMaxSecondsOfAudioLatency to address drift in ultra low latency streams. Part of the WOWZPlayerView class, setMaxSecondsOfAudioLatency defines the number of maximum allowable seconds of audio latency when a Wowza Streaming Cloud ultra low latency stream plays. When audio latency reaches the maximum, the audio buffer resets on the most recent incoming audio frame. This setting applies audio-only streams as well as streams that contain both audio and video. The default, which we recommend, is 3 seconds; acceptable values are 1, 2, 3, and 4. Using a value other than 3 can cause brief audio quality issues when the buffer fills.
  • Fixed an issue that caused playback to stop on some Android phones when the log level was set to verbose.
  • Fixed an issue that prevented playback from resuming when video stopped unexpectedly due to network interruption.
  • Fixed an issue where apps would crash on Android 9 devices when attempting to start a broadcast.

Version 1.7.0 build 0712

  • Fixed an issue with background/foreground swapping. To resolve the issue, use the new isReady method to manage the playing state of a WOWZPlayerView instance. The isReady method is in the GlobalPlayerStateManager class and returns a Boolean true or false value. For an example of its implementation, see [install-folder]/sample-app/PlayerActivity.java.
  • Fixed an issue with playing audio-only streams using the Android SDK. Previously, the time between pressing play and the stream actually playing was 15 to 20 seconds. Now the delay is to 4 to 8 seconds.
  • Fixed an issue where, during playback, the stream freezes when the app is swapped back and forth between the background and the foreground.
  • Fixed an issue with the GoCoder SDK for Android sample app where the frame rate entered using the sample app UI was not used. Now the frame rate entered in the sample app UI is used if it is an integer from 1-60 (frames per second) and it matches the supported FPS settings for the device. If the rate entered is 0, a rate of 1 is used. If the rate entered is 61-99, 60 is used. Note that devices support varying frame rate ranges depending on the device. If an unsupported FPS setting is entered, the FPS will default to 15 FPS.
  • Fixed an issue where, after muting or disabling a mic prior to starting a broadcast, the mic would become re-enabled after starting the broadcast.
  • Fixed an issue where broadcasts that were started in landscape orientation did not display fully across device screens when in landscape orientation during playback.
  • Fixed an issue where the KotlinPlayerActivity.kt sample app would crash when opened if the Kotlin plugin was missing.
  • In the GoCoder SDK for Android sample-app project, improved the sample code for replacing a bitmap over the CameraView in BitmapOverlayActivity.java, making the sample code easier to understand and re-use.
  • Fixed an issue where the camera view showed a black image after calling WOWZBitmap.setBitmap(Bitmap) to update the image.

Version 1.6.0

1.6.0 build 0628

  • Added a Kotlin sample app that uses the GoCoder SDK to play a live stream.
  • Updated the Event and MetaData sample app to showcase a ping request using the sendPingRequest from the WOWZBroadcast class instead of sendDataEvent.
  • Removed Facial Recognition from the sample apps and documentation.
  • Updated access and navigation for GoCoder SDK downloads and API reference docs.
  • Fixed an issue with setScaleMode where the broadcasted stream added black bars to the top and bottom of the playback frame when the orientation changed from portrait to landscape.
  • Fixed an issue where WOWZStatus.clearLastError(int newState) incorrectly cleared out the last error before validating the newState.
  • Fixed an issue where WOWZStatus.setState(int state) didn't set the state to UNKNOWN for an invalid state.
  • Fixed an issue where WOWZPlayerView.registerDataEventListener() threw a NullPointerException.
  • Fixed an issue where the WOWZDataMap wowzDataMap parameter returned null when using onTextData events.
  • Fixed issue where builds don't install on Android devices unless Kotlin (configuration) plugins are installed.
  • Fixed an issue where audio-only broadcasts to Wowza Streaming Engine didn't play using Apple HLS.
  • Fixed an issue where monitoring statistics were not displaying in the logs when broadcasting an authenticated stream to Wowza Streaming Engine.

Version 1.5.0

1.5.0 build 0609

  • Changed the prefix of all WZ classes to WOWZ to be consistent with the naming convention in Wowza GoCoder SDK for iOS. This is a breaking change. You must update your code.
  • Added the capability to play streams, including ultra low latency streams from the Wowza Streaming Cloud™ service, using the WOWZPlayerAPI class. The WOWZPlayerAPI supports Apple HLS fallback, video- and audio-only streams, preroll buffering, data events, mono and stereo audio, and audio sample rates up to 48 kHz.
  • Added support for connection codes for live streams and ultra low latency streams from Wowza Streaming Cloud.
  • Added the WOWZBroadcastAPI.AdaptiveChangeListener interface, which allows you to determine your own logic for modifying bitrates and frame rates instead of using Wowza's algorithms.

Version 1.0.2

1.0.2 build 357

  • Added the WZDataItemWZDataMapWZDataList, WZDataTypeWZDataEvent classes, which can be used to send and receive metadata.
  • Fixed an issue that sometimes occurred if the audio time stamps fell behind while capturing the stream locally to MP4.
  • Fixed issues that caused the SDK sample app to crash when:
    • The SDK sample app was put in the background or endBroadcast(false) was called.
    • Camera and/or microphone permissions are denied and the app tries to initialize the camera.
  • Fixed an issue with the SDK that caused the GoCoder app to stop responding when a broadcast over 10 seconds was ended.
  • Fixed an issue that caused inaccurate version information to display for SDK sample apps.
  • Updated the SDK sample app to use the setOffset(ms) method to publish an MP4 file as a stream from a different point in the file.

Version 1.0.1

1.0.1 build 346

  • Fixed an issue that sometimes caused an app to fail when rendering overlay text with the WZText API class.
  • Fixed an issue that caused audio-only streams to broadcast with an improperly added video configuration.
  • Added additional error checking and logging to trap improper use of the lower-level encoder classes.
  • Added a warning log statement that is logged if a WZRenderAPI.VideoFrameRenderer implementation attempts to call onWZVideoFrameRendererDraw() before onWZVideoFrameRendererInit() has been called.

1.0.1 build 340

  • Fixed an issue in WZMP4Writer that sometimes caused a crash or indeterminate state when capturing an MP4 while streaming.
  • Added a screenshot example to the sample app that demonstrates how to register and use a video frame listener with the WZCameraView class.

1.0.1 build 333

  • Updated WZMP4Writer and WZMP4Broadcaster classes to support writing and broadcasting audio tracks respectively.
  • Fixed an issue that sometimes caused an app to hang if the server connection failed.
  • Fixed an issue that sometimes caused a crash if the camera device was locked by another app.

1.0.1 build 318

  • Added the WZGLBroadcaster class, which enables you to capture and stream from video sources other than the WZCameraView and simplifies the process of integrating OpenGL ES-based apps.
  • Added expanded constructors for the QZGLES.EglEnv OpenGL ES utility class, which can be used with a wide variety of OpenGL ES configurations.
  • Expanded and updated the Javadocs.

1.0.1 build 292

  • Improved the encoder I/O pipeline to provide better performance and reliability in low-bandwidth conditions.
  • Fixed an issue that intermittently caused a crash when streaming was stopped.
  • Fixed an issue that sometimes caused the display to flash when streaming for an extended period of time.
  • Fixed an issue with synchronization of the display that sometimes occurred if the device was rotated rapidly.

1.0.1 build 259

  • Fixed an issue with WZCameraView.getCamera() returning null when an app returned to the foreground.
  • Deprecated WZCameraView.getStatus(). Use WZCameraView.getPreviewStatus() instead.
  • Deprecated WZCameraView.isPaused(). Use WZCameraView.isPreviewPaused() instead.
  • Added the getSamplingConfig() and setSamplingConfig(WZBroadcastConfig) methods to the WZAudioDevice class, which enables you to specify custom audio properties from the audio sampler.
  • Added the WZRenderAPI.VideoFrameRenderer class to separate frame renderers from frame listeners (WZRenderAPI.VideoFrameListener), which simplifies the integration model for developing plugins.
  • Added BluetoothActivity, a new activity class, to the SDK sample app that demonstrates how to use a Bluetooth microphone as the audio capture device.

1.0.1 build 248

  • Fixed an issue that caused the aspect ratio of the camera preview to display incorrectly on certain devices.
  • Fixed an issue with activating the camera on single-camera devices.
  • Updated the SDK to correctly report the error that occurs when attempting to publish to an active stream on a Wowza Streaming Engine server that is configured to disallow it.
  • Updated the SDK to make several methods of the WZCamera class public to aid in the development of apps that want to access the camera through methods other than WZCameraView.

1.0.1 build 230

  • Added the setAudioSource() method to the WZAudioDevice class, which can be used to designate a device as the source for the audio stream. See the reference documentation for android.media.MediaRecorder.AudioSource class for a list of values that can be specified.
  • Fixed a critical bug that caused the camera preview to be resized to the video stream's frame size when the broadcast was initiated.
  • Updated the API documentation to remove outdated references to the camera direction specifier also being used as the unique camera ID.
  • Improved error detection and reliability in the audio encoder framework.
  • Fixed a bug in the sample app that occurred on single-camera devices.
  • Outstanding issues that are in progress and should be fixed and available in a new SDK build in the next few days:
    • If the frame size of the camera preview has a different aspect ratio than the size of the WZCameraView containing the preview, the preview may not fill the view completely on certain devices.
    • If the frame size of the camera preview had a different aspect ratio than the frame size specified in the broadcast configuration, the aspect ratio for the video stream may be incorrect on certain devices.

1.0.1 build 219

  • Added support for adaptive bitrate control settings to the WZMediaConfig class.
  • Added support for displaying text overlays in the video stream with the WZText and WZTextManager classes.
  • Added the callback setPreviewReadyListener to WZCameraView to be invoked when the camera preview display is fully initialized.

Version 1.0.0

1.0.0 build 177

  • Fixed an issue that sometimes caused the camera preview to become unresponsive when streaming over a low-bandwidth connection.
  • Improved compatibility with devices running Android APIs 19 to 21.

1.0.0 build 172

  • Fixed an issue with the WZBitmap class that caused a crash when returning to a paused activity.

1.0.0 build 167

  • Fixed a problem that caused the camera preview to fail to start on occasion after the device wakes up.

1.0.0 build 163

  • Added the onResume() and onPause() methods to the WZCameraView class. Call these methods from the corresponding Android activity lifecycle. The sample app was updated to include examples of using these methods in the CameraActivity and CameraActivityBase classes.
  • Added a WZBitmap class to enable the rendering of a bitmap as an overlay in the camera preview display.
  • Added OverlayBitmapActivity to the sample app to demonstrate how to use the WZBitmap features.
  • Renamed the WZRenderAPI.FrameListener interface to WZRenderAPI.VideoFrameListener.
  • Added the WZAudioDevice.AudioSampleListener interface to build audio sample listener classes. This replaces the SampleListener interface.
  • Added the WZAudioDevice.registerAudioSampleListener(...) method to register audio sample listener classes. This replaces the registerFrameListener method.
  • Added the startAudioSampler() and stopAudioSampler() to the WZAudioDevice class to enable sampling the audio input device when not streaming.
  • The only supported audio sample rates are 8000, 11025, 44100, and 48000. If you use WZMediaConfig.setAudioSampleRate to specify an unsupported value, the SDK rounds up to the nearest supported value.
  • Added AudioMeterActivity to the sample app to demonstrate how to use the audio sample listener updates.

1.0.0 build 141

  • Fixed an issue that caused the camera preview to be cropped when the frame sizes didn't match the aspect ration of the screen.
  • Fixed a crash that occurred when stopping the broadcast before it reached a RUNNING state.

1.0.0 build 121

  • Fixed an issue that caused the keyframe interval to be calculated incorrectly for the video stream.
  • Fixed a bug that prohibited errors that occurred during streaming from being reported correctly.
  • Updated the WZCamera and WZCameraView classes to improve error reporting capabilities. The sample app was updated to include examples of how to use these classes in the onResume() method in the CameraActivity class.
  • Added the following methods to WZCamera, which can be used to detect if an error occurred when the SDK was attempting to open the camera:
    • boolean isAvailable()
    • getLastError
    • WZStatus getStatus()
  • Add the getAvailableDeviceCameras() method to the WZCameraView, which can be used to return only cameras that can be successfully opened and accessed without error.
  • Added the getException() method to the WZCameraView, which returns any Java exception associated with an SDK error.
  • Updated the toString() method in the WZMediaConfig class and subclasses so that toString() now returns a detailed list of the configuration properties.
  • Added two classes to the SDK for working with the video track in MP4 files (audio track support coming soon), and updated the sample app to include examples of their use:
    • WZMP4Writer writes an MP4 of the video stream to local storage.
    • WZMP4Broadcaster streams the video from an MP4 file. 
  • Added experimental support for H.264 profiles and profile levels. The sample app has been updated to include an example of querying the available profiles and profile levels in the onSettings method of the CameraActivity class.
    • Added setVideoProfileLevel and getVideoProfileLevel properties to the WZMediaConfig class, which can be used to specify and get the profile and profile levels.
    • Added int [] WZEncoderAPI.getProfiles() which returns an array of the H.264 profile identifiers that are supported by the current device's H.264 encoder.
    • Added WZProfileLevel[] WZEncoderAPI.getProfileLevels(), which returns an array of the WZProfileLevel instances describing the H.264 profiles and profile levels supported by the current device's H.264 encoder.

1.0.0 build 82

  • Fixed a bug that sometimes caused a crash when a device went to sleep.
  • Added the getDefaultBroadcastConfig() method to the WowzaGoCoder class.
  • Added GoCoderSDKActivity, an abstract base activity class, to the sample app to consolidate common activity code.

1.0.0 build 75

  • Added WZSurfaceTexture, a subclass of the Android class SurfaceTexture, that provides a seamless API to render, encode, and stream OpenGL ES output.
  • Added an example that demonstrates how to use the WZSurfaceTexture class to the sample app.
  • Updated the sample app MP4 broadcast example to include an option to loop playback and streaming.
  • Added audio and video bitrate settings to the sample app preference dialogs.

1.0.0 build 65

  • Updated the following method signatures in the WZStatusCallback interface to reduce the chance of collision with identically named methods in other sources and libraries:

    Note: This is a breaking change. Your code must be updated to to use the new method names.

    • onSuccess is now named  onWZStatus.
    • onError is now named onWZError.
  • Added WZRenderAPI, an abstract class, which can be used to develop rendering plugins.
  • Renamed the WZSurfaceRenderer class to WZTextureRenderer.
  • The registerRenderPlugin and unregisterRenderPlugin plugin registration methods are available from the top-level WowzaGoCoder API.
  • Moved the encoder-related classed to the encoder package and rendering-related classes to the render package.
  • Added a package that contains the gles utility class from Grafika, Google's suite of OpenGL ES examples. 
  • Changed the default scaling mode to WZMedia.FILL_FRAME.
  • Added an example to the sample app that demonstrates how to use MP4CaptureActivity to save a video stream to a local MP4 file.
  • Added support for streaming portrait video.

1.0.0 build 51

  • Updated the sample app to manually check and query for required permissions in accordance with the new permissions model in Android 6.0 (Marshmallow).
  • Fixed a bug that caused period crashes when setting the broadcast status.
  • Fixed a miscalculation of the aspect ratio.
  • Fixed a problem that caused periodic crashes on startup with Android 6.0.
  • Fixed an issue that caused the front camera preview to be flipped.
  • Fixed an issue that caused auto-focusing to fail on some devices.
  • Outstanding issue that is in progress and should be fixed and available in the next beta release of the SDK:
    • Video sent while the device is in portrait orientation is letterboxed and send as landscape.