鴥彼晚风
发布于 2026-07-01 / 2 阅读
0
0

PyAV 枚举与标志位 (Enums & Flags) 速查手册

1. 核心概念区分

PyAV 对 FFmpeg 的整数常量进行了 Pythonic 封装,保留了向后兼容性(支持与字符串/整数直接比较和赋值)。

类型

基类

语义

运算符

典型视频属性

Enumeration

EnumItem

单选值,同一时刻仅一个有效

==, =

skip_frame, thread_type

Flags

EnumFlag

位掩码集合,多个标志可同时激活

|=, &, 布尔属性

flags, flags2, capabilities

💡 兼容特性:两种类型均可直接与 字符串(名称)整数(值) 进行比较和赋值,无需显式转换。这是 PyAV 区别于标准库 enum 的关键设计。


2. Enumeration(单选枚举)操作

适用于互斥选项,如跳帧策略、线程模式等。

读取与比较

cc = stream.codec_context

# 获取名称和整数值
cc.skip_frame.name   # 'DEFAULT'
cc.skip_frame.value  # 0

# ✅ 三种等价比较方式
cc.skip_frame == 'DEFAULT'   # 按名称
cc.skip_frame == 0           # 按整数值
cc.skip_frame == av.codec.context.SkipType.DEFAULT  # 按对象

赋值

# ✅ 三种等价赋值方式
cc.skip_frame = 'NONKEY'     # 字符串(最简洁,推荐)
cc.skip_frame = 32           # 整数
cc.skip_frame = SkipType.NONKEY  # 枚举对象

视频常用单选枚举

属性

所属类

常用值

用途

skip_frame

SkipType

NONE, NONKEY, BIDIR

解码跳帧策略

thread_type

ThreadType

AUTO, FRAME, SLICE

多线程解码模式

pix_fmt

-

'yuv420p', 'nv12'

像素格式(部分API)


3. Flags(位掩码标志)操作

适用于可组合的布尔开关,如编码器标志、容器能力等。

设置标志

cc = stream.codec_context

# ✅ 三种等价设置方式(位或运算)
cc.flags |= cc.flags.OUTPUT_CORRUPT   # 对象
cc.flags |= 'GLOBAL_HEADER'           # 字符串(推荐)
cc.flags |= 0x400000                  # 整数值

# 同时设置多个
cc.flags |= 'GLOBAL_HEADER' | 'LOW_DELAY'

检测标志

# ✅ 位与检测(返回 True/False)
bool(cc.flags & 'OUTPUT_CORRUPT')      # True
bool(cc.flags & cc.flags.QSCALE)       # False

# ✅ 布尔属性快捷访问(最Pythonic,推荐)
cc.output_corrupt   # True
cc.qscale           # False

通过布尔属性设置

# ✅ 直接赋值 True/False,自动修改底层 flags
cc.qscale = True
cc.output_corrupt = False
# 等价于 cc.flags |= 'QSCALE' 和 cc.flags &= ~OUTPUT_CORRUPT

查看当前激活的标志

print(cc.flags)
# <av.codec.context.Flags:QSCALE|OUTPUT_CORRUPT|GLOBAL_HEADER(0x40000a)>
# 显示所有激活标志的名称和合并后的十六进制值

4. 视频开发高频 Flags 速查

CodecContext.flags

标志名

布尔属性

用途

GLOBAL_HEADER

global_header

SPS/PPS 放入 extradata

LOW_DELAY

low_delay

强制低延迟,禁用 B 帧缓冲

OUTPUT_CORRUPT

output_corrupt

输出损坏帧,容错播放

GRAY

gray

仅编解码灰度

BITEXACT

bitexact

确定性输出,测试用

DROPCHANGED

drop_changed

丢弃参数变化的帧

CodecContext.flags2

标志名

布尔属性

用途

FAST

fast

非标准加速

EXPORT_MVS

export_mvs

导出运动向量

SHOW_ALL

show_all

显示首关键帧前所有帧

IGNORE_CROP

ignore_crop

忽略 SPS 裁剪信息

Container.Flags

标志名

用途

GENPTS

生成缺失 PTS

FLUSH_PACKETS

每包刷盘,直播防丢

AUTO_BSF

自动添加比特流过滤器

DISCARD_CORRUPT

丢弃损坏帧

BITEXACT

确定性封装输出


5. ⚠️ 常见陷阱与最佳实践

陷阱

说明

正确做法

Flags 用 == 检测

flags == 'GLOBAL_HEADER' 仅在只有该一个标志时为 True

始终用 & 或布尔属性检测

Flags 用 = 赋值

flags = 'GLOBAL_HEADER'清除所有其他标志

始终用 |= 添加,&= ~ 移除

字符串拼写错误

'GLOABL_HEADER' 不会报错,静默失败

用 IDE 补全或先查 .name 确认

忽略返回值类型

flags & X 返回的是 Flag 对象而非 bool

bool() 包裹或在 if 中直接使用(truthy)

混用 Enum 和 Flag 语法

SkipType|= 或对 flags==

单选枚举用 =/==,标志位用 |=/&

忘记 PyAV 兼容性

过度使用 av.codec.context.Flags.XXX 长路径

直接用字符串 'GLOBAL_HEADER' 更简洁安全

💡 推荐风格

  • 设置 Flagscc.flags |= 'GLOBAL_HEADER' (字符串 + 位或)

  • 检测 Flagsif cc.global_header: (布尔属性)

  • 设置 Enumcc.skip_frame = 'NONKEY' (字符串赋值)

  • 检测 Enumif cc.skip_frame == 'NONKEY': (字符串比较)

这种风格兼顾了可读性、安全性和 PyAV 的兼容性设计意图。


评论