NVIDIA DALI pipeline使用readers.video无法加载.mp4视频问题求助
问题原因与解决方案
核心错误点
你对fn.readers.video接口的file_root参数传值不符合接口要求,直接触发了目录打开失败报错:
RuntimeError: 构建pipeline时出现严重错误:构造算子时出错:readers__Video 抛出异常:[/opt/dali/dali/operators/reader/loader/video_loader.cc:117] 断言"dir != nullptr"失败:目录['sintel_trailer-720p_0.mp4']无法打开。
file_root参数要求传入存放所有待读取视频文件的文件夹路径,不是单个视频的路径,也不是包含视频文件名的列表。你传入了包含单视频文件名的列表,DALI会尝试将文件名作为目录打开,自然触发报错。
修正方案
你可以按以下逻辑调整代码:
- 将
file_root改为视频文件所在的文件夹路径,若视频存放在当前工作目录,直接传./即可 - 如果需要只读取指定的mp4文件,可额外添加
file_filters参数过滤目标文件
修正后代码示例
import os import numpy as np from nvidia.dali import pipeline_def import nvidia.dali.fn as fn import nvidia.dali.types as types batch_size=2 sequence_length=8 initial_prefetch_size=16 # 此处改为视频所在的文件夹路径,示例为当前工作目录 video_root = "./" # 可选:指定只读取目标mp4文件,多文件可加多个过滤规则 target_file_filter = ["sintel_trailer-720p_0.mp4"] n_iter=6 @pipeline_def def video_pipe(file_root, file_filters): video, labels = fn.readers.video(device="gpu", file_root=file_root, # 新增过滤参数筛选目标文件 file_filters=file_filters, sequence_length=sequence_length, random_shuffle=True, initial_fill=initial_prefetch_size) return video, labels pipe = video_pipe(batch_size=batch_size, num_threads=2, device_id=0, file_root=video_root, file_filters=target_file_filter, seed=12345) pipe.build()
额外验证项
如果调整参数后仍有问题,可依次确认:
- 传入的
file_root路径为有效路径,优先传绝对路径避免相对路径匹配错误 - 本地ffmpeg依赖完整,DALI的视频读取依赖ffmpeg解码能力
- 目标mp4文件编码格式为DALI支持的H.264、H.265等常规视频编码
内容的提问来源于stack exchange,提问作者Abhijit Manepatil
相关产品推荐
相关产品推荐

