Flutter Canlı Yayın Eklentisi
aibuds_live_stream_flutter, yerel AIBudsLiveStream ara katmanını Flutter'a bağlar. Oynatma için iOS platform görünümü ve RTSP girişini RTMP hedefine aktarmak için ayrı bir denetleyici sunar.
Bu sayfa Flutter ve yerel taraf arasındaki sahipliği açıklar. Aygıt yeteneği kontrolleri, erişim noktası kurulumu ve RTSP URL'sinin alınması RTSP Canlı Yayın sayfasında anlatılır.
Device stream and Flutter consumers
One device RTSP session produces an address that can feed native preview, optional relay, or both under one host lifecycle owner.
Start RTSP Session
Complete capability and hotspot coordination.
Receive RTSP URL
Retain the authoritative address for this session.
Native Player
Attach the controller before issuing playback commands.
Render Preview
Map native events into mounted presentation state.
RTMP Relay
Publish through a separately owned streamer lifecycle.
- Start RTSP Sessioncontinues toReceive RTSP URL
- Receive RTSP URLpreviewNative Player
- Native Playercontinues toRender Preview
- Receive RTSP URLoptional relayRTMP Relay
Platform ve Paketleme Sınırı
- iOS desteklenir; Android henüz uygulanmamıştır.
- Dart 3.3+, Flutter 3.19+ ve iOS 13+ gerekir.
- Eklenti
AIBudsLiveStreamFlutterPlugin.xcframeworkpaketini sarar veAIBudsSDK/LiveStreambağımlılığını kullanır. - RTSP ve RTMP'yi fiziksel bir iOS aygıtında doğrulayın.
Sağlanan XCFramework'leri ve kaynakları eklenti hedefinin iOS paketleme akışında tutun. Runner hedefine çakışan kopyalar eklemek yerine bağlantı sorunlarını burada çözün.
Çalışma Zamanı Mimarisi
Bir oynatıcı denetleyicisi tek bir yerel platform görünümünü temsil eder. AIBudsLiveStreamPlayerView oluşturulup bağlanana kadar komutlar kullanılamaz. Yayıncı denetleyicisi ayrı bir yerel aktarma yaşam döngüsüne sahiptir.
Görünümü, Olayları ve Denetleyiciyi Birlikte Yönetin
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();
}
}Platform görünümü ile aygıt RTSP URL'sinin ikisi de hazır olana kadar bekleyin; herhangi biri önce gelebilir. Aynı anda bağlı birden fazla görünümde tek denetleyiciyi yeniden kullanmayın.
Aygıt ve Oynatıcı Durumunu Ayırın
LiveStreamingAPI aygıt/erişim noktası oturumunu, Flutter oynatıcısı ise yerel görüntülemeyi yönetir. Oynatıcının başarısı aygıt oturumunun sağlıklı olduğunu; aygıtın başlaması da bir karenin görüntülendiğini kanıtlamaz. Aygıt oturumunu, ağ rotasını, oynatıcıyı ve arayüz durumunu ayrı izleyin.
Durdururken veya sayfadan ayrılırken yeni işlemleri engelleyin; oynatıcıyı/yayıncıyı ve aygıt oturumunu durdurun, Dart aboneliklerini iptal edin, yerel denetleyicileri serbest bırakın ve saklanan URL'yi temizleyin. Bir kesinti taraflardan birini önceden durdurmuş olsa da temizleme güvenli olmalıdır.
RTSP'den RTMP'ye Aktarma
AIBudsLiveStreamStreamerController öğesini bağımsız bir işletim özelliği olarak yönetin:
- hedef yetkilendirmesini geri çağrı yolunun dışında doğrulayın;
- başlatmadan önce olaylara abone olun;
- hedef ağa uygun bit hızı, boyut, kare hızı, ses, zaman aşımı, uyarlanabilir bit hızı ve yeniden bağlanma politikasını seçin;
- önizlemenin başarısından yayın başarısını çıkarsamayın;
- aygıt oturumu bittiğinde yayıncıyı durdurup serbest bırakın;
- yayın kimlik bilgilerini Dart kaynağına veya tanılama verilerine asla gömmeyin.
Önizleme ve aktarma aynı RTSP kaynağını paylaşıyorsa kaynak kullanımını ve yeniden bağlanma davranışını desteklenen en düşük aygıtta test edin.
Performans ve Kurtarma
- Sıradan durum değişikliklerinde platform görünümünü yeniden oluşturmayın.
setStateöncesinde yüksek frekanslı olayları sınırlayın.- Arka plana geçişi, erişim noktası kaybını, bağlantı kopmasını ve görünümün serbest bırakılmasını ayrı kesintiler olarak ele alın.
- Otomatik yeniden bağlanmayı sınırlandırın ve kullanıcı denetimli yeniden deneme sunun.
- Eski oturum artık geçerli değilse aygıttan oynatıcıya uzanan hattın tamamını yeniden oluşturun.
Sorun Giderme
| Belirti | Olası sınır |
|---|---|
| Komut oynatma öncesinde başarısız | Platform görünümü henüz bağlanmamış. |
| iOS dışı yer tutucu | Eklenti şu anda yalnızca iOS'u uygular. |
| URL var ancak video yok | Oynatıcı olaylarını, erişim noktası rotasını ve fiziksel aygıt erişimini inceleyin. |
| RTMP hedefinde veri yok | Yayıncı olaylarını önizleme durumundan bağımsız inceleyin. |
| Sayfadan ayrılınca olaylar sürüyor | Aboneliği iptal edin ve yerel denetleyiciyi serbest bırakın. |
| Yinelenen semboller | Çakışan yerel bağımlılık kopyalarını kaldırın. |