5

播放嵌入的 youtube 视频时,我不想在完成后显示分辨率不佳的缩略图。相反,我想要最后一帧的高分辨率图像。这可能吗?

我可以在最后一帧暂停,还是有办法创建最后一帧的高分辨率缩略图?

4

5 回答 5

2

您可以使用 YouTube Player API 来检测播放何时结束,然后执行一些 DOM 操作以换出播放器并换入img指向视频缩略图之一的标签。但是,视频中的最后一帧通常不会有缩略图,因此您必须选择不同的缩略图。

如果您只想禁用视频结束时显示的相关视频,您可以使用rel=0播放器参数,但这会留下黑屏。

于 2013-01-03T21:43:36.590 回答
0

我遇到了同样的问题,在花了很多时间玩它之后,对我来说最好的解决方案是在结束前暂停视频几分之一秒,从而将其保持在该帧上。像这样的东西:

var player;

      function onYouTubePlayerAPIReady() {
        player = new YT.Player('player', {
          playerVars: { 'autoplay': 1, 'controls': 0,'loop': 1, 'showinfo': 0, 'disablekb': 1, 'version': 3, 'vq': 'large', 'wmode':'opaque','rel': 0 },
          videoId: 'YOURVIDEOID',
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onStateChange,
            'onytplayerStateChange': onStateChange }

        });

      }

    var done = false;
    function onStateChange(event){
        var videoDuration = player.getDuration();
        if (event.data == YT.PlayerState.PLAYING && !done) {
            // pause 0.1 seconds before the end
            setTimeout(pauseVideo, (videoDuration-0.1)*1000);
            done = true;
        }
    }

    function pauseVideo() {
        player.pauseVideo();
    }

视频开始后(我们使用 onStateChange 捕获),我们可以从 YouTube Player API 获取视频时长(使用 player.getDuration),然后使用 setInterval 对暂停视频 0.1 秒(或我们选择的任何值)的函数计时) 在结束之前。

于 2015-01-23T01:26:59.450 回答
0

视频播放器在调用状态为YT.PlayerState.ENDED的回调之前,会给出一个状态为 YT.PlayerState.PAUSED的回调“onStateChange” ,您可以在此处尝试。

我也在做同样的事情。我只是显示一个覆盖以使用重播按钮覆盖视频,但它仍然出现在视频的末尾,然后出现覆盖(观察到一些故障)

于 2013-10-30T04:49:20.997 回答
0

在遇到这个问题后,我最终得到了这个,到目前为止,这对我来说一直很一致:

var player;
var curTimer;
function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', {
                    videoId: 'The Video ID',
                    playerVars: { 'rel':0, 'enablejsapi':1, 'autohide':1, 'wmode':'opaque'}
                });
    player.addEventListener('onReady', 'onPlayerReady');
    player.addEventListener('onStateChange', 'onPlayerStateChange');
}
function onPlayerStateChange(event) {
    var videoDuration = event.target.getDuration();
    var curTime = event.target.getCurrentTime();
    if ( curTime ) {
        /**  Video Already Started  */

        /**  Get video time remaining. */
        videoDuration = videoDuration-curTime;

        /**  Remove old 'setTimeout' function */
        removeTimeout(curTimer);
    }
    /**
        Note: The '.25' is time subtracted to stop video on last frame.
        Adjust this as needed.
    */
    /**  Add/Re-Add 'setTimeout' function with video time remaining. */
    curTimer = setTimeout(pauseVideo, (videoDuration-.25)*1000);
}
function removeTimeout(elTimer){
    /** Remove old timer */
    clearTimeout(elTimer);
}
function stopVideo() {
    player.stopVideo();
}

解释和/或注释在评论中。

于 2015-12-30T01:07:20.743 回答
0
var thumb = true;
function onStateChange(event) {

    if (thumb && event.data == YT.PlayerState.PLAYING) {
      thumb = false;
      player.pauseVideo();
      return;      
    }

    if (event.data != YT.PlayerState.ENDED) {
        return;
    }

    player.setPlaybackQuality('highres');
    player.seekTo(player.getDuration() - 1, true);
    player.playVideo();
    thumb = true; 

}
于 2020-12-02T20:01:25.183 回答