rtmp_stream
๐ Overview
rtmp_stream is a Flutter plugin designed to provide unified RTMP streaming and video recording capabilities for Android and iOS.
It addresses the lack of suitable Flutter RTMP plugins on pub.dev: existing plugins are either no longer maintained or rely on outdated dependencies, making them unsuitable for modern mobile applications.
โ๏ธ Technical Foundation
- Android: Based on
com.github.pedroSG94.RootEncoder:library:2.7.1 - iOS: Based on HaishinKit 2.2.5
By leveraging these mature libraries, rtmp_stream provides a consistent cross-platform API interface, reducing development complexity.
โ Why This Plugin
- No suitable Flutter RTMP plugin exists on pub.dev.
- Existing plugins suffer from:
- Long-term lack of maintenance.
- Outdated dependencies, incompatible with the latest Flutter and platform SDKs.
Therefore, the goal of rtmp_stream is to deliver a modern, stable, and maintainable RTMP streaming solution.
๐ ๏ธ Supported Methods
๐ Common Methods (Android & iOS)
- ๐ท Get available cameras:
availableCameras - โ๏ธ Initialize plugin:
initialize - ๐ฅ Start local video recording:
startVideoRecording - โน๏ธ Stop local video recording:
stopRecording - ๐ก Start recording and streaming:
startVideoRecordingAndStreaming - โน๏ธ Stop recording or streaming:
stopRecordingOrStreaming - ๐ก Start video streaming:
startVideoStreaming - โน๏ธ Stop video streaming:
stopStreaming - ๐ Switch camera:
switchCamera - ๐ Toggle audio on/off:
switchAudio - ๐ก Toggle flashlight on/off:
switchFlashLight - ๐ Get stream statistics:
getStreamStatistics - ๐๏ธ Dispose plugin:
dispose - ๐ธ Take snapshot during streaming:
takePicture
๐ iOS Exclusive Methods
Since HaishinKit supports not only streaming but also RTMP playback, iOS provides additional features:
- โธ๏ธ Pause stream playback:
pauseStreamNote: This pauses playback, not streaming.
- โถ๏ธ Resume stream playback:
resumeStreamNote: This resumes playback, not streaming.
- ๐๏ธ Set audio bitrate:
setAudioSettings - ๐๏ธ Set video settings:
setVideoSettings(optionalexpectedFrameRate,bitRateModeโ HaishinKit 2.2.1+ / 2.2.2+) - ๐ฑ Multitasking camera access:
setMultitaskingCameraAccessEnabled(HaishinKit 2.2.5+, iOS 17+ when supported) - ๐ Get temporary mute status:
getHasAudio - ๐ Set temporary mute:
setHasAudio - ๐ฅ Get temporary video stop status:
getHasVideo - ๐ฅ Set temporary video stop:
setHasVideo - ๐ฌ Set streaming frame rate:
setFrameRate - โ๏ธ Set session preset:
setSessionPreset - ๐ผ๏ธ Set screen dimensions:
setScreenSettings
๐ค Android Exclusive Methods
Android provides additional features during live streaming:
- โธ๏ธ Pause recording:
pauseVideoRecording - โถ๏ธ Resume recording:
resumeVideoRecording - ๐จ Apply filter:
setFilterFilter
typevalues correspond to filters defined in source code:
CameraNativeView.kt - โ Remove filter:
removeFilter - ๐จ BT.709 encoding hint:
setForceBt709Color(RootEncoder 2.7.0+) - ๐ถ RTMP ping / RTT:
setRtmpShouldSendPings(RootEncoder 2.7.0+)
๐ Extended API usage (platform-specific)
Android: setForceBt709Color(bool enabled)
- What it does: Tells the video encoder to use a BT.709 color matrix for encoded video, which can align colors with players or servers that expect BT.709 for HD content.
- When to call: After
initialize, before starting recording or streaming (or before the nextpreparepath). The plugin applies the flag when preparing video for record/stream. - Example:
await controller.setForceBt709Color(true);
await controller.startVideoStreaming(url);
Android: setRtmpShouldSendPings(bool enabled)
- What it does: Enables RTMP ping commands so the server can respond with pong; the client can derive round-trip time (RTT).
- When to call: After
initialize, beforestartVideoStreaming(or combined record+stream). Must be set before connect. - Related: Use
getStreamStatistics()while streaming; when pings are enabled and the server supports them, the map includesrttMicros(microseconds) andbytesSend(where supported). - Example:
await controller.setRtmpShouldSendPings(true);
await controller.startVideoStreaming(url);
// later, while streaming:
final stats = await controller.getStreamStatistics();
// stats.rttMicros, stats.bytesSend, ...
iOS: setVideoSettings({ ... })
Existing parameters: bitrate, width, height, frameInterval, profileLevel (iOS only).
HaishinKit 2.2.1+ / 2.2.2+ extensions (optional named parameters):
| Parameter | Type | Meaning |
|---|---|---|
expectedFrameRate |
double? |
Encoder hint; also appears in RTMP onMetaData as framerate (2.2.2+). |
bitRateMode |
String? |
"average" (default behavior), "constant" (iOS 16+), "variable" (iOS 26+ / VideoToolbox VBR). |
- When to call: After
initialize, typically before or early during streaming; follow HaishinKit guidance for changing settings while live. - Example:
await controller.setVideoSettings(
expectedFrameRate: 30,
bitRateMode: 'average',
);
iOS: setMultitaskingCameraAccessEnabled(bool enabled)
- What it does: When supported, sets
AVCaptureSession.isMultitaskingCameraAccessEnabledso capture can continue in multitasking / split-screen / PiP-style scenarios (HaishinKit 2.2.5+). - Requirements: iOS 17+ for the underlying configuration API; device must report
isMultitaskingCameraAccessSupported. - When to call: After
initialize, before starting streaming (same session as preview). - Example:
await controller.setMultitaskingCameraAccessEnabled(true);
await controller.startVideoStreaming(url);
๐ Conclusion
rtmp_stream provides Flutter developers with a cross-platform, modern RTMP streaming and video recording plugin, addressing the shortcomings of the current ecosystem.
It is built on Androidโs RootEncoder and iOSโs HaishinKit, offering a unified API while extending playback and audio/video controls on iOS, and snapshot and filter features on Androidโhelping developers quickly build live streaming and recording applications.