Картинка в картинке и FullScreen вместе - API может быть инициирован только жестом пользователя - PullRequest
2 голосов
/ 06 января 2020

Я запускаю два видео друг над другом, как на картинке:

video player demo

Есть кнопка с именем «Ввести на полный экран». Когда кто-то нажимает эту кнопку, я хочу сделать две вещи.

  1. Видеоплеер 2 будет установлен как картинка в картинке, а
  2. Видеоплеер 1 будет установлен как полноэкранный.

Я могу сделать либо полноэкранный, либо картинку в картинке, но не могу сделать полноэкранный и картинка в картинке вместе. Выдает ошибку следующим образом:

Не удалось выполнить 'requestFullscreen' для 'Element': API может быть инициирован только жестом пользователя.
Uncaught (в обещании) TypeError: полноэкранная ошибка

Я использую jQuery, и вот мой пример кода:

$('.enter-full-screen').click(event => {
  event.stopImmediatePropagation();
  event.stopPropagation();

  let pipResponse = $('#video-player-2')[0].requestPictueInPicture();

  pipResponse.then(() => {
    $('#video-player-1')[0].requestFullscreen() // Note: I am using a browser prefixes
      .then(/* ... */)
      .catch(/* ... */);
  })
});

Обновление: 07.01.2020: Я пробовал запросить оба одновременно, но это не так работать тоже. Он работает только для одного, который я запрашиваю первым.

let pipResponse = $('#video-player-2')[0].requestPictueInPicture();
let fullscreenResponse = $('#video-player-1')[0].requestFullscreen();

Promise.all([pipResponse, fullscreenResponse])
    .then(/* code */)
    .catch(/* code */);

В этом случае работает только pip, и полноэкранный запрос выдает ошибку. Если я сначала запрашиваю полноэкранный режим, то работает только полноэкранный режим - pip выдает ошибку.

Я попытался с помощью jQuery trigger('click'), чтобы автоматы c вызвали другое событие щелчка вместе с одним. Работает только для одного (pip или fullscreen), НО НЕ РАБОТАЕТ ВМЕСТЕ!

Я очень ценю вашу помощь.

1 Ответ

2 голосов
/ 07 января 2020

Я не уверен, является ли API картинка-в-картинке (PiP) подходящим инструментом для этой работы - полноэкранный режим и поведение PiP в этом случае кажутся взаимоисключающими.

Поскольку вы уже эмулируете поведение PiP (как показано на рисунке), вы должны иметь возможность использовать тот же подход при работе в полноэкранном режиме.

Вместо того, чтобы пытаться сделать отдельные элементы видео полноэкранными / PiP Создайте один общий родительский элемент обоих видео в полноэкранном режиме. Затем вы можете просто расположить маленькое видео поверх большого (как вы уже делаете), чтобы получить эффект «картинка в картинке».

<!-- 1. Give the video players a common ancestor -->
<div id="video-group">
    <div id="video-player-1">...</div>
    <div id="video-player-2">...</div>
</div>


$('.enter-full-screen').click(event => {
    event.stopImmediatePropagation();
    event.stopPropagation();

    // 2. Make the ancestor element fullscreen, not the videos themselves
    $('#video-group')[0].requestFullscreen()
        .then(/* ... */)
        .catch(/* ... */);
});

Вот быстрый и грязный пример делает "картинка в картинке" с двумя видео YouTube:

<button type="button"
    onclick="document.querySelector('#video-group').requestFullscreen();">
    Enter fullscreen
</button>

<div id="video-group">
    <iframe style="position: absolute"
    width="100%" height="100%" 
    src="https://www.youtube.com/embed/9bZkp7q19f0" frameborder="0"
    allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

    <iframe style="position: absolute; bottom: 0; right: 0;"
    width="560" height="315"
    src="https://www.youtube.com/embed/dQw4w9WgXcQ" frameborder="0" 
    allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...