我从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('.')])
MediaInfoDLL3.py
并将其解压到任意位置。 示例位置: libmediainfo_0.7.62_AllInclusive.7z\MediaInfoLib\Source\MediaInfoDLL\MediaInfoDLL3.py
MediaInfo也适用于POSIX。 唯一的区别是,加载而不是DLL。
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中工作