在python中获取特定目录中视频的总长度

har*_*shi 2 python windows video

我已经从Coursera.org下载了一堆视频,并将它们存储在一个特定的文件夹中。在一个特定的文件夹中有很多单独的视频(Coursera将一个演讲分成多个短视频)。我想拥有一个Python脚本,该脚本可提供特定目录中所有视频的总长度。视频文件为.mp4格式。

Bor*_*ris 5

首先,使用安装ffprobe命令(是的一部分ffmpeg

sudo apt install ffmpeg
Run Code Online (Sandbox Code Playgroud)

然后调用ffprobe <filename> -print_format json -show_streams -loglevel -quiet使用subprocess.run()和解析JSON返回

from pathlib import Path
import subprocess
import json

def video_length_seconds(filename):
    result = subprocess.run(['ffprobe', filename, '-print_format', 'json', '-show_streams', '-loglevel', 'quiet'], capture_output=True, text=True)
    return float(json.loads(result.stdout)['streams'][0]['duration'])

# all mp4 files in the current directory in seconds
print(sum(video_length_seconds(f) for f in Path('.').glob('*.mp4')))

# all files in the current directory
print(sum(video_length_seconds(f) for f in Path('.').iterdir() if f.is_file()))
Run Code Online (Sandbox Code Playgroud)

此代码需要Python 3.7+,因为那个时候text=capture_output=加入subprocess.run。如果您的Python版本较旧且无法升级,请查看此答案的编辑历史记录以获取较旧的版本。


Emm*_*ler 0

此链接显示如何获取视频文件的长度/sf/answers/269112721/

import subprocess

def getLength(filename):
  result = subprocess.Popen(["ffprobe", filename],
    stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
  return [x for x in result.stdout.readlines() if "Duration" in x]
Run Code Online (Sandbox Code Playgroud)

如果您正在使用该函数,则可以用类似的东西将其包装起来

import os

for f in os.listdir('.'):
    print "%s: %s" % (f, getLength(f))
Run Code Online (Sandbox Code Playgroud)