1. Bitstream Filters(视频比特流过滤器)
在不解码、不重编码的前提下,直接修改已压缩的视频 Packet 数据。封装自 FFmpeg AVBSFContext,是视频转封装(Remuxing)和流媒体推送的核心组件。
核心 API
典型视频场景
H.264/H.265 格式转换:MP4 (AVCC/长度前缀) ↔ Annex B (起始码前缀),用于
.ts封装或 RTMP 推流。VP9/AV1 超帧拆分:将聚合帧拆分为独立 Packet,适配低延迟传输或逐帧分析。
SEI/NALU 元数据操作:注入、剥离或修改编码层元信息,不影响画质。
时间基/PTS 修正:在比特流层面修复时间戳异常,避免重编码开销。
⚠️ 关键注意
Seek 后必须
flush():否则残留旧缓冲导致花屏、解码失败。EOF 排空:流结束时传
None调用filter()+flush(),确保缓存帧全部输出。遍历返回列表:不可直接取
[0],某些过滤器会缓存或拆分数据。
2. Buffer Protocol(视频零拷贝内存接口)
av.buffer.Buffer 是所有支持 Python Buffer Protocol 对象的基类(如视频 Packet、Plane),提供 C 内存与 Python 数据世界之间的零拷贝桥梁。
核心 API
典型视频场景
GPU 加速管线:通过
buffer_ptr将视频帧内存直接传给 CUDA / TensorRT / OpenCL,避免 CPU-GPU 数据中转。NumPy 零拷贝交换:解码后的视频 Plane 直接转为 NumPy 数组供 AI 推理,或反向写入编码帧。
自定义 Packet 处理:在 Packet 级别做加密、混淆、水印注入等原位操作,比解包再打包快一个数量级。
内存池复用:流式处理中通过
update()原地替换数据,减少 GC 压力。
⚠️ 关键注意
生命周期安全:
buffer_ptr随所属 Packet/Frame 回收而失效,禁止手动 free。只读限制:Demux 出的 Packet 通常只读,需先 copy 或新建
av.Packet()才能update()。大小约束:
update()输入长度 ≤buffer_size,超出抛异常,不足部分不清零。非线程安全:多线程操作同一 Buffer 需自行加锁。
3. 视频处理开发排查备忘
💡 核心原则:视频处理优先使用 BSF 做无损变换,用 Buffer Protocol 做零拷贝数据交换,两者结合可构建接近原生 C 性能的高吞吐视频管线。所有涉及 Packet/Frame 的操作,始终假设返回值为列表并完整遍历。