2013-06-19 94 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