Проблема воспроизведения видео и его адаптация под iPhone и iPad. HTML5

от автора

Недавно, в процессе реализации одного из модулей проекта, над которым я работаю — возникла проблема воспроизведения видео на web странице, а также возникли проблемы с его адаптацией под iPhone и iPad.

Проблема была в следующем:

Создал веб-страницу HTML5, на которой есть небольшое видео, создал свою control-panel  для плейера, и все отлично работает в Chrome и FireFox, но совсем не работает ни на iPhone, ни на iPad. Получаю просто пустую страницу.

Реализация была следующей:

<div>    <div data-tag="loader"> </div>    <video preload="none" loop playsinline="false" muted="true" data-tag="player"  src="" type="video/mp4"></video>     <div type="button" data-tag="playMobile" </div>     <div class="player__control-panel">         <buttontype="button"data-tag="play"></button>         <buttontype="button"data-tag="pause"></button>         <div class="player__progress" data-tag="progress"></div>         <button type="button" data-tag="muted"></button>         <button type="button" data-tag="unmuted"></button>         <button data-tag="enterFullScreen" ></button>     </div> </div>

Проблема иногда решаться атрибутом playsinline в теге video (Примечание для тех, кто использует React, вам нужно будет использовать playsinline, в camelCase). Но в моем случае это не сработало, тем более я хотел чтобы видео не воспроизводилось при загрузке страницы а только когда наживаем кнопку play и видео переходит в полноэкранный режим.

Если вы хотите перейти в полноэкранный режим то придется написать код для проверки браузера, так как каждый браузер поддерживает свой метод. В том числе и Safari для IOS (Safari для iPhone не поддерживают некоторые фичи старшего брата):

enterFullScreen() {         const elem = this.view.player;         if (elem.requestFullscreen) {             elem.requestFullscreen();         } else if (elem.webkitRequestFullscreen) {             /* Safari */             elem.webkitRequestFullscreen();         } else if (elem.webkitEnterFullscreen) {             /* Safari */             elem.webkitEnterFullscreen();         } else if (elem.msRequestFullscreen) {             /* IE11 */             elem.msRequestFullscreen();         } else if (elem.mozRequestFullScreen) {             /* Mozila */             elem.mozRequestFullScreen();         }         if (elem.fullscreenElement === null) {             this.view.player.pause();             this.view.player.controls = false;         }     }

Чтобы выйти из полноэкранного режима на iPhone и iPad через свайп назад, то придется также написать функцию для остановки видео при выходе. Если вы хотите чтобы не было видно панель с управлением видео, то при выходе из полноэкранного режима вам нужно указать playsinline="false" , иначе будут видны стандартные элементы управления:

checkFullScreen() {         if (isTouch) {             if (document.fullscreenElement) {                 this.view.player.play();             } else {                 this.view.player.pause();             }         } else {             if (document.fullscreenElement) {                 this.view.player.controls = true;             } else {                 this._checkPaused();                 this._checkMute();                 this.view.player.controls = false;             }         }     }

Также ниже код для реализации панели с управлением видео:

start() {         const playPromise = this.view.player.play();         if (playPromise !== undefined) {             playPromise                 .then(() => {                     // Automatic playback started!                     // Show playing UI.                 })                 .catch((e: any) => {                     // Auto-play was prevented                     // Show paused UI.                     if (e.code === 9) {                         this.view.loader.classList.add('hide');                         this.handleVideoError();                     }                 });         }         this.view.pause.style.display = 'block';         this.view.play.style.display = 'none';         this.startEvent.emit(null);     }       startMobile() {         this.enterFullScreen();         this.view.player.play();         this.startEvent.emit(null);     }       stop() {         this.view.player.pause();         this.view.play.style.display = 'block';         this.view.pause.style.display = 'none';         this.stopEvent.emit(null);     }       rewind(percent: number) {         this.view.player.currentTime = percent * this.view.player.duration;     }       mute() {         this.view.player.muted = true;         this.view.unmuted.style.display = 'none';         this.view.muted.style.display = 'block';     }       unmute() {         this.view.player.muted = false;         this.view.muted.style.display = 'none';         this.view.unmuted.style.display = 'block';     }       trackingTime() {         this.view.value.style.width = `${(100 * this.view.player.currentTime) /        this.view.player.duration}%`;     }       rewindClick(e: MouseEvent) {         this.rewind(this._getDistance(e.clientX));     }       getDistance(x: number): number {         return (x - this.view.progress.getBoundingClientRect().x) / this.view.progress.getBoundingClientRect().width;     }

Вот и все, проблема решена.


ссылка на оригинал статьи https://habr.com/ru/articles/735490/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *