Skip to content

轨道与片段

轨道(Track)

轨道是时间轴上的水平容器,每个轨道可以承载特定类型的片段。

轨道类型

类型说明
video视频轨道,支持视频片段和转场
audio音频轨道,支持音频波形显示
subtitle字幕轨道
text文本轨道
sticker贴纸轨道
filter滤镜轨道
effect特效轨道

配置轨道数量

通过 trackTypes prop 配置各类型轨道的最大数量:

vue
<template>
  <VideoTrack :track-types="trackTypes" />
</template>

<script setup>
const trackTypes = {
  video: { max: 5 },   // 最多 5 个视频轨道
  audio: { max: 3 },   // 最多 3 个音频轨道
  subtitle: { max: 2 } // 最多 2 个字幕轨道
}
</script>

轨道操作

typescript
// 添加轨道
videoTrackRef.value.addTrack({
  id: 'video-1',
  type: 'video',
  name: '视频轨道 1',
  clips: []
})

// 删除轨道
videoTrackRef.value.removeTrack('video-1')

// 获取所有轨道
const tracks = videoTrackRef.value.getTracks()

// 获取指定轨道
const track = videoTrackRef.value.getTrackById('video-1')

片段(Clip)

片段是放置在轨道上的内容单元,具有开始时间、结束时间和各种属性。

片段类型

根据轨道类型,片段分为以下几种:

MediaClip(媒体片段)

用于视频和音频轨道:

typescript
interface MediaClip {
  id: string
  type: 'video' | 'audio'
  name: string
  startTime: number      // 在轨道上的开始时间(秒)
  endTime: number        // 在轨道上的结束时间(秒)
  source: string         // 媒体源 URL
  sourceStartTime: number // 媒体裁剪开始时间
  sourceEndTime: number   // 媒体裁剪结束时间
  thumbnails?: string[]   // 视频缩略图
  waveform?: number[]     // 音频波形数据
}

SubtitleClip(字幕片段)

typescript
interface SubtitleClip {
  id: string
  type: 'subtitle'
  name: string
  startTime: number
  endTime: number
  text: string           // 字幕文本
  style?: SubtitleStyle  // 字幕样式
}

TransitionClip(转场片段)

typescript
interface TransitionClip {
  id: string
  type: 'transition'
  name: string
  transitionType: string  // 转场类型
  duration: number        // 转场时长
}

片段操作

typescript
// 添加片段
videoTrackRef.value.addClip('video-1', {
  id: 'clip-1',
  type: 'video',
  name: '视频片段',
  startTime: 0,
  endTime: 10,
  source: '/path/to/video.mp4',
  sourceStartTime: 0,
  sourceEndTime: 10
})

// 更新片段
videoTrackRef.value.updateClip('clip-1', {
  name: '新名称',
  endTime: 15
})

// 移动片段到其他轨道
videoTrackRef.value.moveClip('clip-1', 'video-2', 5)

// 删除片段
videoTrackRef.value.removeClip('clip-1')

// 获取片段
const clip = videoTrackRef.value.getClipById('clip-1')

选择片段

typescript
// 选中单个片段
videoTrackRef.value.selectClip('clip-1')

// 选中多个片段
videoTrackRef.value.selectClips(['clip-1', 'clip-2'])

// 清空选择
videoTrackRef.value.clearSelection()

// 获取选中的片段
const selectedClips = videoTrackRef.value.getSelectedClips()

跨轨道拖拽

启用 enableCrossTrackDrag 后,可以将片段拖拽到同类型的其他轨道:

vue
<VideoTrack :enable-cross-track-drag="true" />

吸附功能

启用 enableSnap 后,片段在移动和调整大小时会自动吸附到其他片段的边界:

vue
<VideoTrack 
  :enable-snap="true" 
  :snap-threshold="10"  <!-- 吸附阈值(像素) -->
/>

主轨道模式

启用主轨道模式后,会有一个主要的视频轨道,其他内容围绕主轨道组织:

vue
<VideoTrack :enable-main-track-mode="true" />

Released under the MIT License.