我正在尝试遍历子文件夹的目录,其中每个文件夹都包含一个.avi文件,我希望以秒为单位检索其长度。
我找到PyMedia http://pymedia.org/
,我知道它可能帮助我实现这个目标,但我在文档中找不到关于avi持续时间/长度的任何内容。
我怎么能这样做?另外,如果有一个不同的图书馆,我想知道aswel。
编辑:添加了我的最终解决方案,感谢J.F.Sebastian
import sys
import glob
import os
from hachoir_core.cmd_line import unicodeFilename
from hachoir_core.i18n import getTerminalCharset
from hachoir_metadata import extractMetadata
from hachoir_parser import createParser
path = "z:\*"
for fpath in glob.glob(os.path.join(path, '*avi')):
filename = fpath
filename, real_filename = unicodeFilename(filename), filename
parser = createParser(filename, real_filename=real_filename)
metadata = extractMetadata(parser)
print fpath
print("Duration (hh:mm:ss.f): %s" % metadata.get('duration'))
print '\n'
答案 0 :(得分:6)
您可以使用hachoir-metadata
从文件中提取avi持续时间:
#!/usr/bin/env python
import sys
# $ pip install hachoir-{core,parser,metadata}
from hachoir_core.cmd_line import unicodeFilename
from hachoir_core.i18n import getTerminalCharset
from hachoir_metadata import extractMetadata
from hachoir_parser import createParser
filename = sys.argv[1]
charset = getTerminalCharset()
filename, real_filename = unicodeFilename(filename, charset), filename
parser = createParser(filename, real_filename=real_filename)
metadata = extractMetadata(parser)
print("Duration (hh:mm:ss.f): %s" % metadata.get('duration'))
它使用pure Python RIFF parser从avi file中提取信息。
示例:
$ get-avi-duration.py test.avi
Duration (hh:mm:ss.f): 0:47:03.360000
这是用于比较的ffmpeg输出:
$ ffmpeg -i test.avi |& grep -i duration
Duration: 00:47:03.36, start: 0.000000, bitrate: 1038 kb/s
打印目录树中所有avi文件的信息:
#!/usr/bin/env python
import os
import sys
from hachoir_metadata import extractMetadata
from hachoir_parser import createParser
def getinfo(rootdir, extensions=(".avi", ".mp4")):
if not isinstance(rootdir, unicode):
rootdir = rootdir.decode(sys.getfilesystemencoding())
for dirpath, dirs, files in os.walk(rootdir):
dirs.sort() # traverse directories in sorted order
files.sort()
for filename in files:
if filename.endswith(extensions):
path = os.path.join(dirpath, filename)
yield path, extractMetadata(createParser(path))
for path, metadata in getinfo(u"z:\\"):
if metadata.has('duration'):
print(path)
print(" Duration (hh:mm:ss.f): %s" % metadata.get('duration'))
答案 1 :(得分:2)
如果您的服务器运行任何UNIX操作系统,您可以使用ffmpeg
执行此操作。通常只有像ffmpeg myvideo.avi
这样的默认命令会为您提供完整的视频详细信息。
ffmpeg还有一个python wrapper,可能会在字典或列表中返回视频详细信息。
修改强>
我还找到了一个名为ffprobe的漂亮的ffmpeg工具,它可以输出视频长度而无需额外的麻烦。
fprobe -loglevel error -show_streams inputFile.avi | grep duration | cut -f2 -d=
答案 2 :(得分:1)
不确定是否有独立于平台的方法来执行此操作,但如果您只需要在Windows上工作,那么看起来MediaInfo(下面)有一个命令行界面,您可以使用该界面输出有关视频文件的详细信息,然后可以解析它以获取信息。不是最漂亮的解决方案,但看起来应该可行。