How to get .avi files length

后端 未结 3 792
梦毁少年i
梦毁少年i 2020-12-10 21:06

I am trying to loop over a directory of sub folders where every folder contains one .avi file that i want to retrieve its length in seconds.

I\'ve found PyMedia

3条回答
  •  粉色の甜心
    2020-12-10 21:53

    You could use hachoir-metadata to extract avi duration from a file:

    #!/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'))
    

    It uses pure Python RIFF parser to extract info from avi file.

    Example:

    $ get-avi-duration.py test.avi
    Duration (hh:mm:ss.f): 0:47:03.360000
    

    Here's ffmpeg's output for comparison:

    $ ffmpeg -i test.avi |& grep -i duration
      Duration: 00:47:03.36, start: 0.000000, bitrate: 1038 kb/s
    

    To print info about all avi files in a directory tree:

    #!/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'))
    

提交回复
热议问题