尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CVAT 客户端视频解码基石:cvat-data 中 Broadway.js 第三方组件的来源、打补丁方案与重建指南
CVAT 客户端视频解码基石cvat-data 中 Broadway.js 第三方组件的来源、打补丁方案与重建指南【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat本文围绕cvat-data/src/ts/3rdparty/目录下的三个第三方文件Decoder.worker.js、mp4.js、avc.wasm展开说明它们从 Broadway.js 引入的原因、在 CVAT 前端服务端下发视频 chunk、客户端拆帧渲染这一核心流程中扮演的角色以及为什么需要为它们编写 patch 才能在 Node 环境中运行同时给出完整的基于 Emscripten 的从零重建avc.wasm与Decoder.cjs的可执行步骤并结合FrameDecoder源码解析其真实调用链。读完本文你将掌握这批第三方组件的来龙去脉并具备独立重新构建与替换它们的能力。一、3rdparty 目录里存了什么三个来自 Broadway.js 的文件在 cvat-data/src/ts/3rdparty/ 目录下除本文档外存放着三个文件文件作用Decoder.worker.js在 Web Worker 中运行的 H.264AVC解码器封装负责把 NAL 单元解码为原始像素帧并向主线程回传解码结果mp4.jsMP4 容器解析器提供MP4Reader、Bytestream等类用于从 MP4 字节流中抽取轨道track、样本sample与 SPS/PPS 参数集avc.wasm由 C 语言编写的 AVC 解码核心经 Emscripten 编译得到的 WebAssembly 二进制是实际执行解码的计算内核这三个文件均来自 Broadway.js 中可以看到var wasmBinaryFile 3rdparty/avc.wasm这一行说明 Worker 是通过相对路径按约定定位 wasm 二进制的而 webpack.config.cjs 中的CopyPlugin会在构建 cvat-data 时把src/ts/3rdparty/avc.wasm复制到产物目录的assets/3rdparty/下保证运行时路径解析一致。二、为什么要自带第三方组件客户端拆帧解码的技术动机Broadway.js 作者没有发布 npm 包这是把源码直接纳入仓库的最直接原因但更本质的原因在于 CVAT 的数据加载架构。CVAT 前端并不会一次性拿到整段视频而是从服务端按chunk数据块的方式获取视频片段然后在客户端把它们解码并拆分成单帧供标注画布逐帧渲染。这一流程在 cvat-data/src/ts/cvat-data.ts 的FrameDecoder类中体现得淋漓尽致BlockType枚举区分了两种数据块类型MP4VIDEO mp4video与ARCHIVE archive分别走视频解码与 ZIP 解包两条路径在startDecode()中当blockType BlockType.MP4VIDEO时代码通过new Worker(new URL(./3rdparty/Decoder.worker, import.meta.url))拉起解码 Worker并用MP4Reader(new Bytestream(block))解析收到的 MP4 chunk见 cvat-data.ts随后从 MP4 的stsd.avc1.avcC中取出 SPS/PPSavc.sps[0]、avc.pps[0]先把这两个参数集postMessage给 Worker再逐样本取出 NAL 单元逐个投递video.getSampleNALUnits(sample).forEach(...)Worker 解码完成后回传{ buf, width, height }主线程再通过FrameDecoder.cropImage按目标渲染尺寸裁剪并用createImageBitmap生成ImageBitmap供画布直接使用。也就是说mp4.js负责读懂MP4 chunk 的结构Decoder.worker.jsavc.wasm负责真正解码三者合在一起构成了 CVAT 视频标注前端的客户端解码链路。三、Node 环境兼容性问题与 patch 方案将第三方代码直接放入仓库后CVAT 还面临一个工程化难题cvat-data 需要能在 Node 环境中运行例如用于调试、或用于执行单元测试。但 Broadway.js 原始代码无法做到这一点原因包括即使借助browser-env这类提供合成浏览器环境的包也无法完整模拟其运行前提代码中大量使用了 canvas 相关能力而 webpack 在 Node.js 下无法正确打包二进制的 canvas 原生包还存在其他与浏览器环境强耦合的假设。因此 CVAT 决定为 Broadway.js 编写一个 patch 文件对原始源码做少量修改以适配自身的在 Node 中也能跑的使用场景详见 cvat-data/src/ts/3rdparty/README.md。注意avc.wasm是二进制产物无法直接 patch因此 patch 的对象是可读源码与构建脚本make.py——通过修改构建参数重新编译出适配后的 wasm 与Decoder.cjs从源头解决问题。四、完整重建指南从 Emscripten 到 Broadway.js当需要升级解码器、修复 bug 或适配新的视频规格时可按以下步骤从零重建avc.wasm与Decoder.cjs。步骤 1安装并激活 Emscripten SDKfastcomp 版本git clone emscripten-core/emsdk 仓库 cd emsdk./emsdk install latest-fastcomp./emsdk activate latest-fastcomp这里使用的是latest-fastcompfastcomp 是 Emscripten 的旧版编译器后端Broadway.js 的构建脚本与之配套。步骤 2克隆 Broadway.js 并进入 Decoder 目录git clone mbebenita/Broadway 仓库 cd Broadway/Decoder步骤 3编辑make.py调整编译选项这是整个重建流程中技术含量最高的一步需要修改四处移除或注释掉以下两个选项它们与浏览器/Worker 运行环境不兼容-s, NO_BROWSER1,-s, PRECISE_I64_MATH0,从EXPORTED_FUNCTIONS列表中删除HEAP8、HEAP16、HEAP32因为这些内存视图在模块外部不再需要导出增大总内存以支持 4K 视频解码4K 分辨率的帧缓冲区会显著超出默认内存上限-s, TOTAL_MEMORY str(100*1024*1024),文档同时提示也可以尝试启用ALLOW_MEMORY_GROWTH但该选项未经测试不作为推荐路径新增以下两个选项将产物从纯浏览器脚本改为 Web Worker 专用 WebAssembly 形态-s, ENVIRONMENTworker,-s, WASM1,步骤 4激活 Emscripten 环境并构建. /tmp/emsdk/emsdk_env.shpython2 make.py注意构建脚本基于 Python 2 编写需要 Python 2 环境这里以/tmp/emsdk为例实际路径以你步骤 1 的克隆位置为准。步骤 5拷贝产物到 cvat-data 的 3rdparty 源码目录cd ..cp Player/avc.wasm Player/Decoder.cjs Player/mp4.js CVAT_FOLDER/cvat-data/src/js/3rdparty其中CVAT_FOLDER指 CVAT 仓库根目录。Decoder.cjs是给 Node/CommonJS 环境使用的模块化产物Decoder.worker.js则是放入 cvat-data/src/ts/3rdparty/ 中供import.meta.url引用的 Worker 版本两者由同一个构建流程产出、按使用场景区分放置。五、源码侧印证这些组件到底是怎么被用起来的最后回到调用端把存文件和用文件串起来模块入口cvat-data/src/ts/cvat-data.ts第 7 行直接import { MP4Reader, Bytestream } from ./3rdparty/mp4说明mp4.js是以 ES Module 方式被FrameDecoder直接消费的解析reader.read()完成后代码读取reader.tracks[1]视为视频轨Broadway 约定 track id 1 为视频、2 为音频见 mp4.js 中traceSamples的注释并通过getSampleCount()/getSampleNALUnits(sample)枚举全部视频样本解码所有 NAL 单元与 SPS/PPS 参数集经postMessage送入Decoder.worker.js创建的 WorkerWorker 内部加载avc.wasm执行 H.264 解码回传bufRGBA 像素数据、width、height渲染主线程依据renderWidth/renderHeight与解码尺寸计算缩放系数调用cropImage裁剪出正确宽高比createImageBitmap生成位图后存入decodedChunks缓存由cachedChunksLimit控制上限cleanup()负责按 LRU 语义回收打包webpack 的CopyPlugin确保avc.wasm被原样复制进产物assets/3rdparty/与 Worker 内相对路径3rdparty/avc.wasm严格对应。这一整条链路说明三个看似躺在3rdparty目录里的文件实则是 CVAT 客户端视频标注性能的关键依赖。理解它们来自哪里、为何被 patch、如何重建也就掌握了维护这套解码链路的基本功。六、小结Decoder.worker.js、mp4.js、avc.wasm来自 Broadway.js因无 npm 包而以 vendoring 方式进入 cvat-data/src/ts/3rdparty/它们支撑的是服务端下发 MP4 chunk → 客户端解析 MP4 → Worker 内 H.264 解码 → 逐帧渲染的 CVAT 视频标注架构由于 Broadway.js 无法在 Node 环境直接运行canvas 二进制打包、浏览器 API 耦合等问题CVAT 通过 patch 源码与构建参数的方式加以适配重建时需注意make.py中ENVIRONMENTworker、WASM1、TOTAL_MEMORY四个关键改动点以及Decoder.cjs与Decoder.worker.js的用途差异相关实现可继续在 cvat-data/src/ts/cvat-data.ts、cvat-data/webpack.config.cjs 与 cvat-data/package.json 中深入阅读。【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

