在Google Colab中创建torchvision.io.VideoReader时触发AttributeError
解决Colab中torchvision.io.VideoReader的AttributeError问题
问题根源
你遇到的AttributeError: 'ImportError' object has no attribute 'open'本质是缺少pyav依赖库。torchvision的VideoReader默认使用pyav作为视频处理后端,但Colab默认运行环境并未预装该库,导致导入av模块失败,此时av变量被错误赋值为ImportError对象,调用av.open就会触发这个异常。
解决方案
1. 安装pyav库
在Colab的代码单元格中运行以下命令:
!pip install av
2. 重启运行时
安装完成后,通过Colab顶部菜单选择Runtime -> Restart runtime,确保新安装的库生效。
3. 验证安装
运行以下代码确认pyav正常导入:
import av print(av.__version__)
如果输出正常版本号(如10.0.0),说明安装成功。
优化后的完整代码
以下是修复依赖并优化路径处理、添加帧提取逻辑的代码:
import torch import torchvision import os from google.colab import drive # 挂载Google Drive drive_loc = '/content/drive' if os.path.exists(drive_loc): print("Drive already mounted") else: print("Mounting drive") drive.mount(drive_loc) # 视频目录与输出帧目录 video_dir = os.path.join(drive_loc, "MyDrive", "videos") frame_output_dir = os.path.join(drive_loc, "MyDrive", "video_frames") os.makedirs(frame_output_dir, exist_ok=True) # 遍历处理视频文件 for filename in os.listdir(video_dir): file_path = os.path.join(video_dir, filename) if not os.path.isfile(file_path): continue print(f"Processing {filename}...") # 初始化VideoReader video = torchvision.io.VideoReader(file_path, "video") # 打印视频元数据 print(video.get_metadata()) # 提取并保存帧 frame_count = 0 for frame_data in video: # 获取帧张量(形状:C, H, W) frame_tensor = frame_data['data'] # 转换为PIL图片并保存 pil_img = torchvision.transforms.ToPILImage()(frame_tensor) save_path = os.path.join(frame_output_dir, f"{os.path.splitext(filename)[0]}_frame_{frame_count}.png") pil_img.save(save_path) frame_count += 1 # 可选:限制提取帧数(例如仅提取前10帧) # if frame_count >= 10: # break print(f"Finished extracting {frame_count} frames for {filename}")
备选方案:切换后端
如果pyav安装后仍有问题,可以尝试指定torchscript作为VideoReader的后端:
video = torchvision.io.VideoReader(file_path, "video", backend="torchscript")
不过pyav后端支持更多视频格式和功能,优先推荐使用pyav方案。
内容的提问来源于stack exchange,提问作者occipita
相关产品推荐
相关产品推荐

