av.open(file, mode='r', **kwargs) -> Container
1. 基础参数说明
选项传递层级
options: 同时传递给容器和所有流(全局兜底)。container_options: 仅传递给容器(优先级高于options)。stream_options: 列表类型,按索引对应传递给每个流。
2. 高级用法
📷 设备采集 (libavdevice)
通过 format 参数指定设备驱动,file 传入设备标识符:
# macOS 打开摄像头
av.open(format='avfoundation', file='0')
# Linux V4L2 采集
av.open(format='v4l2', file='/dev/video0')
🔧 自定义 I/O (io_open)
用于 DASH 分片写入、内存缓冲或非标准协议场景。
def custom_io(url: str, flags: int, options: dict):
"""
Args:
url: 待打开的资源地址
flags: AVIO_FLAG_* 组合标志
options: 附加选项字典
Returns:
file-like object
"""
# 去除自定义协议前缀,获取真实路径
real_path = url.replace("customprotocol://", "")
return open(real_path, "wb" if flags & 2 else "rb")
# ⚠️ 必须添加协议前缀,防止 DASH 编码器回退到默认文件协议
av.open("customprotocol://manifest.mpd", "w", io_open=custom_io)
💡 为什么需要协议前缀?
DASH 编码器默认使用file://协议并创建临时文件。添加自定义前缀可拦截该行为,将 I/O 控制权交给io_open回调。
3. ⚠️ 关键注意事项
💡 开发排查备忘
打开失败但路径正确 → 尝试显式指定
format,自动检测可能对非标准扩展名失效。中文元数据乱码 → 检查
metadata_encoding,部分老旧文件使用gbk或latin-1。DASH 输出异常 → 确认
file参数包含自定义协议前缀且io_open正确剥离了该前缀。网络流卡死 → 未设置
timeout是首要嫌疑,生产环境必须配置超时。内存泄漏 → 再次强调:永远不要裸用
av.open()而不管理生命周期。