Python调用ffprobe获取视频时长报ValueError无法转字符串为float怎么解决
报错原因
- 命令拼接缺少空格:构造ffprobe命令时,
nokey=1参数末尾和视频路径video_path之间没有空格分隔,导致ffprobe将视频路径的内容识别为nokey参数的取值。原本nokey应该是布尔类型的1/0,现在变成了1+视频路径的字符串,参数解析失败,不会输出正常的时长数值。 - 连锁报错:因为ffprobe参数解析报错,没有返回时长的数字输出,读取到的
duration_command_output是空字符串,转换为float类型时直接触发ValueError。
修复方案
快速修复(仅修正拼接问题)
在ffprobe参数末尾加空格,同时给视频路径加双引号避免路径含空格时解析失败:
import os def get_video_duration(video_path: str) -> float: # nokey=1后加空格,视频路径用双引号包裹 duration_command_stream = os.popen( f'ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "{video_path}"' ) duration_command_output = duration_command_stream.read().strip() return float(duration_command_output)
更稳妥的修复(推荐使用subprocess模块)
用subprocess.run替代os.popen,参数传列表不需要手动处理空格和引号,还能避免命令注入风险:
import subprocess def get_video_duration(video_path: str) -> float: cmd = [ "ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", video_path ] result = subprocess.run(cmd, capture_output=True, text=True, check=True) return float(result.stdout.strip())
内容的提问来源于stack exchange,提问作者Shrimanta
相关产品推荐
相关产品推荐

