Label Studio Video 标签详解:视频标注配置、播放器参数与 FFmpeg 预处理实战
【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio
Label Studio 的<Video>标签用于在标注界面中播放并展示视频文件,支撑视频分类、转写(transcription)、帧级分类、目标跟踪与时间轴分段等典型标注任务。本文以官方 Video 标签文档为骨架,结合前端编辑器源码(Video.js)与仓库内置的视频标注模板(label_studio/annotation_templates/videos/),系统讲解视频格式兼容性要求、FFmpeg 预处理命令、全部标签参数、播放速度控制机制,以及分类、转写、跟踪等完整标注配置示例。
适用场景与数据约束
<Video>标签专门处理video类型的数据,适合两类最常见的标注需求:
- 视频分类:对整段视频做出类别判断,配合
<Choices>等输出控件使用; - 视频转写:观看视频并记录文本内容,配合
<TextArea>使用。
在此基础上,它也是帧级分类(配合<TimelineLabels>)、目标跟踪(配合<VideoRectangle>与<Labels>)和时间轴分段(配合<Timeline>)等高级任务的播放基础。从源码结构看,Video 标签模型通过toNames关联查找labels、timeline、videorectangle、videovector等控制标签(见 Video.js),说明它是整个视频标注生态的播放容器。
视频格式与编码:为什么必须做预处理
Label Studio依赖浏览器来播放视频并计算总帧数,因此视频的封装格式与编码必须被浏览器普遍支持。官方推荐的组合是:
- 容器:MP4
- 视频编码:H.264(AVC)
- 音频编码:AAC
该组合在现代浏览器中兼容性最好,能最大程度避免总时长检测错误、播放异常等问题。同时,视频应转换为恒定帧率(CFR),理想值为 30 fps,以避免帧数偏差、重复帧或丢帧问题;文件内所有音视频流的时长必须一致,否则会出现多余的总帧数。这些限制的根本原因在于:编辑器需要把时间映射为离散的帧号(Video.js 中的frame、length、currentFrame等状态均以帧为基准),帧率与时长不准确会直接导致标注区间错位。
FFmpeg 转码命令详解
官方文档提供了两个 FFmpeg 命令。第一个用于提取视频流的精确时长,第二个用于重新编码为标准格式:
# 提取视频流的精确时长(秒) DUR=$(ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=nokey=1:noprint_wrappers=1 input.mp4) # 重新编码为推荐格式 ffmpeg -i input_video.mp4 -c:v libx264 -profile:v high -level 4.0 -pix_fmt yuv420p -r 30 -c:a aac -b:a 128k -to $DUR output_video.mp4各参数含义如下:
| 参数 | 作用 |
|---|---|
-i input_video.mp4 | 指定源视频 |
-c:v libx264 | 使用 H.264 编码器 |
-profile:v high -level 4.0 | 设置兼容性参数,覆盖大多数设备 |
-pix_fmt yuv420p | 采用大多数浏览器兼容的像素格式 |
-r 30 | 强制恒定 30 fps;若能 100% 确定源视频已是恒定帧率,可省略此参数 |
-c:a aac -b:a 128k | 音频编码为 AAC,码率 128 kbps |
-to $DUR | 容器时钟到达视频结束时间戳即停止输出,自动丢弃多余音频尾巴 |
output_video.mp4 | 转码后可直接用于 Label Studio 的文件 |
建议转码前用以下命令全面检查视频的所有参数(格式、流信息、帧率、时长):
ffprobe -v error -show_format -show_streams -print_format json input.mp4Video 标签参数速查
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
name | string | — | 元素名称(必填) |
value | string | — | 视频的 URL(必填),常以$video引用任务数据字段 |
frameRate | number | 24 | 视频每秒帧数,默认 24;可直接使用任务数据,如$fps |
sync | string | — | 需要同步的(音频/视频)对象名称,用于音视频同步标注 |
muted | boolean | false | 是否静音播放 |
height | number | 600 | 视频播放器高度(像素) |
timelineHeight | number | 64 | 带标注区域的时间轴高度(像素) |
defaultPlaybackSpeed | number | 1 | 播放器加载时的初始播放速度 |
minPlaybackSpeed | number | 1 | 允许的最小播放速度,defaultPlaybackSpeed不能低于该值 |
注意:官方参数速查表中
minPlaybackSpeed的文档默认值标为1,但从编辑器源码看,标签模型实际将minplaybackspeed的默认值设为"0.25"(见 Video.js),并在初始化时将最小允许速度钳制在0.25至10之间(Video.js)。文档默认值1意味着默认情况下最小速度即为正常速度;若要允许慢放,需显式指定更小的minPlaybackSpeed。
参数在源码中的处理细节
- 帧率归一化:
frameRate在初始化时会被解析并归一化——若任务数据中无有效值则回退到"24";若值小于 1(如0.5表示每 2 秒一帧),会被转换为1 / frameRate(见 Video.js)。因此你既可以在配置中写死数值,也可以写成frameRate="$fps"引用任务数据字段。 - 播放速度钳制:源码设定了
MIN_PLAYBACK_SPEED = 0.25、MAX_PLAYBACK_SPEED = 10;minPlaybackSpeed会被限制在[0.25, 10],defaultPlaybackSpeed则被限制在[minPlaybackSpeed, 10]区间内(Video.js),且播放器初始速度直接取defaultPlaybackSpeed。这意味着配置里写的defaultPlaybackSpeed即使超出范围,也会被安全钳制,不会导致播放器异常。
基础用法示例
示例一:最小配置(仅播放视频)
<View> <Video name="video" value="$video" /> </View>示例二:自定义播放速度
<View> <Video name="video" value="$video" defaultPlaybackSpeed="2" minPlaybackSpeed="1.5" /> </View>播放器载入后会以 2 倍速启动,且速度调节不能低于 1.5 倍速。注意defaultPlaybackSpeed不能小于minPlaybackSpeed,源码中会将前者钳制到[minPlaybackSpeed, 10]区间。
示例三:视频分类
<View> <Video name="video" value="$video" /> <Choices name="ch" toName="video"> <Choice value="Positive" /> <Choice value="Negative" /> </Choices> </View>仓库内置的视频分类模板与上述结构一致,并在示例数据中给出了 predictions 结果格式(from_name为choice、to_name为video、type为choices),可直接参考。
示例四:视频转写
<View> <Video name="video" value="$video" /> <TextArea name="ta" toName="video" /> </View>进阶应用:结合其他标签构建完整标注场景
<Video>标签通常与以下控制标签组合使用,构成完整的视频标注工作流:
视频目标跟踪(VideoRectangle + Labels)
VideoRectangle 标签专门为视频目标跟踪设计,需要与<Video>和<Labels>配合使用。仓库内置的视频目标跟踪模板:
<View> <Labels name="videoLabels" toName="video" allowEmpty="true"> <Label value="Man" background="blue"/> <Label value="Woman" background="red"/> <Label value="Other" background="green"/> </Labels> <!-- 请仔细指定 FPS,它将用于该项目所有视频 --> <Video name="video" value="$video" framerate="25.0"/> <VideoRectangle name="box" toName="video" /> </View>该模板特别注明:frameRate(此处写作framerate)会影响所有项目视频的帧号映射,务必按实际视频填写。编辑器仓库中的视频目标跟踪示例也是同样的结构(Labels + Video + VideoRectangle)。
视频帧级分类(TimelineLabels)
帧级分类模板在视频下方的时间轴上逐帧打标签:
<View> <TimelineLabels name="videoLabels" toName="video"> <Label value="Movement" background="#c813ec"/> <Label value="Still" background="#1d81cd"/> <Label value="Slow Motion" background="#54d651"/> </TimelineLabels> <Video name="video" value="$video" timelineHeight="120" /> </View>其中timelineHeight="120"用于放大带标注区域的时间轴高度(默认 64),方便帧级精细标注。Video 模型中的timelineControl视图(见 Video.js)会通过toNames自动关联类型包含timeline的控制标签。
时间轴分段(Timeline 与音视频同步)
仓库还提供了视频时间轴分段示例:由于 Video 标签本身不直接提供时间段选择控件,该示例通过<Audio>标签的sync机制与 HTML 视频叠加,实现逐段标注。这印证了sync参数的用途——将播放状态(播放/暂停/跳转)同步到指定对象(见 Video.js 中的triggerSync/handleSync等同步动作实现)。
数据准备注意事项
上述模板的示例数据均以"/static/samples/opossum_snow.mp4"作为$video字段值。在实际项目中,value可以是:
- 直接指向视频文件的 URL(如对象存储、本地文件存储地址);
- 引用任务数据字段(
$video),字段值由 数据导入 或外部存储(io_storages)提供。
小结
使用<Video>标签的关键要点:
- 格式先行:统一转码为 MP4 + H.264 + AAC、恒定帧率(推荐 30 fps),并保证音视频流时长一致,这是浏览器播放与帧数计算正确的前提;
- 参数按需配置:
frameRate(可用$fps引用任务数据)、timelineHeight、muted、sync、播放速度参数等均可在标签上直接声明,播放器初始化时会自动做帧率归一化与速度钳制; - 组合使用:分类用
<Choices>、转写用<TextArea>、目标跟踪用<VideoRectangle>+<Labels>、帧级分类用<TimelineLabels>,所有控制标签都通过toName指向<Video>的name; - 源码可追溯:标签的默认值与参数校验逻辑可在 web/libs/editor/src/tags/object/Video/Video.js 中查看,相关标注模板位于 label_studio/annotation_templates/videos/。
【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考