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

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: pauseStream

    Note: This pauses playback, not streaming.

  • โ–ถ๏ธ Resume stream playback: resumeStream

    Note: This resumes playback, not streaming.

  • ๐ŸŽš๏ธ Set audio bitrate: setAudioSettings
  • ๐ŸŽž๏ธ Set video settings: setVideoSettings (optional expectedFrameRate, 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: setFilter

    Filter type values 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 next prepare path). 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, before startVideoStreaming (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 includes rttMicros (microseconds) and bytesSend (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.isMultitaskingCameraAccessEnabled so 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.

Libraries

camera