Безрадостный переход от видео к видео с помощью html5
Я пытаюсь создать функцию, в которой пользователь может изменять (назад и вперед) между несколькими видео при сохранении единого согласованного звука. Думайте о возможности смотреть концерт с разных ракурсов, но слушать один звук. Проблема, с которой я сталкиваюсь в этой функции, заключается в том, что не может быть задержки между изменениями в видео или аудио больше не будет синхронизироваться с видео (особенно верно после нескольких изменений).
Я пробовал два метода, используя только html5 (я бы предпочел не использовать flash, хотя в конечном итоге у меня будет резерв), который не работал без проблем, хотя в зависимости от браузера и оборудования он может приблизиться.
Основные методы:
Способ 1: предварительная загрузка всех видео и изменение пути видео src при каждом нажатии с помощью javascript
Метод 2: снова предварительно загрузите видео и используйте несколько тегов и меняйте их с помощью javascript при каждом нажатии.
Есть ли способ заставить любой из этих двух методов работать без пробелов? Должен ли я использовать небольшой трюк, например, одновременно воспроизводить оба видео за секунду, прежде чем показывать второй и останавливать первый? Можно ли это сделать не с игроками html5? Это можно сделать со вспышкой?
Я видел этот тип вопроса пару раз с видео и аудио без четкого решения, но им было пару месяцев, и я надеялся, что теперь есть решение. Спасибо за помощь.
Ответы
Ответ 1
Стоит добавить, что это возможно с помощью API MediaSource, предложенного Google. Этот API позволяет передавать произвольные двоичные данные одному элементу видео, поэтому, если ваше видео разбито на куски, вы можете получить эти фрагменты с помощью XHR и добавить их в свой элемент видео, они будут воспроизводиться без пробелов.
В настоящее время он реализован только в Chrome, и вам нужно включить Enable Media Source API on <video> elements
в хром: флаги, чтобы использовать его. Кроме того, в настоящий момент поддерживается только контейнер WebM.
Вот статья о HTML5Rocks, которая демонстрирует, как работает API: "Потоковое" видео с использованием MediaSource API.
Еще одна полезная статья, в которой говорится о фрагментированном плейлисте: Сегментирование WebM-видео и API MediaSource.
Я надеюсь, что эта реализация будет принята и получит более широкую поддержку медиа-контейнеров.
UPDATE JUN 2014 Поддержка браузера постепенно улучшается: (спасибо @Hugh Guiney за подсказку)
- Chrome Stable
- FF 25+ имеет флаг
media.mediasource.enabled
[MDN]
- IE 11+ в Windows 8.1 [MSDN]
Ответ 2
Вы нашли лучший способ сделать это?
Я реализовал двухбуферное воспроизведение с использованием двух видеотегов.
Один используется для текущего воспроизведения, а второй для предварительной загрузки следующего видео.
Когда видео заканчивается, я "обмениваю" теги:
function visualSwap() {
video.volume = video2.volume;
video2.volume = 0;
video.style.width = '300px';
video2.style.width = '0px';
}
У него есть некоторое недетерминированное поведение, поэтому я не на 100% доволен, но стоит попробовать...
Ответ 3
Изменение тега SRC выполняется быстро, но не безразлично. Я пытаюсь найти лучший способ для медиаплеера, который я создаю и предварительно загружаю следующий трек, и переключение src через "закончился" оставляет пробел в 10-20 мс, что может показаться крошечным, но этого достаточно, чтобы быть заметным, особенно с музыкой.
Я только что проверил, используя второй звуковой элемент, который срабатывает, как только первый аудио-элемент заканчивается через событие "закончился", и это повлекло за собой тот же крошечный разрыв.
Похоже, что без использования сложных хаков нет простого (ish) способа достижения бесщеточного воспроизведения, по крайней мере, прямо сейчас.
Ответ 4
можно. вы можете проверить это: http://evelyn-interactive.searchingforabby.com/ все это сделано в html5. они предварительно загружают все видеоролики в начале и запускают их в одно и то же время. еще не успел проверить, как они это делают, но, возможно, это поможет, если вы проверите их скрипты с помощью firebug
Ответ 5
После многих попыток я действительно использовал что-то похожее на метод 2. Я нашел этот сайт http://switchcam.com и в основном скопировал их подход. Я предварительно буферизуюсь по мере приближения времени начала видео, а затем автоматически воспроизводится в качестве точки начала видео. У меня были текущие видео, которые воспроизводятся одновременно (в небольшом div - как бонус UI), и пользователи могут переключаться между видео, переключающими "главный экран". Поскольку все видео воспроизводились сразу, вы можете выбрать аудио, и этот пробел не стал проблемой.
К сожалению, я никогда не решал свою проблему точно, и я не уверен, что мое решение имеет лучшую производительность, но оно работает нормально с быстрым подключением.
Спасибо за помощь всем!