核心依赖:
- @vueuse/core(推荐)
- video.js(可选)
- 原生HTML5 Video
{{ formatTime(marker.time) }} - {{ marker.comment }}
// 添加WebSocket支持
import { useWebSocket } from '@vueuse/core'
const { data, send } = useWebSocket('ws://your-websocket-url')
watch(data, (newData) => {
try {
const msg = JSON.parse(newData)
if (msg.type === 'MARKER_UPDATE') {
markers.splice(0, markers.length, ...msg.data)
}
} catch(e) {
console.error('WS数据解析失败', e)
}
})
const broadcastMarkers = () => {
send(JSON.stringify({
type: 'MARKER_UPDATE',
data: markers
}))
}
// 使用高精度时间处理
const getCurrentTime = () => {
return videoRef.value ? Math.floor(videoRef.value.currentTime * 100) / 100 : 0
}
// 虚拟滚动优化
import { useVirtualList } from '@vueuse/core'
const { list, containerProps, wrapperProps } = useVirtualList(
markers,
{
itemHeight: 40,
overscan: 10
}
)
// 全屏处理兼容
const requestFullscreen = () => {
if (videoRef.value.requestFullscreen) {
videoRef.value.requestFullscreen()
} else if (videoRef.value.webkitRequestFullscreen) {
videoRef.value.webkitRequestFullscreen()
}
}
<video preload="metadata">
<source src="/video.mp4#t=0.5" type="video/mp4">
video>
// 防抖处理标记更新
const updateMarkers = useDebounceFn((newMarkers) => {
sendUpdateToServer(newMarkers)
}, 1000)
// XSS防护
const sanitizeComment = (text) => {
return text.replace(/</g, '<').replace(/>/g, '>')
}
<button aria-label="添加视频标记" @click="addMarker">
<svg>svg>
button>
const markerTypes = {
IMPORTANT: { color: '#ff4757' },
COMMENT: { color: '#2ed573' },
QUESTION: { color: '#ffa502' }
}
const detectScenes = async () => {
const response = await fetch('/api/detect-scenes', {
method: 'POST',
body: videoFile
})
const scenes = await response.json()
markers.push(...scenes)
}
const generateThumbnail = async (time) => {
const canvas = document.createElement('canvas')
canvas.width = 160
canvas.height = 90
videoRef.value.currentTime = time
await new Promise(r => videoRef.value.onseeked = r)
canvas.getContext('2d').drawImage(videoRef.value, 0, 0)
return canvas.toDataURL()
}
该方案完整实现了视频打点的核心功能,并提供了扩展性良好的架构设计,可根据具体业务需求进行模块化扩展。建议在实际项目中根据具体需求选择合适的第三方库和优化策略。