1. 核心概念区分
PyAV 对 FFmpeg 的整数常量进行了 Pythonic 封装,保留了向后兼容性(支持与字符串/整数直接比较和赋值)。
💡 兼容特性:两种类型均可直接与 字符串(名称) 或 整数(值) 进行比较和赋值,无需显式转换。这是 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 # 枚举对象
视频常用单选枚举
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
CodecContext.flags2
Container.Flags
5. ⚠️ 常见陷阱与最佳实践
💡 推荐风格
设置 Flags:
cc.flags |= 'GLOBAL_HEADER'(字符串 + 位或)检测 Flags:
if cc.global_header:(布尔属性)设置 Enum:
cc.skip_frame = 'NONKEY'(字符串赋值)检测 Enum:
if cc.skip_frame == 'NONKEY':(字符串比较)这种风格兼顾了可读性、安全性和 PyAV 的兼容性设计意图。