Flutter live streaming plugin
aibuds_live_stream_flutter नेटिव AIBudsLiveStream मिडलवेयर को Flutter से जोड़ता है। यह प्लेबैक के लिए iOS प्लेटफ़ॉर्म व्यू और RTSP इनपुट या ऐप से मिले JPEG फ़्रेम व PCM ऑडियो को RTMP गंतव्य पर भेजने के लिए अलग कंट्रोलर देता है।
यह पेज Flutter/native ownership समझाता है। Device capability checks, hotspot setup और RTSP URL प्राप्त करने का तरीका RTSP Live Streaming में है।
Device stream और Flutter consumers
एक device RTSP session ऐसा address देता है जिसे एक host lifecycle owner के तहत native preview, optional relay या दोनों उपयोग कर सकते हैं।
RTSP session शुरू करें
Capability और hotspot coordination पूरा करें।
RTSP URL पाएँ
इस session का authoritative address सुरक्षित रखें।
Native player
Playback commands देने से पहले controller attach करें।
Preview दिखाएँ
Native events को mounted presentation state में map करें।
RTMP relay
अलग owned streamer lifecycle से publish करें।
- RTSP session शुरू करेंcontinues toRTSP URL पाएँ
- RTSP URL पाएँpreviewNative player
- Native playercontinues toPreview दिखाएँ
- RTSP URL पाएँoptional relayRTMP relay
Platform और packaging की सीमा
- iOS supported है; Android implemented नहीं है।
- Dart 3.3+, Flutter 3.19+ और iOS 15.0+ आवश्यक हैं।
- Plugin
AIBudsLiveStreamFlutterPlugin.xcframeworkwrap करता है औरAIBudsSDK/LiveStreamपर depend करता है। - RTSP और RTMP को physical iOS device पर validate करें।
Supplied XCFrameworks और resources को plugin target के iOS packaging flow में रखें। Runner target में conflicting copies जोड़ने के बजाय linkage वहीं resolve करें।
Runtime architecture
एक प्लेयर कंट्रोलर, एक नेटिव प्लेटफ़ॉर्म व्यू को नियंत्रित करता है। AIBudsLiveStreamPlayerView बनने और जुड़ने तक कमांड उपलब्ध नहीं होतीं। स्ट्रीमर कंट्रोलर के नेटिव रिले का जीवनचक्र अलग होता है।
View, events और controller साथ manage करें
class LivePreviewState extends State<LivePreview> {
final player = AIBudsLiveStreamPlayerController();
StreamSubscription<AIBudsLiveStreamPlayerEvent>? events;
@override
void initState() {
super.initState();
events = player.events.listen((event) {
if (!mounted) return;
setState(() { /* map native event to presentation state */ });
});
}
@override
Widget build(BuildContext context) => AIBudsLiveStreamPlayerView(
controller: player,
options: const AIBudsLiveStreamPlayerOptions(
format: AIBudsLiveStreamFormat.rtsp,
gravityMode: AIBudsLiveStreamGravityMode.resizeAspect,
),
);
@override
void dispose() {
events?.cancel();
player.disposePlayer();
super.dispose();
}
}प्लेटफ़ॉर्म व्यू और डिवाइस का RTSP URL, दोनों तैयार होने दें; इनमें से कोई भी पहले मिल सकता है। एक कंट्रोलर को एक ही समय पर कई माउंट किए गए व्यू में दोबारा उपयोग न करें।
Device और player state अलग रखें
LiveStreamingAPI डिवाइस और हॉटस्पॉट सेशन संभालता है। Flutter प्लेयर नेटिव रेंडरिंग संभालता है। प्लेयर की सफलता से डिवाइस सेशन के सही होने की पुष्टि नहीं होती और डिवाइस सेशन शुरू होने का अर्थ यह नहीं कि फ़्रेम रेंडर हो चुका है। डिवाइस सेशन, नेटवर्क रूट, प्लेयर और UI स्थिति को अलग-अलग ट्रैक करें।
Stop या page छोड़ते समय नए actions रोकें, player/streamer और device session बंद करें, Dart subscriptions cancel करें, native controllers dispose करें और retained URL clear करें। एक side interruption से पहले ही बंद हो तो भी cleanup सुरक्षित रहे।
RTMP प्रसारण
AIBudsLiveStreamStreamerController को independent operational feature मानें:
- गंतव्य के लिए अनुमति की जाँच कॉलबैक के बाहर करें;
- शुरू करने से पहले events subscribe करें;
- Target network के अनुसार bitrate, dimensions, frame rate, audio, timeout, adaptive bitrate और reconnect policy चुनें;
- Preview success से publication success का अनुमान न लगाएँ;
- डिवाइस सेशन समाप्त होने पर स्ट्रीमर को रोककर रिलीज़ करें;
- प्रसारण के क्रेडेंशियल को Dart सोर्स या डायग्नोस्टिक जानकारी में शामिल न करें।
मीडिया स्रोत के अनुसार कंट्रोलर मोड चुनें। RTSP रिले इनपुट URL का उपयोग करता है, जबकि सीधे इनपुट वाला प्रसारण ऐप से JPEG फ़्रेम और PCM S16LE ऑडियो लेता है। सीधे इनपुट के लिए सैंपल रेट और चैनलों की संख्या को डिकोड किए गए PCM स्रोत के अनुरूप रखें। मीडिया भेजने से पहले स्ट्रीमर के तैयार होने की प्रतीक्षा करें और ऑडियो प्रसारण बंद होने पर ऑडियो न भेजें।
प्रीव्यू और रिले एक ही RTSP स्रोत का उपयोग करते हों, तो सबसे कम क्षमता वाले समर्थित डिवाइस पर संसाधन उपयोग और दोबारा कनेक्ट होने के व्यवहार की जाँच करें।
Performance और recovery
- सामान्य status changes पर platform view rebuild न करें।
setStateसे पहले high-frequency events throttle करें।- Backgrounding, hotspot loss, disconnect और view disposal को अलग interruptions मानें।
- Automatic reconnect सीमित रखें और user-controlled retry दें।
- पुराना session authoritative न रहे तो पूरी device-to-player pipeline फिर बनाएँ।
समस्या निवारण
| समस्या | संभावित कारण |
|---|---|
| Playback से पहले command fail होती है | Platform view अभी attach नहीं हुआ। |
| Non-iOS placeholder | Plugin अभी केवल iOS implement करता है। |
| URL है पर video नहीं | Player events, hotspot route और physical-device reachability जाँचें। |
| RTMP destination पर stream नहीं | Streamer events को preview state से अलग diagnose करें। |
| Page छोड़ने के बाद events आते हैं | Subscription cancel करें और native controller dispose करें। |
| Duplicate symbols | Conflicting native dependency copies हटाएँ। |