Rerun VideoCodec 组件完全指南:AV1/H.264/H.265/VP8/VP9 编码标识与位流格式要求

发布时间:2026/9/16 21:03:15
Rerun VideoCodec 组件完全指南:AV1/H.264/H.265/VP8/VP9 编码标识与位流格式要求
Rerun VideoCodec 组件完全指南AV1/H.264/H.265/VP8/VP9 编码标识与位流格式要求【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerunVideoCodec 是 Rerun 数据模型中用于标识VideoSample压缩数据编码格式的核心组件在日志多模态机器人视觉数据、实时视频流及 MP4/视频样本回放场景中起到解码器选择依据的关键作用。读完本文你将掌握 VideoCodec 全部 5 个变体AV1、H264、H265、VP8、VP9的枚举值、fourcc 编码原理、各自的位流格式规范Annex B、Low Overhead Bitstream并了解它在VideoStream原型中的实际用法与底层 Rust 实现。VideoCodec 是什么VideoCodec是一个 Rerun 组件Component其职责只有一个声明存储在components.VideoSample中的视频压缩数据是由哪种编解码器编码的。它是 Rerun 视频子系统数据模型中的元数据关键点——只有知道了编码格式Viewer 才能为解码器选择正确的配置、字节流格式与解码路径。在使用前需要特别注意两点见 视频类型定义状态为 unstable该类型被标记为不稳定#[rerun(state unstable)]未来可能发生重大变更且变更可能导致数据不再向后兼容日志数据时需谨慎对待。平台依赖Rerun Viewer 对这些编码器的支持情况因平台而异例如 Web/WASM 端与原生端可用的硬件/软件解码能力不同日志前应确认目标平台的解码能力。从源码结构看整个视频支持体系围绕这一组件展开VideoCodec与VideoSample压缩数据本身、IsKeyframe关键帧标记、VideoStream组合上述组件的原型共同构成 Rerun 的视频流数据通路。五个变体与枚举值VideoCodec一共定义了 5 个变体每个变体对应一个具体的编码标准。下表汇总了全部变体及其枚举值整理自 video_codec.def.rs 与 video_codec.rs变体全称枚举值十六进制对应 fourcc位流格式AV1AOMedia Video 10x61763031av01Low Overhead BitstreamOBU 序列H264Advanced Video CodingAVC0x61766331avc1Annex BH265High Efficiency Video CodingHEVC0x68657631hev1Annex BVP8VP80x76703038vp08编码器原生格式VP9VP90x76703039vp09编码器原生格式AV1 0x61763031AOMedia Video 1由开放媒体联盟AOMedia推出的现代开放视频编码标准。使用该编码器的VideoSample必须遵循Low Overhead Bitstream 格式AV1 规范第 5.2 节定义。具体要求如下每个样本应组织为一系列OBUOpen Bitstream Units长度需足以解码至少一帧视频包含**关键帧KEY_FRAME**的样本必须在KEY_FRAMEOBU 之前包含一个序列头 OBUsequence header OBU以便解码器提取帧尺寸、位深与色彩信息特别地INTRA_ONLY帧不视为关键帧——因为它们可能引用已有的解码器状态不能作为随机访问点。H264 0x61766331高级视频编码AVC/H.264目前应用最广泛的视频编码标准之一。使用该编码器的VideoSample必须遵循Annex B 规范组织字节流。需要注意Annex B 与 MP4 文件中常见的AVCC 格式不同——AVCC 使用长度前缀 NAL且参数集存放在容器元数据中关键帧IDR必须包含SPSSequence Parameter Set解码器才能正确初始化。H265 0x68657631高效视频编码HEVC/H.265H.264 的继任标准。与 H264 一致VideoSample必须遵循Annex B 规范同样与 MP4 中的 HVCC/AVCC 长度前缀格式不同其关键帧IRAP必须包含SPSSequence Parameter Set。VP8 与 VP9VP8、VP9 是 Google 主导的开源视频编码标准。这两个变体在文档中仅声明了枚举值与 fourcc未规定额外的容器内组织约束——从 demux/mod.rs 的实现看AV1、VP8、VP9 的样本数据在流式传输时按原样传递chunk.data.clone()无需类似 H.264/H.265 的格式转换。枚举值即 fourcc大端字节序原理VideoCodec各变体的枚举值并不是随意选择的整数而是WebCodec 字符串对应的 fourcc 码大端字节序。以 H264 为例WebCodec 注册的编码字符串为avc1四个字符a、v、c、1的 ASCII 码分别是0x61、0x76、0x63、0x31按大端big endian拼接即为0x61766331。同理可验证其他变体av01 → 0x61763031、hev1 → 0x68657631、vp08 → 0x76703038、vp09 → 0x76703039。这样的设计让枚举值自带语义一个u32整数即可无损表达编码器标识便于在网络传输、Arrow 列式存储与跨语言绑定中高效传递。该设计在 Rust 端也有直接验证在 video_codec.rs 中try_from_integer反查变体以及 video_codec_ext.rs 中的try_from_u32辅助函数都维护着同样的整数映射表并在test_video_codec_u32_conversion单元测试中逐一断言枚举值 → u32 → 枚举值的往返一致性。Arrow 数据类型与序列化在 Rerun 的数据模型中所有组件都以 Arrow 列式格式存储与传输。VideoCodec的 Arrow 数据类型被定义为UInt32即每个变体直接以u32整数存储见 video_codec.rs 的arrow_data_type()实现。序列化时写入ToArrow实现将枚举逐一遍历映射为PrimitiveArrayUInt32Type通过*datum as u32直接取底层整数值读取FromArrow实现将UInt32Array的每个值经try_from_integer反查为枚举遇到未定义的整数值会返回missing_union_arm反序列化错误。从代码结构可以推断VideoCodec还实现了 Rerun 的Enum反射 traitreflection::Enum提供了variants()列出全部 5 个变体与docstring_md()返回每个变体的文档字符串等能力供代码生成器、UI 面板与外部工具统一消费。此外组件全名为rerun.components.VideoCodecC、Python、Rust 三种 SDK 均通过各自的类型绑定暴露同名 API对应生成代码位于rerun_cpp、rerun_py/rerun_sdk/rerun/components 与 crates/store/re_sdk_types/src/components 目录。与解码库内部枚举的互转在 Rerun 的模块划分中VideoCodecSDK 数据类型与解码库re_video内部的VideoCodec是两套不同的枚举前者面向日志 API后者面向解码管线。二者通过 video_codec_ext.rs 中的TryFrom/From实现相互转换re_video::VideoCodec → rerun VideoCodec5 个编码变体一一对应解码库中还存在一个特殊的ImageSequence(OptionString)变体表示图像序列而非真正视频携带图片 MIME 类型如image/png它无法转换为组件层的VideoCodec转换会返回Not a real video错误rerun VideoCodec → re_video::VideoCodec反向转换则是全映射不会失败。解码库侧crates/utils/re_video/src/demux/mod.rs进一步利用该枚举做格式适配VideoDataDescription::sample_data_in_stream_format针对 H.264/H.265 会读取 MP4 的 stsd 框AVCC/HVCC调用write_avc_chunk_to_annexb/write_hevc_chunk_to_annexb导出自 re_video/src/lib.rs将容器内的长度前缀 NAL 解包为解码器需要的 Annex B 流而 AV1/VP8/VP9 样本则原样保留。这与上文各变体的位流格式要求完全呼应。在 VideoStream 原型中的使用VideoCodec是VideoStream原型的必需字段Required。VideoStream的完整字段结构如下字段类型必要性说明codecVideoCodecRequired视频编码格式sampleVideoSampleRecommended压缩视频样本原始 chunkis_keyframeIsKeyframeOptional当前样本是否为关键帧opacityOpacityOptional透明度draw_orderDrawOrderOptional绘制顺序使用约定见 video_stream.py 与视频流文档除sample外的所有组件通常在每个实体上只静态static日志一次而sample则随时间轴逐帧重复日志。实战示例边编码边流式日志视频仓库提供了完整的可运行示例 docs/snippets/all/archetypes/video_stream_synthetic.pyPython基于av/PyAV 编码管线展示了如何选择VideoCodec.H265或 H264并以 Annex B 流式格式将编码帧直接推送进 Rerunimport av import numpy as np import rerun as rr fps 30 duration_seconds 4 width, height 480, 320 codec rr.VideoCodec.H265 # rr.VideoCodec.H264 formats {rr.VideoCodec.H265: hevc, rr.VideoCodec.H264: h264} encoders {rr.VideoCodec.H265: libx265, rr.VideoCodec.H264: libx264} rr.init(rerun_example_video_stream_synthetic) # 以 /dev/null 为目标容器产出纯 Annex B 字节流 container av.open(/dev/null, w, formatformats[codec]) stream container.add_stream(encoders[codec], ratefps) stream.width, stream.height width, height # Rerun 视频流暂不支持 B 帧低延迟流式场景通常也不建议开启 stream.max_b_frames 0 # codec 只静态日志一次它天然不会变化 rr.log(video_stream, rr.VideoStream(codeccodec), staticTrue) for frame_i in range(fps * duration_seconds): img create_example_video_frame(frame_i) # 生成一帧 numpy 图像 frame av.VideoFrame.from_ndarray(img, formatrgb24) for packet in stream.encode(frame): if packet.pts is None: continue rr.set_time(time, durationfloat(packet.pts * packet.time_base)) rr.log(video_stream, rr.VideoStream.from_fields(samplebytes(packet))) # 冲刷编码器尾帧 for packet in stream.encode(): if packet.pts is None: continue rr.set_time(time, durationfloat(packet.pts * packet.time_base)) rr.log(video_stream, rr.VideoStream.from_fields(samplebytes(packet)))示例中两个值得注意的实操要点max_b_frames 0示例注释明确指出 Rerun 视频流暂不支持 B 帧同时 B 帧在低延迟流式场景中一般也不推荐B 帧会引入帧重排增加解码延迟与日志复杂度codec静态日志编码格式在流生命周期内不会改变因此一次性以staticTrue日志避免逐帧重复写入元数据。日志完成后可在 Spatial2DView、Spatial3DView需挂到投影下或 DataframeView 中查看该视频流并使用VideoFrameReference按 Viewer 当前时间轴定位到具体帧。小结与选型建议VideoCodec以极简的u32表示承载了视频子系统最关键的分派信息Viewer 依据它选择解码器、判定字节流组织方式Annex B / Low Overhead Bitstream、决定是否需要对 MP4 容器样本做格式转换。在实际使用中H.264/H.265生态成熟、兼容性最好但必须保证样本是 Annex B 格式且关键帧带 SPSH.265 还涉及 VPS/PPS见解码库的 HVCC 处理逻辑AV1压缩效率更高但必须遵循 Low Overhead Bitstream 规范关键帧样本需带序列头 OBU且需注意INTRA_ONLY帧不算关键帧VP8/VP9实现简单样本原样传递适合对兼容性有顾虑但希望规避容器格式细节的场景由于编码器支持是平台相关的跨平台分发录制数据前建议先确认目标 Viewer 平台的解码能力原生 vs Web/WASM。该组件由 crates/build/re_type_definitions/rerun/components/video_codec.def.rs 单一事实源定义通过re_types_builder自动生成 Rust / Python / C 三端绑定因此三端 API 与本文描述的枚举值、位流约束始终保持一致。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考