【问题标题】:Python - getting duration of a video with ffprobePython - 使用 ffprobe 获取视频的持续时间
【发布时间】:2015-06-22 10:19:44
【问题描述】:

我是 Python 新手,我正在尝试使用 ffprobe 获取文件视频的持续时间(以秒为单位)。 调用如下指令

ffprobe -i video.mp4 -show_entries format=duration -v quiet -of csv="p=0"

在 CMD 上,我可以在几秒钟内得到正确的结果,但是如果我在 python 中使用以下命令调用相同的指令:

import subprocess
duration = subprocess.call(['ffprobe', '-i', 'video.mp4', '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv="p=0"'])
print duration

它返回 1。 有没有办法通过 Python 也获得正确的结果? 提前谢谢你。

【问题讨论】:

    标签: python windows cmd ffprobe


    【解决方案1】:
    from subprocess import check_output
    
    file_name = "movie.mp4"
    
    #For Windows
    a = str(check_output('ffprobe -i  "'+file_name+'" 2>&1 |findstr "Duration"',shell=True)) 
    
    #For Linux
    #a = str(check_output('ffprobe -i  "'+file_name+'" 2>&1 |grep "Duration"',shell=True)) 
    
    a = a.split(",")[0].split("Duration:")[1].strip()
    
    h, m, s = a.split(':')
    duration = int(h) * 3600 + int(m) * 60 + float(s)
    
    print(duration)
    

    【讨论】:

    • 投反对票很好,但请礼貌解释原因!上面发布的代码是对 OP 提出的问题的明确解决方案。
    • 我真的不知道,但怀疑由于原始输出解析,如果格式化输出可用,通常不建议这样做。输出字符串在未来版本中更频繁地更改,并且通常也本地化 (l10n/i18n)。
    【解决方案2】:

    问题在于双引号参数 p=0 ,使用 % 对其进行格式化,我还将 subprocess.call 更改为 subprocess.check_output 以将命令的输出存储在字符串中:

    import subprocess
    duration = subprocess.check_output(['ffprobe', '-i', 'video.mp4', '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")])
    print(duration)
    

    输出:

    8.824000
    

    或者你可以这样做:

    import subprocess
    result = subprocess.Popen(["ffprobe", "video.mp4"],stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
    for x in result.stdout.readlines():
          if "Duration" in x:
              print(x[12:23])
              break
    

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2019-03-26
      • 2015-11-24
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2016-10-08
      相关资源
      最近更新 更多