Перейти к основному содержимому

Плагин трансляций для Flutter

aibuds_live_stream_flutter подключает нативный middleware AIBudsLiveStream к Flutter. Плагин предоставляет iOS platform view для воспроизведения и отдельный контроллер ретрансляции RTSP в RTMP.

Здесь рассматривается распределение ответственности между Flutter и нативным кодом. Проверка возможностей устройства, настройка точки доступа и получение RTSP URL описаны в разделе «RTSP-трансляция».

Animated flow map

Поток устройства и потребители Flutter

Одна RTSP-сессия устройства создаёт адрес для нативного предпросмотра, необязательной ретрансляции или обоих вариантов под управлением одного владельца.

Сессия устройства

Запустить RTSP-сессию

Проверить возможности и настроить точку доступа.

Общий вход

Получить RTSP URL

Сохранить действительный адрес этой сессии.

Platform view

Нативный плеер

Подключить контроллер до отправки команд воспроизведения.

Интерфейс Flutter

Показать предпросмотр

Преобразовать нативные события в состояние подключённого представления.

Необязательная ветвь

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. Контроллер стримера управляет отдельным нативным жизненным циклом ретрансляции.

Управляйте представлением, событиями и контроллером вместе

DART
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 не получает потокДиагностируйте события стримера независимо от предпросмотра.
События продолжаются после ухода с экранаОтмените подписку и освободите нативный контроллер.
Дублирующиеся символыУдалите конфликтующие копии нативных зависимостей.