verl 如何覆盖 Qwen 模型的 RoPE Scaling 配置以支持更长上下文训练

verl 如何覆盖 Qwen 模型的 RoPE Scaling 配置以支持更长上下文训练

verl 如何覆盖 Qwen 模型的 RoPE Scaling 配置以支持更长上下文训练 【免费下载链接】verl verl/HybridFlow: A Flexible and Efficient RL Post-Training Framework 项目地址: https://gitcode.com/GitHub_Trending/ve/verl 有些模型(例如文档中给出的 Qwe…

📅 2026/9/14 6:40:43
从源码安装与校验 Apache Airflow Atlassian Jira Provider(apache-airflow-providers-atlassian-jira)

从源码安装与校验 Apache Airflow Atlassian Jira Provider(apache-airflow-providers-atlassian-jira)

从源码安装与校验 Apache Airflow Atlassian Jira Provider(apache-airflow-providers-atlassian-jira) 【免费下载链接】airflow Apache Airflow - A platform to programmatically author, schedule, and monitor workflows 项目地址: https://gitco…

📅 2026/9/14 6:40:43
MATLAB图像分割算法实战:从阈值到活动轮廓的完整指南

MATLAB图像分割算法实战:从阈值到活动轮廓的完整指南

简介:这是一份面向图像分割方向学习者及初/中级开发者的MATLAB程序源码包,基于MATLAB实现图像分割功能,代码从图像读取、预处理、算法处理到结果输出均有覆盖,并包含自动分割、交互式前景背景选取、Graph Cut图割分割等经典方法&a…

