Как выбрать и настроить видеоплеер в Delphi для Android

Короткий ответ: для простых задач используйте TMediaPlayer + TMediaPlayerControl; для потокового HLS/DASH — FMX-компоненты с поддержкой потоков (TVideo или сторонние пакеты); для максимальной производительности и 4K/HDR интегрируйте ExoPlayer через JNI.

Выбор компонентов и когда их использовать

  • TMediaPlayer + TMediaPlayerControl — стандартный путь: быстро настраивается, работает «из коробки» на Android, подходит для локальных MP4/MP3 и простых потоков.
  • TVideo / специализированные FMX-модули — удобнее для HLS/M3U8 и плейлистов, обычно дают больше контроля над буферизацией.
  • Коммерческие UI-пакеты (например, расширенные FMX-киты) — если нужен готовый интерфейс с субтитрами и плейлистами.
  • ExoPlayer (через JNI) — для профессиональных задач: стабильный HLS/DASH, HDR, 60 FPS и кастомная обработка декодирования.

Тестируйте видео всегда на реальном устройстве — эмулятор FMX часто не отражает аппаратного ускорения и даёт искаженную картину производительности.

Сравнение компонентов

КомпонентПлюсыМинусыКогда использовать
TMediaPlayer + TMediaPlayerControlЛёгкая интеграция, поддержка FMXОграниченный UI и субтитрыБыстрые прототипы, локальные файлы
TVideo / FMX потоковыеЛучшая поддержка HLS/плейлистовМеньше контролируемых настроекОнлайн-видео, стриминг
ExoPlayer (через JNI)Высокая производительность, расширенные форматыСложнее интегрироватьПрофессиональные плееры, 4K/HDR

Настройка воспроизведения — пошагово

  1. Создайте Multi-Device FMX проект (File → New → Multi-Device Application).
  2. В Project Options укажите Android SDK API 23+ и минимальный API, который вам нужен.
  3. Добавьте на форму TMediaPlayer и TMediaPlayerControl (или TMediaPlayer и привяжите к нему контрол):
    • В OnCreate: MediaPlayer1.Media := TMedia.FromFile('assets\video.mp4'); или используйте URL.
    • Для URL-потока: MediaPlayer1.FileName := 'https://your.server/stream.m3u8';
  4. Управление воспроизведением:
    • Play: MediaPlayer1.Play;
    • Pause: MediaPlayer1.Pause;
    • Stop: MediaPlayer1.Stop;
  5. Обновление UI по событиям:
    • OnStatusChange — проверяйте mpPlaying/mpStopped и включайте/выключайте кнопки.
    • Duration доступен через MediaPlayer1.Duration; используйте его для TrackBar.Max.
    • Пример прогресса:
procedure TForm1.MediaPlayer1StatusChange(Sender: TObject; Status: TMediaStatus);
begin
  if Status = mpPlaying then
    TrackBar1.Max := MediaPlayer1.Duration.AsInteger;
end;
  1. Подгонка под экран: MediaPlayer1.Display.Stretch := TStretchMode.ScaleToFit (или ScaleToFill по задаче).
  2. Разрешения и манифест:
    • Добавьте android.permission.INTERNET если воспроизводите с сети.
    • Убедитесь, что Info.plist/AndroidManifest содержит нужные настройки безопасности для HTTPS потоков.

Продвинутая интеграция: ExoPlayer через JNI

  • Когда FMX не даёт нужной производительности, создайте Java-класс, оборачивающий ExoPlayer (инициализация, управление, Surface).
  • Скомпилируйте Java-класс в .jar/.aar и подключите в проект (RAD Studio tools / deployment).
  • В Delphi вызывайте методы через Androidapi.JNI.* и TAndroidHelper.Context, передавая Surface с SurfaceView/SurfaceTexture.
  • Это даёт контроль над декодированием, аппаратным ускорением и продвинутой буферизацией, но требует опыта работы с JNI и lifecycle Android.

Частые ошибки

  • Черный экран: проверьте, отображается ли Surface/SurfaceView, и обновляйте контекст рендеринга в OnResize.
  • Лаги/стоттеры: используйте асинхронную подготовку плеера и уменьшите общее использование UI-потоков; тестируйте разные битрейты.
  • Отсутствие звука: убедитесь в правильной маршрутизации аудиовыхода и правах.
  • Большой размер APK: исключите ненужные библиотеки при деплое и используйте ProGuard/сжатие.

FAQ

  • Нужно ли использовать ExoPlayer всегда? Нет — ExoPlayer оправдан, если вы требуете стабильный стриминг, многопоточное декодирование или 4K/HDR. Для большинства простых задач достаточно TMediaPlayer.
  • Как проверить поддержку HLS? На Android нативная платформа обычно поддерживает HLS; для лучшей совместимости тестируйте на целевых устройствах и используйте adaptive streams.
  • Как отладить проблемы на устройстве? Включите логирование (Log.d) в Java-слое или используйте Debug и Device Log в RAD Studio; сравните поведение на нескольких API-уровнях.

Используя сочетание правильного компонента и простых настроек (корректные права, проверка Surface, обработка статусов), вы получите стабильный плеер в Delphi для Android.