在 HTML5 视频中动态使用第一帧作为海报?

IT技术 javascript html html5-video poster
2021-03-18 00:30:04

我想知道是否有任何简单的方法可以实现这种效果,而无需后端代码来提取帧,将其保存为 jpg 并将其数据库存储在某处。

当视频加载时,视频的第一帧仅显示为海报的效果会非常有用(只有在浏览器可以明显播放视频时才有效,这可能与poster传统的工作方式略有不同,但是这不是问题。

6个回答

您是否尝试过以下操作?

只需将时间以秒为单位#t={seconds}附加到源 URL:

  <video controls width="360">
    <source src="https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s_1MB.mp4#t=0.1" type="video/mp4" />
  </video>

我选择了几分之一秒(0.1)来保持较小的帧数,因为我怀疑如果你放1秒,它会“预加载”视频的前1秒(即 24 帧或更多...... )。以防万一 ...

在台式机上的 Chrome 和 Firefox 上运行良好:)
不适用于 Android 移动设备:(
我还没有在 iOS、iPhone、IE 上进行测试??

2021 年 5 月编辑:

我意识到许多现代浏览器现在会自动显示第一帧的海报。

好像他们听到了我们的声音:-)

这对我来说即使很小的tvalue也显着增加了页面加载时间
2021-05-06 00:30:04
应该被接受的答案。这个简单的 hack 不需要繁重的库。
2021-05-07 00:30:04
谢谢,这应该是公认的答案,没有人想为此使用图书馆。
2021-05-08 00:30:04
重要的是,参数 preload 未设置none为其未给出的默认值auto或手动设置为preload="auto"
2021-05-13 00:30:04
这太棒了。这么简单的解决办法。对我很有用。
2021-05-14 00:30:04

为简单起见,你可以只添加 preload="metadata"到您的视频标签和第一帧的第二#t=0.5到您的视频来源

<video width="400" controls="controls" preload="metadata">
  <source src="https://www.w3schools.com/html/mov_bbb.mp4#t=0.5" type="video/mp4">
</video>

祝你好运!

有一个名为Popcorn.capturePopcorn.js插件,它允许您从 HTML5 视频的任何帧创建海报。

浏览器存在一个限制,即禁止读取跨域请求的资源的像素数据(使用画布 API 记录帧的当前值)。源视频必须托管在与请求它的脚本和 html 页面相同的域上,以便此方法工作。

使用这个插件创建海报的代码非常简单:

// This block of code must be run _after_ the DOM is ready
// This will capture the frame at the 10th second and create a poster
var video = Popcorn( "#video-id" );

// Once the video has loaded into memory, we can capture the poster
video.listen( "canplayall", function() {

  this.currentTime( 10 ).capture();

});
我只是让它开始播放并在加载的第一帧处停止
2021-04-28 00:30:04
看起来您不是在等待加载视频。我已经更新了上面的代码示例以等待然后设置海报。
2021-04-30 00:30:04
看起来像我需要的。不幸的是,爆米花本身无法正常工作..Uncaught Error: INVALID_STATE_ERR: DOM Exception 11 popcorn.js:389 Popcorn.extend.Popcorn.forEach.ret popcorn.js:389每次我打电话都会收到
2021-05-06 00:30:04
实际上,这对我来说听起来像是一个错误 :) 你能在 github repo 上提交一个问题吗?
2021-05-08 00:30:04
谢谢..让它工作了。无论如何,在大多数情况下......我的印象是文档this.capture({at: 1}).currentTime(0);会从 1 秒开始抓取海报,然后将视频放到开头,但它会在 1 秒后保留。你有这方面的经验吗?
2021-05-11 00:30:04

我最近为最近的一个适用于桌面和移动设备的项目做了这个。诀窍是让它在 iPhone 上运行。

设置preload=metadata适用于台式机和安卓设备,但不适用于 iPhone。

对于 iPhone,我必须将其设置autoplay为海报图像在初始加载时自动出现。iPhone 会阻止视频自动播放,但结果会显示海报图像。

我不得不使用在这里找到的 Pavan 的答案来检查 iPhone。检测 iPhone 浏览器然后autoplay根据设备使用或不使用正确的视频标签

var agent = navigator.userAgent;
var isIphone = ((agent.indexOf('iPhone') != -1) || (agent.indexOf('iPod') != -1)) ;

$videoTag = "";
if(isIphone()) {
    $videoTag = '<video controls autoplay preload="metadata">';
} else {
    $videoTag = '<video controls preload="metadata">';
}
就像是 var video = document.createElement('video'); video.controls = true; video.preload = 'metadata'; if (isIphone) { video.autoplay = true; video.pause(); }
2021-04-20 00:30:04
@Alessandro 你能展示一些代码我们如何在 ios 10 中处理这个问题,谢谢
2021-04-23 00:30:04
此答案解释了该问题发生的原因并提供了解决方法。请记住,在 iOS 10 中,如果满足某些条件,则可能会使用自动播放属性。所以我建议大家立即暂停视频以防止实际自动播放。
2021-04-26 00:30:04
你拯救了我的一天。你对我来说值得 50 分:)
2021-04-28 00:30:04
除非你真的想要自动播放,否则不要使用这种方法,因为 iOS 现在支持自动播放静音视频。
2021-05-03 00:30:04

您可以preload='auto'在视频元素上设置自动加载视频的第一帧。

只是一个建议:预加载意味着视频可能会在没有用户操作的情况下自动下载。这是默认情况下在 Chrome、Firefox 和 IE 桌面上发生的情况。所以请确保它不会恶化您页面上的用户体验。
2021-04-24 00:30:04
在我的情况下,当鼠标悬停时,视频只有 8 秒的播放时间!
2021-05-10 00:30:04
好点子,虽然这只是在桌面上的情况,因为这是一个提示,而不是一个指令。有点过时,但请参阅stevesouders.com/blog/2013/04/12/html5-video-preload
2021-05-15 00:30:04