【发布时间】:2011-11-11 11:46:18
【问题描述】:
我想知道是否有任何直接的方法可以实现这种效果,而无需后端代码来提取帧,将其保存为 jpg 并将其数据库化。
当视频加载时视频的第一帧仅显示为海报的效果非常有用(只有在浏览器可以明显播放视频时才会起作用,这可能与@的方式略有不同987654321@ 传统上有效,但这不是问题。
【问题讨论】:
标签: javascript html html5-video poster
我想知道是否有任何直接的方法可以实现这种效果,而无需后端代码来提取帧,将其保存为 jpg 并将其数据库化。
当视频加载时视频的第一帧仅显示为海报的效果非常有用(只有在浏览器可以明显播放视频时才会起作用,这可能与@的方式略有不同987654321@ 传统上有效,但这不是问题。
【问题讨论】:
标签: javascript html html5-video poster
您是否尝试过以下操作?
只需将时间(以秒为单位)#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上测试过??
我意识到现在许多现代浏览器会自动显示第一帧的海报。
好像他们听到了我们的声音:-)
【讨论】:
none 或者它没有给出并且默认值auto 或者手动设置为preload="auto"。
t 值。
为简单起见,您只需将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.capture 的Popcorn.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();
});
【讨论】:
Uncaught Error: INVALID_STATE_ERR: DOM Exception 11 popcorn.js:389 Popcorn.extend.Popcorn.forEach.ret popcorn.js:389。
this.capture({at: 1}).currentTime(0); 会在 1 秒后抓取一张海报,然后将视频放在开头,但它会在 1 秒后离开。你有什么经验吗用那个?
我最近为一个在桌面和移动设备上运行的项目做了这个。诀窍是让它在 iPhone 上运行。
设置preload=metadata 适用于台式机和安卓设备,但不适用于 iPhone。
对于 iPhone,我必须将其设置为 autoplay,以便海报图像在初始加载时自动出现。 iPhone 会阻止视频自动播放,但会出现海报图像。
我必须使用此处找到的 Pavan 的答案检查 iPhone。 Detect iPhone Browser。然后根据设备使用带或不带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(); }
您可以在视频元素上设置preload='auto',以自动加载视频的第一帧。
【讨论】:
#2、#3 等框架的解决方案。我们需要附加一次性处理程序 .one() 来重置默认框架。
<video width="300" height="150" id='my-video'>
<source src="testvideo.mp4#t=2" type="video/mp4" />
</video>
$(function () {
let videoJs = videojs('my-video');
videoJs.one('play', function () {
this.currentTime(0);
});
});
【讨论】:
我找到了一种为视频动态添加海报的好方法!
要从视频中显示所需的帧(在我的情况下,它是 1.75 秒的帧) - 将 preload="metadata" 添加到视频元素,将 #t=1.75 添加到源 URL 的末尾。
将 eventListener 添加到将只侦听一次 play 事件的视频元素。
发出事件后,重置视频时间。
<video width="100%" controls="controls" preload="metadata" id="myVid">
<source src="path/to/your/video#t=1.75" type="video/mp4">
</video>
<script>
var el = document.getElementById('myVid');
el.addEventListener('play', () => {
el.currentTime = 0;
}, { once: true });
</script>
【讨论】: