播放嵌入的 youtube 视频时,我不想在完成后显示分辨率不佳的缩略图。相反,我想要最后一帧的高分辨率图像。这可能吗?
我可以在最后一帧暂停,还是有办法创建最后一帧的高分辨率缩略图?
播放嵌入的 youtube 视频时,我不想在完成后显示分辨率不佳的缩略图。相反,我想要最后一帧的高分辨率图像。这可能吗?
我可以在最后一帧暂停,还是有办法创建最后一帧的高分辨率缩略图?
您可以使用 YouTube Player API 来检测播放何时结束,然后执行一些 DOM 操作以换出播放器并换入img
指向视频缩略图之一的标签。但是,视频中的最后一帧通常不会有缩略图,因此您必须选择不同的缩略图。
如果您只想禁用视频结束时显示的相关视频,您可以使用rel=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 秒(或我们选择的任何值)的函数计时) 在结束之前。
视频播放器在调用状态为YT.PlayerState.ENDED的回调之前,会给出一个状态为 YT.PlayerState.PAUSED的回调“onStateChange” ,您可以在此处尝试。
我也在做同样的事情。我只是显示一个覆盖以使用重播按钮覆盖视频,但它仍然出现在视频的末尾,然后出现覆盖(观察到一些故障)
在遇到这个问题后,我最终得到了这个,到目前为止,这对我来说一直很一致:
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();
}
解释和/或注释在评论中。
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;
}