Видео HTML5 / Конец видеопостера

<video controls="controls" poster="http://gifs.gifbin.com/1233925271_8be9acc.gif" style="width:800px;">

С вышеперечисленным; внутри тега HTML5 <video> я могу добавить постер; изображения или анимированного .gif просто отлично и воспроизводится / запускается до того, как фактическое видео будет «воспроизведено».

ТЕПЕРЬ, как я могу добавить изображение; в частности, .gif (анимированный .gif работает с постером), который будет запускаться ПОСЛЕ того, как видео проиграно?


person fred randall    schedule 09.01.2013    source источник


Ответы (10)


Вкратце: вам нужно добавить video.addEventListener('ended',function() {}) и активировать video.load() в вашем пользовательском JavaScript.

Вот связанный пост, который перенаправляет после воспроизведения видео, вы можете изменить его соответствующим образом - Перенаправить видео html5 после воспроизведения.

Ссылки для поиска подробной информации:

person Yusubov    schedule 09.01.2013
comment
Можете ли вы объяснить часть «сделай это»? - person Ethereal; 24.05.2013
comment
Да, я согласен. Это на самом деле не ответило на вопрос. - person Dave Voyles; 21.07.2015
comment
ну ... внутри фигурных скобок функции в завершенном событии вы либо с помощью js, либо jQuery замените видео на изображение с тем же размером и стилями css, что и видео ... как? вы можете изменить атрибут src видео на свое изображение... или просто удалить видео и добавить изображение... - person ; 22.06.2017

Простой способ сделать это:

<script>
var video = document.querySelector('video');       
video.addEventListener('ended', function() {
  video.load();     
});
</script>

Действительно, при изменении src тега видео вы неявно вызываете для него функцию load().

Этот метод требует повторного запроса URL-адреса мультимедиа, и в зависимости от настроек кэширования он может повторно загрузить полноразмерный медиа-ресурс, что приведет к ненужному использованию сети/ЦП для клиента.

Более подходящий способ решить эту проблему — использовать наложение изображения/div поверх тега видео и скрывать его при запуске видео. Когда срабатывает завершенное событие, просто снова покажите наложенное изображение.

person Arnaud Leyder    schedule 10.04.2014

Вот что я сделал, чтобы увидеть постер после того, как видео закончилось:

# Show poster at the end of the video
$('video').on('ended',->
  $('video')[0].autoplay=false
  $('video')[0].load()
)
person Hackeron    schedule 08.08.2015
comment
Это правильный ответ (Арно более подробно объясняет, почему это не очень хорошо, но этот код чище и отключает автозапуск), очень жаль, что спецификация HTML5 изначально не поддерживает эту функцию. - person zrisher; 30.01.2016
comment
выше добавит черное изображение flickr в сафари. - person Kalava; 04.10.2016
comment
как я могу реализовать это решение? - person Anna K; 03.04.2017
comment
Без jQuery: var videoElement = document.getElementById('video-id'); videoElement.addEventListener('завершено', function () { videoElement.autoplay=false videoElement.load() }, false); - person Oleksii.B; 14.01.2020

попробуй это

var video=$('#video_id').get(0);        
video.play();
video.addEventListener('ended',function(){
    v=video.currentSrc;
    video.src='';
    video.src=v;            
});  
person Logan    schedule 04.04.2014
comment
Это почти простое решение для javascript, чего я и хотел. Я заменил первую строку на getElementById() и добавил video.autoplay=false, чтобы предотвратить зацикливание. Работает как шарм. - person Jette; 30.11.2017
comment
У меня это сработало лучше, чем просто video.load(); в Chrome 63/macOS. По какой-то причине метод load() заставлял рамку моего плаката мигать каждые несколько секунд после его вызова… Хотя мне нравится простота load(), это решение не заставляло рамку моего плаката мигать. Не уверен, что мигающая рамка плаката была вызвана ошибкой пользователя или какой-то ошибкой (или функцией?) - person mhulse; 29.12.2017

Наконец, я нашел решение: видео будет автоматически воспроизводиться в первый раз, и в конце видео вы увидите изображение постера:

<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.7/prototype.js"></script>
<script type="text/javascript">
 document.observe('dom:loaded', function(evt){
    $('#myVideo').each(function(elm){
        elm.play();
        var wrapper = elm.wrap('span');
        var vid = elm.clone(true);
        elm.observe('ended', function(){
          wrapper.update(vid);
       });
    });
 });
</script>

<video id="myVideo" poster="1.png" >
    <source src="1.mp4" type="video/mp4" />
</video>
person Niraj patel    schedule 31.05.2017
comment
Спасибо, Фил Коллинз, я рад поделиться идеей с людьми. - person Niraj patel; 31.05.2017

Это работает для меня.

var video=$('#video_id').get(0);        
video.play();
video.addEventListener('ended',function(){
    v=video.currentSrc;
    video.src='';
    video.src=v; 
    video.pause();          
}); 
person Viktor Kocev    schedule 02.08.2018

Если вам нужен плакат в конце, и это единственное требование, то я бы сказал, просто добавьте конечный кадр в видеофайл в качестве этого плаката и пропустите загрузку ненужного JS. Когда видео закончится, вы увидите конечный кадр, который теперь является добавленным вами постером.

Если вы хотите отобразить постер видео в конце или, другими словами, перезагрузить видео, используйте пользовательское событие, как показано выше Е.Л. Юсубовым.

person sunnyuff    schedule 29.01.2019

Я вижу два пути решения вашей проблемы.

Первый установит текущий кадр в позицию 0 (самый первый кадр) после окончания видео. Вы можете установить любую рамку, которая вам нравится. Это решение рекомендуется.

<video controls id="myVideo" poster="test.jpg">
  <source src="test.mp4" type="video/mp4" />
</video>
<script>
let myVideo = document.getElementById("myVideo");
myVideo.onended = function() {
  myVideo.currentTime = 0;
};
</script>

Следующий перезагрузит источник видео, поэтому постер снова появится. Согласно спецификации poster в video оно будет отображаться только до тех пор, пока видео не запустится один раз. После этого единственный способ снова получить постер - перезалить видео src и poster, просто для уверенности. Будет работать немного стабильнее с poster перезагрузкой.

<video controls id="myVideo" poster="test.jpg">
  <source src="test.mp4" type="video/mp4" />
</video>
<script>
let myVideo = document.getElementById("myVideo");
myVideo.onended = function() {
  myVideo.poster = "test.jpg"
  myVideo.src = "test.mp4"
};
</script> 
person focus.style    schedule 06.06.2020

У меня была та же цель, и я нашел решение, используя jQuery, чтобы сбросить источник видео на себя по окончании. Теперь я получаю свой анимированный GIF-постер до и после игры. Вот простая функция воспроизведения javascript и код jQuery.

function play()
    {
    movie_ID.play(); 

    $(document).ready(function(){
         $("#movie_ID").bind("ended", function() {
        $('#movie_ID').attr('src', 'movie_ID.src');
            });
         });   
     }  
person weshen    schedule 04.08.2013

решается добавлением 1 дополнительного кадра (постера) в конец самого видео, т.к. сайт не поддерживает вставку javascripts

person player0    schedule 06.01.2016