Воспроизведение видео в веб-приложении Flutter
Чтобы воспроизводить видео на iOS или Android с помощью Flutter, большинство людей обратятся к пакету video_player.
К сожалению, этот пакет еще не полностью поддерживается на веб-платформе.
До 10 декабря 2019 года метод, представленный в этой статье, был одним из немногих способов воспроизведения видео в веб-приложении Flutter. На Flutter Interact 2019 веб-поддержка нескольких пакетов, включая пакет video_player_web. Представленные ниже варианты по-прежнему работают и могут быть лучше в вашем случае использования.
Мы рассмотрим решение, которое позволит нам воспроизводить видео за 3 простых шага:
1. Нам необходимо отредактировать файл шаблона index.html по умолчанию, который находится в папке web. С этими изменениями мы загружаем Видеопроигрыватель Afterglow Video Player и устанавливаем триггер, HTML-элемент a и HTML-элемент видео, который будет действовать как заполнитель для видео, которое мы хотим воспроизвести.
Вот как будет выглядеть наш index.html:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Web Video Player</title> <script src="https://cdn.jsdelivr.net/npm/[email protected]"></script></head> <body> <script src="main.dart.js" type="application/javascript"></script> <a id="triggerVideoPlayer" class="afterglow" href="#videoPlayer"></a> <video id="videoPlayer" width="960" height="540" data-skin="dark"> </video> </body> </html>
2. Затем мы пишем функцию Dart с именем playVideo, которая будет взаимодействовать со страницей index.html, используя пакет universal_html, и передавать URL-адрес видео, которое мы хотим воспроизвести:
import 'package:flutter/foundation.dart'; import 'package:universal_html/html.dart' as html; void playVideo(String atUrl) { if(kIsWeb) { final v = html.window.document.getElementById('videoPlayer'); if(v != null) { v.setInnerHtml( '<source type="video/mp4" src="$atUrl">', validator: html.NodeValidatorBuilder() ..allowElement('source', attributes: ['src', 'type'])); final a = html.window.document.getElementById( 'triggerVideoPlayer' ); if(a != null) { a.dispatchEvent(html.MouseEvent('click')); } } } else { // we're not on the web platform // and should use the video_player package } }
Код берет ссылку на элемент videoPlayer и, если он существует, устанавливает свой внутренний HTML-код для размещения URL-адреса видео, который мы передали с помощью параметра atUrl. Затем мы получаем ссылку на элемент triggerVideoPlayer и запускаем щелчок мышью.
3. Видео будет воспроизводиться как наложение поверх всего приложения Flutter. Плеер реагирует и предлагает элементы управления для воспроизведения, паузы, громкости, прокрутки, полноэкранного режима , а также показывает информацию о воспроизведении.
playVideo('http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4');
Если вам нужно воспроизводить видео в портретной (или в портретной ориентации), вы можете поменять местами ширину на высоту на шаге 1 или сделать это динамически. это путем изменения функции playVideo.
Плеер Afterglow можно дополнительно настроить. Он также может воспроизводить видео YouTube или Vimeo, просто отправив идентификатор видео в качестве параметра немного измененному методу на шаге 2.
import 'package:flutter/foundation.dart'; import 'package:universal_html/html.dart' as html; void playHostedVideo(String withId, [bool isVimeo=false]) { if(kIsWeb) { final v = html.window.document.getElementById('videoPlayer'); if(v != null) { if(isVimeo) {v.setAttribute("
data-vimeo-id", withId);
} else {v.setAttribute("data-youtube-id", withId); }
final a = html.window.document.getElementById( 'triggerVideoPlayer' ); if(a != null) { a.dispatchEvent(html.MouseEvent('click')); } } } else { // we're not on the web platform // and should use the video_player package } }
И шаг 3 становится:
// for playing YouTube video playHostedVideo('aqz-KE-bpKQ'); // or for playing Vimeo video playHostedVideo('1084537', true);
В качестве нижнего примечания, любой видеоплеер HTML / JS можно использовать таким образом. Я выбрал Afterglow после того, как использовал его в недавнем проекте, и мне понравилась его простота и тот факт, что он легкий.
Если вас интересует воспроизведение только аудио, вы можете проверить это:
Это все!