3

我正在尝试遍历子文件夹的目录,其中每个文件夹都包含一个 .avi 文件,我想以秒为单位检索其长度。

我找到了 PyMedia http://pymedia.org/,我知道它可能会帮助我实现这一目标,但我在文档中找不到任何关于 avi 持续时间/长度的信息。

我怎么能做到这一点?另外,如果有某种不同的图书馆,我想知道aswel。

编辑:添加了我的最终解决方案,感谢 JF 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'
4

3 回答 3

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'))

它使用纯 Python RIFF 解析器avi 文件中提取信息。

例子:

$ 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'))
于 2013-06-19T11:52:22.227 回答
2

如果您的服务器运行任何 UNIX 操作系统,您可以使用它ffmpeg来执行此操作。通常只是默认命令就像ffmpeg myvideo.avi会给你完整的视频细节。

还有一个用于 ffmpeg 的python 包装器,它可能会在字典或列表中返回视频详细信息。

编辑:

我还发现了一个不错的 ffmpeg 工具,叫做 ffprobe,它可以输出视频长度而无需额外的大惊小怪。

fprobe -loglevel error -show_streams inputFile.avi | grep duration | cut -f2 -d=
于 2013-06-19T09:05:00.340 回答
1

不确定是否有独立于平台的方式来执行此操作,但如果您只需要在 Windows 上使用它,那么看起来 MediaInfo(如下)有一个命令行界面,您可以使用它来输出有关视频文件的详细信息,然后可以被解析以获取信息。不是最漂亮的解决方案,但看起来应该可以。

http://mediainfo.sourceforge.net/en

于 2013-06-19T07:45:22.357 回答