Плагин трансляций для Flutter
aibuds_live_stream_flutter подключает нативный middleware AIBudsLiveStream к Flutter. Плагин предоставляет iOS platform view для воспроизведения и отдельный контроллер ретрансляции RTSP в RTMP.
Здесь рассматривается распределение ответственности между Flutter и нативным кодом. Проверка возможностей устройства, настройка точки доступа и получение RTSP URL описаны в разделе «RTSP-трансляция».
Поток устройства и потребители Flutter
Одна RTSP-сессия устройства создаёт адрес для нативного предпросмотра, необязательной ретрансляции или обоих вариантов под управлением одного владельца.
Запустить RTSP-сессию
Проверить возможности и настроить точку доступа.
Получить RTSP URL
Сохранить действительный адрес этой сессии.
Нативный плеер
Подключить контроллер до отправки команд воспроизведения.
Показать предпросмотр
Преобразовать нативные события в состояние подключённого представления.
RTMP-ретрансляция
Публиковать через отдельно управляемый жизненный цикл стримера.
- Запустить RTSP-сессиюcontinues toПолучить RTSP URL
- Получить RTSP URLпредпросмотрНативный плеер
- Нативный плеерcontinues toПоказать предпросмотр
- Получить RTSP URLретрансляцияRTMP-ретрансляция
Платформа и упаковка
- Поддерживается iOS; Android не реализован.
- Требуются Dart 3.3+, Flutter 3.19+ и iOS 13+.
- Плагин оборачивает
AIBudsLiveStreamFlutterPlugin.xcframeworkи зависит отAIBudsSDK/LiveStream. - Проверяйте RTSP и RTMP на реальном iOS-устройстве.
Включайте предоставленные XCFramework и ресурсы в процесс упаковки iOS-цели плагина. Настраивайте компоновку там, не добавляя конфликтующие копии в цель Runner.
Архитектура выполнения
Один контроллер плеера соответствует одному нативному platform view. Команды недоступны до создания и подключения AIBudsLiveStreamPlayerView. Контроллер стримера управляет отдельным нативным жизненным циклом ретрансляции.
Управляйте представлением, событиями и контроллером вместе
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 view и RTSP URL устройства; они могут поступить в любом порядке. Не используйте один контроллер для нескольких одновременно подключённых представлений.
Разделяйте состояния устройства и плеера
LiveStreamingAPI управляет сессией устройства и точки доступа, а Flutter-плеер — нативным рендерингом. Успех плеера не подтверждает состояние сессии устройства, а запуск устройства — появление кадра. Отслеживайте сессию, сетевой маршрут, плеер и интерфейс отдельно.
При остановке или уходе с экрана запретите новые действия, остановите плеер/стример и сессию устройства, отмените подписки Dart, освободите нативные контроллеры и удалите URL. Очистка должна быть безопасной, даже если одна сторона уже остановлена прерыванием.
Ретрансляция RTSP в RTMP
Считайте AIBudsLiveStreamStreamerController самостоятельной служебной функцией:
- проверяйте авторизацию назначения вне пути callback;
- подпишитесь на события до запуска;
- настройте битрейт, размеры, частоту кадров, аудио, тайм-аут, адаптивный битрейт и повторное подключение под целевую сеть;
- не определяйте успех публикации по успеху предпросмотра;
- остановите и освободите стример после завершения сессии устройства;
- не встраивайте учётные данные публикации в исходный код Dart или диагностику.
Если предпросмотр и ретрансляция используют один RTSP-источник, проверяйте ресурсы и переподключение на самом слабом поддерживаемом устройстве.
Производительность и восстановление
- Не перестраивайте platform view при обычных изменениях состояния.
- Ограничивайте частоту событий до вызова
setState. - Обрабатывайте переход в фон, потерю точки доступа, отключение и освобождение представления как разные прерывания.
- Ограничьте автоматические переподключения и предоставьте пользователю повтор.
- Пересоздавайте весь канал от устройства к плееру, когда старая сессия больше не актуальна.
Устранение неполадок
| Проявление | Вероятная граница |
|---|---|
| Команда завершается ошибкой до воспроизведения | Platform view ещё не подключён. |
| Заглушка не-iOS | Сейчас плагин реализован только для iOS. |
| URL есть, но видео нет | Проверьте события плеера, маршрут точки доступа и доступность реального устройства. |
| RTMP не получает поток | Диагностируйте события стримера независимо от предпросмотра. |
| События продолжаются после ухода с экрана | Отмените подписку и освободите нативный контроллер. |
| Дублирующиеся символы | Удалите конфликтующие копии нативных зависимостей. |