Недавно, в процессе реализации одного из модулей проекта, над которым я работаю - возникла проблема воспроизведения видео на 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">
        <button type="button"data-tag="play"></button>
        <button type="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;
    }

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

Комментарии (2)


  1. kraznopol
    17.05.2023 07:03
    +2

    интересно.... а разве на ай-фоне по умоланию видео может стартовать только внутри обработчика тапа?


    1. MyZoneITteam Автор
      17.05.2023 07:03

      Если добавить атрибут autoplay, то видео начнёт воспроизводится автоматически тогда, как только это будет возможно сделать без остановки. Если вы это имели ввиду...