2013-06-19 61 views
3

我想循环遍历每个文件夹包含一个.avi文件的子文件夹的目录,我想要在几秒钟内检索它的长度。如何获得.avi文件的长度

我发现PyMedia http://pymedia.org/,我明白它可以帮助我实现这一目标,但在文档中我找不到有关avi持续时间/长度的任何信息。

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

编辑:加了我的作品由于JF塞巴斯蒂安

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

视频的长度你的意思是几秒?或者字节中文件的长度? –

+0

长度以秒为单位。对不起,必须更具体。 – MaxPower

回答

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 parseravi 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')) 
+0

愚蠢的问题也许...这将工作在映射网络驱动器? – MaxPower

+0

@MaxPower:我认为没有理由不起作用。你可以测试它。 – jfs

+0

我不明白为什么filename = sys.argv [1]我试图在1 avi文件上测试它,但我无法设法使其工作。最终我想运行它在100-200 AVI文件... – MaxPower

1

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

http://mediainfo.sourceforge.net/en

2

如果在运行任何UNIX操作系统的服务器,你可以使用ffmpeg做到这一点。通常只有像ffmpeg myvideo.avi这样的默认命令会给你完整的视频细节。

还有一个用于ffmpeg的python wrapper,它可能会返回字典或列表中的视频细节。

编辑:

我还发现,漂亮的ffmpeg的工具,叫做ffprobe这可以视频输出长度无需额外大惊小怪。

fprobe -loglevel error -show_streams inputFile.avi | grep duration | cut -f2 -d= 
+0

我不明白这个部分“| grep duration | cut -f2 -d =”你是指“|”“OR”吗? – MaxPower

+0

它是bash shell命令。 http://stackoverflow.com/questions/89228/calling-an-external-command-in-python – holms