📅 2026/9/14 6:35:43
MORE NEWS

更多资讯

📰

F405/F722/H743飞控选型指南:性能与场景精准匹配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

TiKV 模糊测试(Fuzzing)实战指南:fuzz CLI 与 libFuzzer / Honggfuzz / AFL 测试目标全解析

TiKV 模糊测试(Fuzzing)实战指南:fuzz CLI 与 libFuzzer / Honggfuzz / AFL 测试目标全解析 【免费下载链接】tikv Distributed transactional key-value database, originally created to complement TiDB 项目地址: https://gitcode.com/…

📰

claude-obsidian 空章节检测原理与实战:从测试夹具到 lint 引擎实现

claude-obsidian 空章节检测原理与实战:从测试夹具到 lint 引擎实现 【免费下载链接】claude-obsidian Self-organizing AI second brain for Obsidian Claude Code. Drop any source and Claude reads, links, and files it into one connected knowledge graph o…

📰

SEO优化:2023年技术变革与未来趋势

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Go语言实现圆形排序算法:原理、优化与应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

docker-minecraft-server 使用 Quilt 模组加载器:TYPE=QUILT 部署指南

docker-minecraft-server 使用 Quilt 模组加载器:TYPEQUILT 部署指南 【免费下载链接】docker-minecraft-server Docker image that provides a Minecraft Server for Java Edition that automatically installs/upgrades versions, modloaders, modpacks and more …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