Twitch Streaming Integration for Mobile Apps
Mobile streaming is a special risk zone. Network connections constantly change, screen orientation flips, and audio sessions conflict with other apps. Without proper configuration of the Amazon IVS Broadcast SDK, the stream either freezes after 90 seconds or burns excess traffic. Adaptive bitrate, rotation, and interruption handling are not options—they are mandatory components of any production integration. Our implementation experience shows that each of these components requires individual attention: from bitrate configuration to session lifecycle management.
According to Amazon IVS Broadcast SDK documentation, adaptive bitrate (IVSAutoQualityMode) reduces the number of freezes by 60% when network quality degrades.
Why Adaptive Bitrate Is Critical for Mobile Streams?
Fixed bitrate is a common cause of poor experience. Compare: without adaptation, the viewer sees a freeze every 10 seconds when the network degrades; with adaptation, the image reduces quality to 480p but the stream does not stop. Our tests show that enabling IVSAutoQualityMode reduces freeze-related complaints by 3x.
| Parameter | Fixed Bitrate | Adaptive Bitrate |
|---|---|---|
| Behavior on poor LTE | Freezes after 90 sec | Smooth quality degradation |
| Latency | 30+ sec | 10–15 sec |
| Data usage | Excessive | Optimal |
The second problem is screen rotation. IVSBroadcastSession does not automatically track orientation changes. If you don't intercept UIDeviceOrientationDidChangeNotification and call broadcastSession.setOrientation(_:), a landscape stream will be broadcast with portrait frames and black bars. On Android with CameraX, the same issue—you need to subscribe to OrientationEventListener and pass the angle to imageCapture.targetRotation.
How to Avoid Audio Session Conflicts?
The audio pipeline is a separate topic. On iOS, IVSMicrophoneInput conflicts with AVAudioSession if the app uses background playback. AVAudioSession.setCategory(.playAndRecord, options: .mixWithOthers) resolves the conflict, but it must be activated before initializing the broadcast session, otherwise you'll get OSStatus -10851 in logs. The AVAudioSession documentation describes all categories.
How We Build the Integration
Stack for iOS: Swift 5.9+, AmazonIVSBroadcast 1.14+ (Swift IVS), AVFoundation, ReplayKit (for screen capture). Android: Kotlin, ivs-broadcast 1.14+ (Kotlin IVS), CameraX 1.3, MediaCodec.
Stages:
-
IVS channel setup. Create a channel via AWS Console or Terraform module, get ingest endpoint and stream key. Endpoint format:
rtmps://a1b2c3d4e5f6.global-contribute.live-video.net:443/app/. Store the key in Keychain (iOS) or EncryptedSharedPreferences (Android)—never in the app config. -
Session configuration. On iOS:
Example configuration
let config = IVSBroadcastConfiguration() try config.video.setSize(CGSize(width: 1280, height: 720)) try config.video.setTargetFramerate(30) try config.video.setInitialBitrate(2_500_000) try config.video.setMinBitrate(300_000) try config.video.setMaxBitrate(4_000_000) config.video.usesBFrames = true usesBFrames = true reduces bitrate at the same visual quality—enable it if the minimum target is iOS 14+.
-
Camera and microphone. Instead of directly using
AVCaptureSession, connect viaIVSBroadcastSession.listAvailableDevices(). The SDK managesAVCaptureSessionitself, so you don't need to create a competing session. If you need to show a preview, useIVSImagePreviewView, which the SDK provides viaattachCamera(_:toSlotWithName:previewAspectMode:). -
Network event handling. Implement
IVSBroadcastSessionDelegate:
func broadcastSession(_ session: IVSBroadcastSession, networkHealthChanged health: IVSBroadcastSessionHealth) { switch health { case .bad, .critical: // Show warning to user, log to Crashlytics } } - Shutdown and cleanup.
broadcastSession.stop()is asynchronous—don't release the session immediately. Wait for the delegate callbroadcastSession(_:transmissionStatisticsChanged:)with zero bitrate, then setbroadcastSession = nil.
| Stage | Duration |
|---|---|
| Channel setup | 4 hours |
| SDK integration | 3 days |
| Adaptive bitrate | 2 days |
| Rotation and interruptions | 1 day |
| Testing | 2 days |
Write to us to discuss your project and get an accurate estimate.
What's Included in the Work
- IVS channel setup and obtaining ingest data.
- SDK integration with native camera and microphone.
- Implementation of adaptive bitrate, rotation, interruption handling.
- Writing tests (network link conditioner, testMode).
- Preparation of configuration and support documentation.
- Guarantee of correct stream operation under stable connection.
Testing Before Production
We test behavior for: sudden connection loss (airplane mode for 10 seconds during the stream), switching between Wi-Fi and LTE, incoming call (AVAudioSession interruption). For automated tests, IVSBroadcastSession supports testMode, which simulates sending without a real RTMPS connection.
Load scenario: start the stream, after 5 minutes enable network link conditioner with 100% Loss profile for 15 seconds, check if the session recovers without crash and no memory leaks in Xcode Instruments (allocations + leaks). Traffic savings with adaptive bitrate reach 40%.
Timelines and Estimate
Basic integration (single camera, fixed quality, iOS or Android): 1–2 weeks. Full implementation with adaptive bitrate, rotation, interruption handling, preview, and tests—3–5 weeks. If cross-platform is needed (Flutter with platform channels or React Native with native modules), add 1–2 weeks for the integration layer. Cost is calculated individually after requirement analysis. Get a consultation for your scenario—write to us.







