'use strict'; let snapshotUrl='',snapshotGeneration=0; function clearSnapshot(){snapshotGeneration++;if(snapshotUrl)URL.revokeObjectURL(snapshotUrl);snapshotUrl='';$('#snapshot-image').removeAttribute('src');$('#snapshot-save').removeAttribute('href');$('#snapshot-info').textContent='';} async function captureFrame(video,cameraId,label){ if(!loggedIn||!video||video.readyState<2||!video.videoWidth||video.error){toast('画面尚未就绪,请播放后再截图');return;} clearSnapshot();const generation=snapshotGeneration,session=sessionGeneration,canvas=document.createElement('canvas'); canvas.width=video.videoWidth;canvas.height=video.videoHeight;const captured=new Date(); try{canvas.getContext('2d').drawImage(video,0,0);const blob=await new Promise(resolve=>canvas.toBlob(resolve,'image/png')); if(!loggedIn||session!==sessionGeneration||generation!==snapshotGeneration)return; if(!blob)throw Error('图片生成失败');snapshotUrl=URL.createObjectURL(blob);$('#snapshot-image').src=snapshotUrl; $('#snapshot-title').textContent=label+' · 画面截图';$('#snapshot-info').textContent=`${canvas.width} × ${canvas.height} · 本次截取时间 ${captured.toLocaleString()}。图片取自当前播放器画面,包含播放缓冲延迟;不上传到服务器。`; $('#snapshot-save').href=snapshotUrl;$('#snapshot-save').download='snapshot-'+cameraId+'-'+captured.toISOString().replace(/[:.]/g,'-')+'.png';$('#snapshot-dialog').showModal(); }catch(e){if(generation===snapshotGeneration)toast('截图失败,请重新播放后再试');} } document.addEventListener('click',e=>{const b=e.target.closest('[data-snapshot-camera]');if(b){const id=b.dataset.snapshotCamera;captureFrame(b.closest('.camera-card').querySelector('video'),id,state.cameras.find(c=>c.id===id)?.name||'摄像头');}}); $('#play-snapshot').onclick=()=>captureFrame($('#play-video'),queryCamera,'录像回放'); $('#snapshot-dialog').addEventListener('close',clearSnapshot);