在Python中获取特定目录中的video总长度

我从coursera.org下载了一堆video,并将它们存储在一个特定的文件夹中。 在一个特定的文件夹中有许多单独的video(Coursera将演讲分成多个短video)。 我想有一个Python脚本,给出在一个特定的目录中的所有video的总长度。 video文件是.mp4格式。

此链接显示如何获得视频文件的长度https://stackoverflow.com/a/3844467/735204

如果你正在使用这个功能,那么你可以用类似的东西来包装它

import os for f in os.listdir('.'): print "%s: %s" % (f, getLength(f)) 

我可能会晚一点,但是为了让将来的人不必重复我的工作,下面是接受的答案所暗示的代码

 import os import subprocess import json def get_len(filename): result = subprocess.Popen(["ffprobe", filename, '-print_format', 'json', '-show_streams', '-loglevel', 'quiet'], stdout = subprocess.PIPE, stderr = subprocess.STDOUT) return float(json.loads(result.stdout.read())['streams'][0]['duration']) #if you only want total time of all mp4 files in seconds print sum([get_len(x) for x in os.listdir('.') if x.endswith('.mp4')]) #if you want length all files print sum([get_len(x) for x in os.listdir('.')]) 
  1. 下载MediaInfo并安装它(不要安装捆绑的广告软件)
  2. 转到MediaInfo源代码下载 ,在“源代码,所有包含”行中,选择“libmediainfo”旁边的链接
  3. 在下载的存档中找到MediaInfoDLL3.py并将其解压到任意位置。 示例位置: libmediainfo_0.7.62_AllInclusive.7z\MediaInfoLib\Source\MediaInfoDLL\MediaInfoDLL3.py
  4. 现在在同一个目录下创建一个测试脚本(源代码如下)。
  5. 执行脚本。

MediaInfo也适用于POSIX。 唯一的区别是,加载而不是DLL。

测试脚本(Python 3!)

 import os os.chdir(os.environ["PROGRAMFILES"] + "\\mediainfo") from MediaInfoDLL3 import MediaInfo, Stream MI = MediaInfo() def get_lengths_in_milliseconds_of_directory(prefix): for f in os.listdir(prefix): MI.Open(prefix + f) duration_string = MI.Get(Stream.Video, 0, "Duration") try: duration = int(duration_string) yield duration print("{} is {} milliseconds long".format(f, duration)) except ValueError: print("{} ain't no media file!".format(f)) MI.Close() print(sum(get_lengths_in_milliseconds_of_directory(os.environ["windir"] + "\\Performance\\WinSAT\\" )), "milliseconds of content in total") 

除了Janus Troelsen的回答之外,我想指出我在实现答案时遇到的一个小问题。 我遵循他的指示逐一,但在Windows(7)和Linux(Ubuntu的)有不同的结果。 他的指示在Linux下完美运行,但是我不得不做一些小小的工作,让它在windows上运行。 我在Windows上使用32位Python 2.7.2解释器,所以我使用了MediaInfoDLL.py。 但是,这还不足以让它为我工作,在这一过程中,我正在接受这个错误:

“WindowsError:[错误193]%1不是有效的Win32应用程序”。

这意味着我以某种方式使用不是32位的资源,它必须是加载的DLL MediaInfoDLL.py。 如果您查看MediaInfo安装目录,您将看到3个dll MediaInfo.dll是64位而MediaInfo_i386.dll是32位。 MediaInfo_i386.dll是我必须使用的,因为我的Python设置。 我去了MediaInfoDLL.py(我已经包含在我的项目中),并改变了这一行:

 MediaInfoDLL_Handler = windll.MediaInfo 

 MediaInfoDLL_Handler = WinDLL("C:\Program Files (x86)\MediaInfo\MediaInfo_i386.dll") 

我没有改变任何东西,它在Linux中工作