Implementing RTMP streaming from a mobile device
When developing a mobile app with a live broadcast feature to YouTube, Twitch, or Facebook Live, you quickly hit a limitation: neither iOS nor Android provide a built-in RTMP API. You have to integrate third-party libraries, which means configuring hardware encoding via VideoToolbox or MediaCodec, managing the capture session, handling connection drops, and adapting bitrate to the network. Our team has completed dozens of RTMP streaming integrations—from fitness apps to online learning platforms. A typical client request: the user needs to broadcast the screen or camera in real time with minimal latency, while the stream should work correctly in the background and recover after network loss.
The RTMP protocol runs over TCP, ensuring reliable data delivery, but requires proper timeout and reconnection settings. For ultra-low latency (<500 ms), WebRTC is used, but popular platforms don't accept it directly—a server-side re-streamer is needed. So RTMP remains the most practical choice for mobile streaming.
Why RTMP stays the standard for mobile streaming
RTMP uses TCP, provides reliable data delivery, and works through most corporate firewalls (port 1935). Latency is 1-3 seconds, acceptable for streaming to platforms. WebRTC gives latency <500 ms, but YouTube and Twitch don't accept it directly—a server re-streamer is required. SRT runs over UDP but also needs additional server software. Protocol comparison:
| Protocol | Latency | TCP/UDP | Platform support | Purpose |
|---|---|---|---|---|
| RTMP | 1-3 s | TCP | YouTube, Twitch, Facebook | Live streaming to major platforms |
| WebRTC | <500 ms | UDP (and TCP) | Not directly supported by YouTube/Twitch | Video calls, low latency |
| SRT | 0.5-2 s | UDP | Requires server re-streamer | Reliable transmission in poor networks |
How to avoid black screen and connection loss
Three typical problems of mobile RTMP streaming and their solutions:
Startup delay. The first few seconds are unstable—SPS/PPS NAL units aren't cached on the server yet. On iOS solution: set kVTCompressionPropertyKey_AllowFrameReordering: false — B-frames are disabled, latency reduces by 50%.
Connection loss. On network interruption, automatic reconnection is needed. On iOS, HaishinKit has a built-in reconnect mechanism. On Android, handle onConnectionFailedRtmp with repeated startStream() calls using exponential backoff (initial interval 2 s, increase up to 30 s).
Black screen. Occurs if startStream() is called before capture initialization. Order: attachCamera → startPreview → connect → publish. On iOS, also configure AVCaptureSession before starting.
What to check before streaming?
- Camera and microphone permissions (iOS —
NSCameraUsageDescription,NSMicrophoneUsageDescription; Android —CAMERA,RECORD_AUDIO). - Bitrate settings: for HD (1280x720) recommend 2,000,000 – 3,000,000 bps.
- TLS certificate for rtmps (Android —
RtmpsCamera2, iOS —rtmps://). - Test stream to platforms with latency check.
iOS: HaishinKit
The best Swift-native option. No FFmpeg dependency, hardware encoding via VideoToolbox. HaishinKit starts streaming 2x faster than FFmpeg-based libraries.
Minimal setup:
import HaishinKit let rtmpConnection = RTMPConnection() let rtmpStream = RTMPStream(connection: rtmpConnection) rtmpStream.videoSettings = VideoCodecSettings( videoSize: CGSize(width: 1280, height: 720), bitRate: 2_000_000, profileLevel: kVTProfileLevel_H264_High_AutoLevel as String ) rtmpStream.audioSettings = AudioCodecSettings(bitRate: 128_000) // Attach camera let camera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) try rtmpStream.attachCamera(camera) try rtmpStream.attachAudio(AVCaptureDevice.default(for: .audio)) // Preview let hkView = MTHKView(frame: previewView.bounds) hkView.videoGravity = .resizeAspectFill rtmpStream.addOutput(hkView) previewView.addSubview(hkView) // Start rtmpConnection.connect("rtmp://live.example.com/live") rtmpStream.publish("stream_key") Reconnection on drop: subscribe to RTMPConnection.Event.rtmpStatus, on code == RTMPStatusCode.connectClosed — reconnectDelay(3) and repeat connect(). HaishinKit has a built-in reconnect mechanism.
Monitoring: rtmpStream.info.byteCount and RTMPStream.currentFPS — watch actual FPS. If it falls below 20, it's a sign of poor connection.
Android: rtmp-rtsp-stream-client-java
Library by Pedro Vicente. Supports Camera1, Camera2, CameraX, Screen capture. Hardware encoding via MediaCodec.
val rtmpCamera = RtmpCamera2(binding.surfaceView, object : ConnectCheckerRtmp { override fun onConnectionSuccessRtmp() { /* update UI */ } override fun onConnectionFailedRtmp(reason: String) { rtmpCamera.stopStream() retryConnection() } override fun onDisconnectRtmp() { retryConnection() } override fun onAuthErrorRtmp() { /* show error */ } override fun onAuthSuccessRtmp() {} override fun onNewBitrateRtmp(bitrate: Long) { updateBitrateUI(bitrate) } }) // Prepare (resolution, bitrate, FPS, audio) rtmpCamera.prepareVideo(1280, 720, 30, 2_000_000) && rtmpCamera.prepareAudio(128_000, 44100, true) rtmpCamera.startStream("rtmp://live.example.com/live/stream_key") RtmpCamera2 accepts SurfaceView or TextureView. For Jetpack Compose: AndroidView { RtmpCamera2(context, ...) }.
Bitrate adaptation: rtmpCamera.setVideoBitrateOnFly(newBitrate) — change bitrate without restarting the stream.
Library comparison:
| Parameter | iOS (HaishinKit) | Android (rtmp-rtsp-stream-client-java) |
|---|---|---|
| Language | Swift | Kotlin/Java |
| Encoding | VideoToolbox | MediaCodec |
| TLS | rtmps | RtmpsCamera2 |
| Bitrate adaptation | Parameter settings | setVideoBitrateOnFly |
| Reconnect | Built-in | Manual handling |
How we do it: stack and configuration
We use the described libraries with additional adaptive bitrate configuration. On iOS, we monitor CPU load and reduce bitrate by 25% if FPS drops below 20. On Android, we use onNewBitrateRtmp for dynamic adjustment. Traffic savings up to 40% without quality loss. For authentication, we use stream key in URL or RTMP auth. We support rtmps for YouTube Live.
Our engineers tune encoding parameters for specific scenarios: for screen streaming — lower bitrate, for camera — higher. We guarantee stable operation on devices with iOS 15+ and Android 10+. Contact us to evaluate your project.
Work process
- Analytics — select protocol (RTMP/WebRTC), server, platform. Define latency and quality requirements.
- Design — architecture of streaming module, background mode handling, reconnection, monitoring.
- Implementation — integrate library, configure encoding, test on real devices.
- Testing — check latency, video quality, behavior during network drops, publish to TestFlight/Google Play.
- Deployment — prepare for release, documentation, support.
What is included
- RTMP streaming integration on iOS and/or Android
- Hardware encoding and adaptive bitrate setup
- Reconnection and error handling implementation
- TLS (rtmps) support
- Documentation for server and streaming platform configuration
- Assistance with App Store and Google Play review (background mode and privacy requirements)
- Compatibility guarantee with latest OS versions
Why choose us
We have been in mobile development for over 5 years and have completed more than 50 video projects. Our developers are certified for iOS and Android. We guarantee code quality and adherence to deadlines. Experience with RTMP streaming integrations allows us to avoid typical mistakes and deliver projects on time.
If you need RTMP streaming in your mobile app, contact us for a project evaluation. We will calculate the cost and timeline individually. Order a turnkey RTMP streaming integration and get a ready module in 2-3 days.







