У меня есть два одинаковых видеоролика YouTube, встроенных на одну страницу. Я бы хотел, чтобы они оба синхронизировались, вот мои требования/примечания:
- Оба видео должны запускаться одновременно.
- Когда видео воспроизводится/приостанавливается пользователем, другое видео делает то же самое
- Это довольно просто с помощью API
- Когда одно видео буферизует остальные остановки для ожидания и запускается, когда они оба готовы
- Мне нужен только звук с одного видео.
- Точность синхронизации не должна быть миллисекундой совершенной, просто надежной.
- Одно видео будет использоваться в качестве фонового видео
- Это видео будет слегка размытым (с использованием размытия CSS3), поэтому качество не супер существенное
Я попытался использовать JS API YouTube, чтобы прослушивать изменения состояния проигрывателя и пытаться синхронизировать оба видео, однако это было не так надежно, как я надеялся. Я отправлю часть кода для этого ниже.
Одно из предостережений заключается в том, что одно видео будет больше, чем другое, поэтому YouTube может предоставить для него более качественное видео.
Поскольку я использую размытие CSS3, я могу использовать только последние браузеры Webkit, поэтому решение, работающее только на них (а не на FF/IE), не является проблемой.
Мой вопрос в том, что, для требований выше, есть ли способ сохранить эти два видео в синхронизации? Я подумал, можно ли использовать API-интерфейс canvas для "перерисовки" видео, но после исследования выяснилось, что это не будет возможным.
buffering = false;
var buffer_control = function(buffering_video, sibling_video, state) {
switch ( state ) {
case 1: // play
if ( buffering === true ) {
console.error('restarting after buffer');
// pause both videos, we want to make sure they are both at the same time
buffering_video.pauseVideo();
sibling_video.pauseVideo();
// get the current time of the video being buffered...
var current_time = buffering_video.getCurrentTime();
// ... and pull the sibling video back to that time
sibling_video.seekTo(current_time, true);
// finally, play both videos
buffering_video.playVideo();
sibling_video.playVideo();
// unset the buffering flag
buffering = false;
}
break;
case 3: // buffering
console.error('buffering');
// set the buffering flag
buffering = true;
// pause the sibling video
sibling_video.pauseVideo();
break;
}
}