Как правильно обрабатывать переключение видео html5

Я пришел сюда после долгих проблем с чем-то, что может быть связано только с видео, и, вероятно, плохо понимаю ресурсы страницы в целом. То, что я пытаюсь сделать, - это возможность иметь одну веб-страницу, на которой, нажимая кнопки «вперед» и «назад», можно изменить содержимое div для отображения одного из видео в очевидном последовательном порядке. Видео в настоящее время находится в формате mp4 в видеоэлементе html5.

Я пробовал несколько методов.

  • прямое изменение src исходного элемента (похоже, ничего не делает)

  • удалите элемент и повторно добавьте его с другим src. (имеет проблему, описанную ниже)

  • удалите элемент и используйте Jquery .load() для размещения внешнего html-файла со всем элементом видео в нем, включая отдельный html-файл для каждого src. (имеет проблему, описанную ниже)

  • удалите элемент и повторно добавьте его с помощью src, указывающего на загрузку файла из GridFS с использованием фреймворка python flask. (имеет проблему, описанную ниже)

Итак, основная проблема, с которой я столкнулся, связана с повторными загрузками одного и того же видео со страницы. Скажем, если вы нажмете «следующее видео», затем «предыдущее видео». Это приводит к тому, что видео становится «черным» (вообще не загружается, ведет себя так, как будто src не работает). При первом запросе каждого из видео оно загружается менее чем за секунду, второе время варьируется, но всегда превышает 10 секунд. до того, как содержимое видео появится на экране, и оно станет доступным для воспроизведения. Сетевые инструменты Google Chrome для разработчиков отображают медиафайл как «ожидающий», пока я жду, когда, когда он завершится, ожидание, наконец, превратит вышеуказанное видео в красный (отменено), а новый источник в «частичный контент». Во время ожидания он не может ничего получить с сервера, включая прокручивающиеся изображения.

Я пробовал это локально с помощью простого html-сервера flask и python, а также на 8-ядерном сервере через гигабитный Ethernet. Это не проблема случайной сетевой задержки, происходит что-то странное.

Одна из вещей, которые я пытаюсь понять, это то, как новый запрос к серверу работает с частичным контентом. У меня была некоторая идея, что кеш браузера будет хранить файл, чтобы во второй раз он загружался быстрее, что в любом случае было бы оптимально. Это все еще происходит с видео html5?

Также следует отметить, что файлы довольно маленькие, одна минута или около того видео размером около 20 МБ. Похоже, что веб-сервер по какой-то причине просто блокирует второй запрос, и мне интересно, слышал ли кто-нибудь из вас об этом. Я могу опубликовать код по запросу, но я думаю, что концепция довольно проста.

Я планирую использовать GridFS с flask для окончательной реализации этого сайта.

Из-за приведенного ниже предложения я попытался избавиться от исходного элемента и прикрепить атрибут src к самому видео. Это дает тот же результат. Вот довольно простая вещь, которую я делаю:

$('#addlinks').click(function(){

    $('#maininside').remove();
    $('#maintext').append('<div id=maininside></div>');        
    $('#maininside').html('<video width="100%" controls src="/getmedia/dangerisland-01-video-01.m4v">Your browser does not support the video tag.</video>');

});

<article id="maintext">            

        <div id="maininside">            

        </div>       

</article>

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

Ошибка загрузки на вкладке

Спасибо за любое понимание, которое у вас может быть.


person Rboreal_Frippery    schedule 04.01.2014    source источник
comment
Я не знаю о проблеме с загрузкой, но изменение атрибута src в исходном элементе не будет работать. Вам нужно установить его для элемента видео, а затем вызвать video.load()   -  person kalhartt    schedule 04.01.2014


Ответы (1)


Здесь много подвопросов и переменных; не уверен, насколько хорошо я смогу решить их все, но я попробую.

  • Комментарий kalhartt указывает, что вы правы в отношении простой смены источника. Но я отмечу, что, по моему опыту, поведение, которое вы увидите в различных браузерах по мере прохождения этого процесса, будет непоследовательным. Я проделал некоторую работу над этим за последний год, и, по крайней мере, в то время это был плохой пользовательский опыт — пользователь воспринимал видео как сломанное, в то время как браузер реагирует на изменение источника и новую загрузку. В итоге мы создали новые видеоэлементы и отключили их (но даже это может быть чревато ловушками из-за различий в том, когда каждый браузер публикует медиа-события).

  • Я не уверен, как вы обслуживаете видео, но сервер разработки flask блокируется (если вы не установите app.run(threaded=True), я думаю).

  • Также возможно, что вы столкнулись с поведением, вызванным внутренней логикой загрузки/кеширования видео в браузере, и вы даже заметите значительные различия в том, как каждый браузер обрабатывает эти задачи. Хорошим способом проверки такого поведения было бы добавление уникальной строки запроса (возможно, с отметкой времени) для каждой загрузки; видео должны успешно загружаться (если сервер не блокируется). Если проблема заключается в блокировке сервера, возможно, стоит разместить видео на S3, пока вы не будете готовы сосредоточиться на том, как они доставляются.

  • Другая возможность — не уничтожать исходный видеообъект, если вы подозреваете, что он будет использоваться снова (вместо этого вы можете приостановить его, удалить из DOM и сохранить ссылку на него). Однако, если повторное использование маловероятно, и особенно если вы ожидаете, что пользователи будут воспроизводить много видео при загрузке одной страницы, возможно, лучше отказаться от них. Компромисс может заключаться в сохранении фиксированного количества предыдущих видеообъектов.

person abathur    schedule 09.04.2014