You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用ffprobe获取视频时长报ValueError无法转字符串为float怎么解决

报错原因
  1. 命令拼接缺少空格:构造ffprobe命令时,nokey=1参数末尾和视频路径video_path之间没有空格分隔,导致ffprobe将视频路径的内容识别为nokey参数的取值。原本nokey应该是布尔类型的1/0,现在变成了1+视频路径的字符串,参数解析失败,不会输出正常的时长数值。
  2. 连锁报错:因为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:45:05