Как выбрать и настроить видеоплеер в 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 |
Настройка воспроизведения — пошагово
- Создайте Multi-Device FMX проект (File → New → Multi-Device Application).
- В Project Options укажите Android SDK API 23+ и минимальный API, который вам нужен.
- Добавьте на форму TMediaPlayer и TMediaPlayerControl (или TMediaPlayer и привяжите к нему контрол):
- В OnCreate: MediaPlayer1.Media := TMedia.FromFile('assets\video.mp4'); или используйте URL.
- Для URL-потока: MediaPlayer1.FileName := 'https://your.server/stream.m3u8';
- Управление воспроизведением:
- Play: MediaPlayer1.Play;
- Pause: MediaPlayer1.Pause;
- Stop: MediaPlayer1.Stop;
- Обновление 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;
- Подгонка под экран: MediaPlayer1.Display.Stretch := TStretchMode.ScaleToFit (или ScaleToFill по задаче).
- Разрешения и манифест:
- Добавьте 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.