| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| <title>捕获视频帧</title> |
| <style> |
| * { |
| box-sizing: border-box; |
| } |
| video, |
| canvas { |
| width: 360px; |
| outline: 1px solid red; |
| } |
| img { |
| width: 100px; |
| } |
| .list { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 10px; |
| } |
| </style> |
| </head> |
| <body> |
| <div class="list"></div> |
| <hr /> |
| <script> |
| init(); |
| async function init() { |
| const list = document.querySelector('.list'); |
| for (let i = 0; i < 60; i++) { |
| const frame = await captureFrame(i); |
| const img = document.createElement('img'); |
| img.src = frame.src; |
| list.appendChild(img); |
| } |
| } |
| |
| |
| function captureFrame(time = 0) { |
| return new Promise((resolve) => { |
| const video = document.createElement('video'); |
| const canvas = document.createElement('canvas'); |
| const ctx = canvas.getContext('2d'); |
| |
| video.currentTime = time; |
| video.muted = true; |
| video.autoplay = true; |
| |
| video.addEventListener('canplay', () => { |
| console.log(' => ', video.videoWidth, video.videoHeight); |
| if (video.videoWidth < video.offsetWidth) { |
| canvas.width = video.offsetWidth * devicePixelRatio; |
| canvas.height = video.offsetHeight * devicePixelRatio; |
| } else { |
| canvas.width = video.videoWidth * devicePixelRatio; |
| canvas.height = video.videoHeight * devicePixelRatio; |
| } |
| |
| ctx.drawImage(video, 0, 0, canvas.width, canvas.height); |
| canvas.toBlob( |
| (blob) => { |
| const src = URL.createObjectURL(blob); |
| resolve({ src, blob }); |
| }, |
| 'image/png', |
| 1 |
| ); |
| }); |
| video.src = './frag_bunny.mp4'; |
| }); |
| |
| |
| |
| } |
| </script> |
| </body> |
| </html> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了