GoCoder SDK for iOS release notes

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

Latest version

The latest version of Wowza GoCoder SDK for iOS is Wowza GoCoder SDK 1.6.0 build 1027.

Changes (since

  • Added an Objective-C sample app that uses the GoCoder SDK to inject timed metadata into a live stream.
  • Added a Swift sample app that uses the GoCoder SDK to play a live stream.
  • Updated access and navigation for GoCoder SDK downloads and API reference docs.
  • Fixed buffering and intermittent crashing issues with 4K playback.
  • Fixed a lag when publishing AMF metadata using ultra low latency and the GoCoder SDK playback feature.
  • Fixed an issue where the PCM encoder would not start when trying to stream on an iOS 11 device.
  • Fixed the error message that displays when playback stops due to a stream not found issue (error 13).
  • Fixed an aspect ratio issue when trying to stream with landscape orientation.
  • Fixed OpenFace orientation issues.
  • Fixed a displayLink callback leak with a player created using GoCoder SDK.
  • Improved the error message when the broadcast license is valid but the player license is invalid.
  • Improved the error message when a broadcast/playback license is invalid.

Known Issues

  • When attempting to broadcast at an 8-kHz audio sample rate and a 56/192/128/256K bitrate, a PCM audio error can occur.
  • On iOS and Android, T-Mobile blocks streams over the WOWZTM protocol.
  • 4K broadcasting is currently only supported on iPhone 8 and later.
  • Top part of camera is cut-off and left-hand quadrant isn't oriented properly when broadcastConfig.videoWidth=1280broadcastConfig.videoHeight=720, and orientation on phone is portrait.
  • When streaming is accidentally disconnected, MP4Writer doesn't terminate and save the recording properly. Workaround: Use AVAssetWriter libraries with grabbing frame and audio callbacks.
  • Custom rendering requests on WOWZPlayer are not supported.
  • When a screenshot is taken, the CameraView changes so that the content and broadcasted stream is zoomed in.
  • When streaming from an SDK app to Wowza Streaming Engine, the frame rate reported on the Wowza server (and from VLC) doesn't match the configured frame rate on the app. This is only for the source stream. A transcoded stream is correctly reporting the frame rate.
  • Audio stream doesn't resume once app is resumed from the background. Workaround: Start and stop the stream instead.
  • When streaming with an HD or higher frame size, the broadcast sometimes doesn't stop correctly.
  • After changing the configuration to change the resolution, bitrate, or fps before starting a stream, the encoder re-starts and the screen goes black for about a second.
  • After flipping the camera, the image rotates by 90 degrees and becomes blue for a moment.
  • VOIP audio works well in 2-way communication but camera audio gets muted.
  • Calling endBroadcast results in an ANR (application not responding) when there is low bandwidth.
  • When following the tutorial to install the SDK static library file (*.a), XCode is unable to compile the app and is returning a MACH-O linker error.
  • WOWZBroadcast: User is attempting to set orientation/scale mode for GoPro camera.

Earlier versions of Wowza GoCoder SDK for iOS

Version 1.5.1

1.5.1 build 0949

  • Changed the prefix of all WZ classes to WOWZ to comply with Apple policy. This is a breaking change. You must update your code. Apple will not approve apps that use the two-character WZ prefix.
  • Added the capability to play streams, including ultra low latency streams from the Wowza Streaming Cloud™ service, using a the WOWZPlayer class. WOWZPlayer supports Apple HLS fallback, video- and audio-only streams, preroll buffering, and 48 kHz audio.
  • Added support for connection codes for live streams and ultra low latency streams from the Wowza Streaming Cloud™ service.
  • Audio improvements:
    • Fixed audio graph to handle the playback of incoming audio sample rates on devices with a different native sample rate.
    • Fixed intermittent failure of audio queue to get default properties for broadcast when used in conjunction with other audio queue services.
    • Fixed an audio memory leak.
    • Fixed 44.1 kHz mono issue with crackle and buffer looping.
  • Video improvements:
    • Fixed long keyframe visual issues.
    • Updated the handling of video so that if it's sent to the background, the broadcast displays a black frame.
  • Implemented buffer fixes and improvements.
  • Added adaptive bitrate controls with the updateEncoderLimitedBitrate and updateEncoderTargetedBitrate methods in the WowzaGoCoder class.

Known Issues

  • On iOS, 4K broadcasting is currently only supported on iPhone 8 and later.

Version 1.0.5

1.0.5 build 735

  • Fixed an issue that caused an error in the audio configuration if no default values were set.
  • Fixed an issue that prevented the audio stream from being restarted after an app was placed in the background.
  • Fixed an issue preventing audio from being captured by external devices, such as Bluetooth headsets.
  • Updated the SDK so that if a hardware audio converter fails, the SDK attempts to use a software-based converter instead.
  • Added additional logging diagnostics to the audio converter.
  • Significantly improved error detection and reporting for the audio encoding components of the SDK.
  • Updated the WZMediaConfig so that specifying a sample rate and leaving the bitrate as 0 results in an optimal bitrate to be chosen for the specified sample rate. If you set both the sample rate and the bitrate to 0, the SDK will query the device for optimal values.
  • Added a static method, (NSArray *_Nullable) supportedBirtatesForSampleRateAndChannels:(Float64)sampleRate channels:(UInt32)numChannels, to the WZAudoiDevice class that returns an NSArray of NSNumbers that contain the audio encoding bitrates supported for the specified audio sample rate and number of audio channels.

Version 1.0.3

1.0.3 build 699

  • Added a connectionParameters property to the WZStreamConfig class that enables you to define a WZDataMap of name/value pairs that are used as query string parameters in the server connection string.
  • Added a mirrorFrontCamera boolean property to the WZMediaConfig class that enables clients to set the mirroring behavior of front camera recording. The default value is YES, which matches the pre-existing behavior of recording with the front camera. 

1.0.3 build 581

  • Fixed an issue with the background encoding flag when an app is resumed.

1.0.3 build 579

  • Fixed an issue where endStreaming wasn't releasing references to event listeners, which caused client objects to be retained.

1.0.3 build 576

  • Fixed a bug with cropping non-canonical frame sizes.

1.0.3 build 573 

  • Observers can now safely be removed inside a callback.
  • Updated the Objective-C SDKSampleApp to demonstrate the proper way to interact with metadata. Added documentation for all APIs related to metadata.

1.0.3. build 565

  • The x86 code strips of the fat-binary SDK files are now built with bitcode enabled, which should enable you to build bitcode-compliant apps with Wowza GoCoder SDK.

1.0.3 build 545

  • The SDK is now built with Xcode 8. Developers must use Xcode 8 with this version of the SDK and later.
  • Updated the Swift-based SDK sample apps to use Swift 3.0 syntax. All sample apps now require Xcode 8.

Version 1.0.2

1.0.2 build 506

  • Fixed a couple potential memory leaks with PCM audio code.
  • Added more intelligence to the startBroadcasting function to prevent calling stop if it isn't already broadcasting.

1.0.2 build 489

  • Fixed a bug in the audio encoder.

1.0.2 build 472

  • Added support for IPv6 addressing.
  • Updated the audio encoder to generate an audio prime frame if the writer doesn't encounter one.

1.0.2 build 469

  • Fixed bugs in the SDK sample app MP4 writing example.

1.0.2 build 466

  • Added support for broadcasting while the host application is in the background. A backgroundBroadcastEnabled flag was added to WowzaConfig, with a default value of NO. To broadcast in the background, your app must add the Audio Background Mode capability, and set backgroundBroadcastEnabled to YES. In this configuration, only live audio is broadcasted. Access to the camera is prohibited while the app is in the background, so a frozen video frame is broadcast in place of the live video.
  • Added the audioPCFrameWasCaptured protocol method to WZAudioSink. Clients implementing the audioPCFrameWasCaptured method can modify the PCM audio frames before they are encoded to AAC and broadcast
  • Updated the SDKSampleApp to include a setting for changing the backgroundBroadcastEnabled flag. The SDKSampleApp now includes the audio background mode.

Version 1.0.1

1.0.1 build 459

  • Fixed a bug in the onWZEvent callback that caused the WZStatus data member to be set incorrectly for the WZEventBitrateReduced and WZEventBitrateIncreased events.

1.0.1 build 456

  • Fixed a bug with audio conversion on A5 devices.

1.0.1 build 451

  • Added a videoFrameRateLowBandwidthSkipCount parameter to WZMediaConfig, which can be used to set the number of video frames to skip when the encoder can't keep up with the broadcaster.
  • Added an optional videoCaptureInterruptionStarted method to WZVideoSink, which is called when video capture is first interrupted. For example, an app going to the background is an interruption.

1.0.1 build 424

  • Fixed an issue where muted audio caused the video stream to hang in Apple HLS players.

1.0.1 build 420

  • Updated the SDK so that when the audio sample rate is set to 0, the SDK chooses an optimal sample rate based on the current hardware capabilities.

1.0.1 build 398

  • Added interfaces to  WZAudioDevice and WowzaGoCoder to allow setting AVAudioSessionCategoryOptions for the shared AVAudioSession.
  • Fixed an issue with previews that are embedded in a presented view controller's view by basing the initial video orientation on the UI orientation rather than the orientation of the device.

1.0.1 build 391

  • Fixed an issue that caused blank video frames to be broadcast for audio-only streams.

1.0.1 build 388

  • Fixed an issue with incorrectly oriented broadcast frames that occurred when the initial broadcast orientation is UIDeviceOrientationLandscapeLeft and then changed to UIDeviceOrientationLandscapeRight when the device rotates.

1.0.1 build 377

  • Added a new WZBroadcastScaleMode type and parameter to WZMediaConfig (also called WowzaConfig) that tells the SDK how to scale or crop frames when the frame size doesn't match the specified broadcast size. There are two valid values: WZBroadcastScaleModeAspectFit and WZBroadcastScaleModeAspectFill.
  • Updated the SDKSampleApp and SwiftSDKSampleApp to include a setting for changing the WZBroadcastScaleMode.

1.0.1 build 367

  • Added the following methods to WowzaGoCoder:
    • registerVideoEncoderSink:WZVideoEncoderSink
    • unregisterVideoEncoderSink:WZVideoEncoderSink
    • registerAudioEncoderSink:WZAudioEncoderSink
    • unregisterAudioEncoderSink:WZAudioEncoderSink
  • Encoders can now access audio and video frames as they wish to.
  • Updated the documentation released with the SDK to have the correct SDK headers.
  • Updated the WowzaGoCoderSDKSampleApp to include an example of writing a local MP4 movie of the broadcasted video stream. 

1.0.1 build 348

  • Added the following methods to the WowzaGoCoder class to enable clients to explicitly request camera and microphone permissions:
    • (void) requestPermissionForType:(WowzaGoCoderPermissionType)type response:(nullable WZPermissionBlock) response;
    • (WowzaGoCoderCapturePermission) permissionForType:(WowzaGoCoderPermissionType)type;
    If the client doesn't explicitly request these permissions, the SDK requests permissions as the camera and microphone resources are accessed during the preview and broadcast lifecycle. However, we recommend using the explicit mechanisms because client apps know the best time to display the permission prompts to users.
  • Updated the SDK so that streaming will now fail if the client specifies that audio or video is enabled in the client configuration, but the permission for the corresponding audio or video resource is denied. Similarly, streaming will also fail if the client configuration specifies audio or video and the corresponding resource is being used by a higher priority app, such as the Phone app using the microphone.
  • Updated the H264Encoder stopBroadcasting method to synchronize with the capture device's capture queue. This may address an issue with runaway encoding sessions.
  • Updated the WowzaGoCoderSDKSampleApp and WowzaGoCoderSDKSampleApp.swift sample apps include an example using the explicit requestPermissionForType requests.

Version 1.0.0

1.0.0 build 338

  • Updated the WZCameraPreview to provide access to the underlying AVCaptureVideoPreviewPlayer, which allows players to update the AVCaptureVideoPreviewPlayer when the bounds change in client views that host the preview layer.

1.0.0 build 333

  • Fixed a crash that occurred when using the WowzaGoCoder interface to do an audio-only broadcast.

1.0.0 build 330

  • Added the following event types to WZEvent so that clients who implement WZStatusCallback can listen for bitrate-related events with onWZEvent.
    • WZEventBitrateReduced
    • WZEventBitrateIncreased
    • WZEventEncoderPaused
    • WZEventEncoderResumed
  • Added data, an NSDictionary property, to WZStatus. This property contains data related to the WZStatus for particular event cases.
  • Deprecated the videoBitrateDidChange method of the WZVideoEncoderSink protocol. This protocol still exists and will be called, but will be removed in the next major SDK revision. Clients should use the WZEvent methods to get information about bitrate changes.
  • Fixed an issue with cropping when the configured frame size doesn't match a device preset frame size.

1.0.0 build 323

  • Updated the following method signatures in the WZStatusCallback protocol to reduce the chance of collisions with identically named methods in other sources and libraries.
    • onSuccess is now named onWZStatus.
    • onEvent is now named onWZEvent.
    • onError is now named onWZError.


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

  • Updated all SDK sample apps to reflect the changes to the WZStatusCallback protocol.

1.0.0 build 318

  • The SDK is now also available as a static library. The static library and associated headers are in the wowzagocoder_static_lib directory.
  • Added the ios_getting_started.html guide to the docs directory.
  • Improved the formatting and location of the API reference documentation. It is now a file (api_reference.html) available in the docs directory.

1.0.0 build 310

  • Added videoCaptureInterruptionEnded, an optional protocol method, to the WZVideoSink class.
  • Fixed an issue with frame stretching when captured video or video preview rotates are false and the capture aspect ratio doesn't match the broadcast aspect ratio.
  • Added WowzaGoCoderMP4Sample.swift.xcodeproj, a new Swift sample app that demonstrates how to broadcast frames from a local MP4 file using an AVAssetReader.
  • Added allSampleApps.xcworkspace, which contains all of the sample app projects.

1.0.0 build 296

  • Fixed a video orientation bug that occurred when broadcasting from the front camera with videoPreviewRotates set to NO and capturedVideoRotates set to YES.
  • Updated the SDK so that video broadcasted from the front camera is now mirrored.
  • Renamed the SDK sample apps so that they are all grouped together in the sample-apps directory:
    • SDKSampleApp.xcodeproj is now WowzaGoCoderSDKSampleApp.xcodeproj
    • SceneKitReel_GoCoder.xcodeproj is now WowzaGoCoder.SceneKitReel.xcodeproj
    • WowzaGoCoderSDKSampleapp.swift.xcodeproj, a new project, is a Swift interpretation of the functionality in the WowzaGoCoderSDKSampleApp project. 

1.0.0 build 287

  • Removed the portraitLetterBoxed property from WZMediaConfig. Use the broadcastVideoOrientation property instead.
  • Added the broadcastVideoOrientation property, of type WZBroadcastOrientation (enum), to  WZMediaConfig, which provides a more explicit mechanism for clients to specify the orientation of the broadcasted video.
  • Added event property, of type WZEvent (enum), to WZStatus, which is used to event information emitted by the encoder and capture devices.
  • Removed WZErrorLowBandwidth. This condition is now reported by the onEvent method of WZStatusCallback.
  • Removed videoFrameWasEncoded and videoBitrateDidChange  protocol method definitions from WZVideoSink. They are now in WZEncoderSink.
  • Added access to the WowzaGocoderEncoder for the following new classes and protocols:
    • WZH264Encoder
    • WZAACEncoder
    • WZAudioDevice
    • WZVideoEncoderSink
    • WZAudioEncoderSink
    • WZBroadcastComponent
    • WZBroadcast
  • Renamed the SDK sample apps directory to sample-apps.
  • Updated the sample app settings screen to include options for setting the broadcastVideoOrientation.
  • Updated the sample apps to implement the onEvent method, which is used for notification of low-bandwidth conditions.
  • Added SceneKitReel_GoCoder, a new sample app that adds Wowza GoCoder broadcasting to Apple's SceneKitReel sample. This sample demonstrates how to broadcast a game app's screen (or any bitmap data) to Wowza GoCoder with the WZBroadcast, WZH264Encoder, WZAudioDevice, WZAACEncoder, and WZBroadcastComponent classes and protocols.

1.0.0 build 255

  • Added the videoBitrateLowBandwidthScalingFactor and videoFrameSizeMultiplier properties to WZMediaConfig to enable finer client control over bandwidth throttling behavior.
  • Added WZVideoSink and WZAudioSink protocols as well as mechanisms to register adopters of these protocols with Wowza GoCoder.
  • Increased socket send buffer size from 128KB to 1MB to provide better performance for high-latency networks.
  • Added a UI to the SDK sample apps Settings to enable user configuration of videoBitrateLowBandwidthScalingFactor, videoFrameBufferSizeMultiplier, videoBitrate, videoFrameRate, and videoKeyFrameInterval.
  • Updated the SDK sample app VideoPlayerViewController so that it implements the WZVideoSink and WZAudioSink protocols.
  • Added functionality to the SDK sample app to conditionally convert captured video frames to grayscale to demonstrate an implementation of the WZVideoSink protocol.

1.0.0 build 249

  • Increased the maximum number of buffered frames that must accumulate before bandwidth is throttled to four times the current frame rate.

1.0.0 build 245

  • Added documentation for Wowza GoCoder SDK to the docs directory in the distribution package. index.html is the landing page.
  • Removed the WZPreset enumeration and replaced it with WZFrameSizePreset.
  • Removed WZSessions.
  • Added an audioMuted flag to WowzaGoCoder.
  • Added WZMediaConfig and WZStreamConfig as subclasses of WowzaConfig. These changes are largely transparent to clients.
  • Added the following to WZCamera:
    • hasTorch (property)
    • supportsFocusMode (method)
    • supportsExposureMode (method)
  • Removed the following from WZCamera:
    • hasCapabilities (method)
    • activated (property)
  • Added the following to WZCameraPreview:
    • previewGravity (property)
  • Removed the following from WZCameraPreview:
    • deviceOrientation
    • orientationLocked
    • frameSize
    • isSwitchCameraAvailable (method). Use the isSwitchCameraAvailableForConfig:WZMediaConfig method instead, or use WZCameraPreview deviceCamera].count > 1 to determine whether switching cameras is available.
    • viewBounds (property). The camera preview is sized based on the view you provide when initializing WZCameraPreview.
  • Removed the WZVideoDisplayOrientation enum.
  • Added the WZCameraPreviewGravity enum.
  • Removed the Black and White effect option from the SDK sample app. It will be added back in a later version.

1.0.0 build 236

  • Added the (nullable instancetype) sharedInstance; class method to WowzaGoCoder. The WowzaGoCoder init methods are no longer available; instead, do the following:

    if ([WowzaGoCoder sharedInstance] != nil) { [WowzaGoCoder sharedInstance].config = myConfig; // etc... }

  • Added the WZPlatformInfo and WZVersionInfo classes.
  • Fixed an issue that prevented broadcast messages from being sent if the streaming server goes offline while streaming.
  • Fixed a potential call recursion when switching cameras.
  • Improved the error handling of the WOWZ protocol (read and write).
  • Updated the cameraView in WowzaGoCoder so that it can be set multiple times. Setting it resets any active previews, capture sessions, and audio sessions.
  • Updated the broadcaster so that when it encounters low-bandwidth conditions, it reports limited bandwidth to the client as an error rather than terminating the broadcast session.
  • Added logic to the SDK sample app to only display an error alert once for a given broadcast session.

1.0.0 build 216

  • Modified video orientation:
    • Removed the captureOrientationBehavior boolean and WZCaptureOrientation enum from WowzaConfig.
    • Added the capturedVideoRotates boolean to WowzaConfig. The default value, FALSE, orients the captured frames to match the orientation of the preview layer at the time streaming begins. Set to TRUE to rotate captured frames to match the rotation of the device.
    • Added the videoPreviewRotates boolean to WowzaConfig. The default value, FALSE, matches the behavior of iPhone's built-in camera app. Set to TRUE to rotate the preview layer when the device rotates.
    • Added the portraitLetterBoxed boolean to WowzaConfig. The default value, FALSE, streams all portrait frames in full portrait orientation, scaled to fit within the stream's frame. Set to TRUE to crop portrait-oriented frames to fit into a letterbox format, where a letterbox is the canonical width and height of a video frame (width is always greater than the height).
    • Added support for arbitrary (not preset) frame sizes. The only requirement is that the width must be greater than the height. (This doesn't preclude portrait video; see portraitLetterBoxed options.)
  • Modified audio:
    • Converted the audioChannels, audioSampleRate, and audioBitrate properties in WowzaConfig to be read/write. This enables clients to set these properties prior to streaming.
    • Updated the isSwitchCameraAvailable method in WZCameraPreview to take withoutRestart, a boolean parameter. The withoutRestart parameter determines whether you can switch cameras without restarting the stream. If withoutRestart is set to YES, isSwitchCameraAvailable only returns true if both cameras support the video configurations specified in WowzaConfig.

      Added isSwitchCameraAvailableForConfig:WowzaConfig, a boolean, that returns true only if the camera you're switching to supports the settings specified in WowzaConfig. The switchCamera method fails if the camera doesn't support the current settings. See the SDK sample app for an example of 

    • Added the class (void) setLogLevel:(WowzaGoCoderLogLevel)level to WowzaGoCoder. Available log levels are:
      • WowzaGoCoderLogLevelOff - Emits no NSLog statements from the SDK.
      • WowzaGoCoderLogLevelDefault - Emits a minimum level of useful log statements from the SDK. Note that this is the default setting, and is used if the client doesn't specify a different log level.
      • WowzaGoCoderLogLevelVerbose - Emits all available log statements from the SDK, including a log statement for each encoded video frame.
    • Updated the options on the Settings screen for the SDK sample app to reflect the video orientation and audio modifications.

If you're having problems or want to discuss this article, post in our forum.