【问题标题】:Is this file a video (Python)?这个文件是视频(Python)吗?
【发布时间】:2013-02-17 09:11:50
【问题描述】:

我正在尝试在 Python 2.7 中创建一个具有以下要求的程序:

  1. 枚举 Windows 中的所有视频文件。
  2. 使用以下命令打开每个视频文件:os.open(filepath, os.O_RDWR)
  3. 处理文件。

我目前的算法是:

  1. 拥有所有视频文件扩展名的列表。我是从here 得到的
  2. 遍历所有文件
  3. 如果文件有视频扩展名,则处理它

这种方法有以下缺点:

  1. “.dat”或“.am”等一些文件扩展名用于非媒体文件。
  2. 某些扩展名为“.dat”的文件被其他程序(例如防病毒)使用

我应该如何做一个满足上述要求的程序?

这是我当前的代码:

def is_video_file(filename):
    video_file_extensions = (
'.264', '.3g2', '.3gp', '.3gp2', '.3gpp', '.3gpp2', '.3mm', '.3p2', '.60d', '.787', '.89', '.aaf', '.aec', '.aep', '.aepx',
'.aet', '.aetx', '.ajp', '.ale', '.am', '.amc', '.amv', '.amx', '.anim', '.aqt', '.arcut', '.arf', '.asf', '.asx', '.avb',
'.avc', '.avd', '.avi', '.avp', '.avs', '.avs', '.avv', '.axm', '.bdm', '.bdmv', '.bdt2', '.bdt3', '.bik', '.bin', '.bix',
'.bmk', '.bnp', '.box', '.bs4', '.bsf', '.bvr', '.byu', '.camproj', '.camrec', '.camv', '.ced', '.cel', '.cine', '.cip',
'.clpi', '.cmmp', '.cmmtpl', '.cmproj', '.cmrec', '.cpi', '.cst', '.cvc', '.cx3', '.d2v', '.d3v', '.dat', '.dav', '.dce',
'.dck', '.dcr', '.dcr', '.ddat', '.dif', '.dir', '.divx', '.dlx', '.dmb', '.dmsd', '.dmsd3d', '.dmsm', '.dmsm3d', '.dmss',
'.dmx', '.dnc', '.dpa', '.dpg', '.dream', '.dsy', '.dv', '.dv-avi', '.dv4', '.dvdmedia', '.dvr', '.dvr-ms', '.dvx', '.dxr',
'.dzm', '.dzp', '.dzt', '.edl', '.evo', '.eye', '.ezt', '.f4p', '.f4v', '.fbr', '.fbr', '.fbz', '.fcp', '.fcproject',
'.ffd', '.flc', '.flh', '.fli', '.flv', '.flx', '.gfp', '.gl', '.gom', '.grasp', '.gts', '.gvi', '.gvp', '.h264', '.hdmov',
'.hkm', '.ifo', '.imovieproj', '.imovieproject', '.ircp', '.irf', '.ism', '.ismc', '.ismv', '.iva', '.ivf', '.ivr', '.ivs',
'.izz', '.izzy', '.jss', '.jts', '.jtv', '.k3g', '.kmv', '.ktn', '.lrec', '.lsf', '.lsx', '.m15', '.m1pg', '.m1v', '.m21',
'.m21', '.m2a', '.m2p', '.m2t', '.m2ts', '.m2v', '.m4e', '.m4u', '.m4v', '.m75', '.mani', '.meta', '.mgv', '.mj2', '.mjp',
'.mjpg', '.mk3d', '.mkv', '.mmv', '.mnv', '.mob', '.mod', '.modd', '.moff', '.moi', '.moov', '.mov', '.movie', '.mp21',
'.mp21', '.mp2v', '.mp4', '.mp4v', '.mpe', '.mpeg', '.mpeg1', '.mpeg4', '.mpf', '.mpg', '.mpg2', '.mpgindex', '.mpl',
'.mpl', '.mpls', '.mpsub', '.mpv', '.mpv2', '.mqv', '.msdvd', '.mse', '.msh', '.mswmm', '.mts', '.mtv', '.mvb', '.mvc',
'.mvd', '.mve', '.mvex', '.mvp', '.mvp', '.mvy', '.mxf', '.mxv', '.mys', '.ncor', '.nsv', '.nut', '.nuv', '.nvc', '.ogm',
'.ogv', '.ogx', '.osp', '.otrkey', '.pac', '.par', '.pds', '.pgi', '.photoshow', '.piv', '.pjs', '.playlist', '.plproj',
'.pmf', '.pmv', '.pns', '.ppj', '.prel', '.pro', '.prproj', '.prtl', '.psb', '.psh', '.pssd', '.pva', '.pvr', '.pxv',
'.qt', '.qtch', '.qtindex', '.qtl', '.qtm', '.qtz', '.r3d', '.rcd', '.rcproject', '.rdb', '.rec', '.rm', '.rmd', '.rmd',
'.rmp', '.rms', '.rmv', '.rmvb', '.roq', '.rp', '.rsx', '.rts', '.rts', '.rum', '.rv', '.rvid', '.rvl', '.sbk', '.sbt',
'.scc', '.scm', '.scm', '.scn', '.screenflow', '.sec', '.sedprj', '.seq', '.sfd', '.sfvidcap', '.siv', '.smi', '.smi',
'.smil', '.smk', '.sml', '.smv', '.spl', '.sqz', '.srt', '.ssf', '.ssm', '.stl', '.str', '.stx', '.svi', '.swf', '.swi',
'.swt', '.tda3mt', '.tdx', '.thp', '.tivo', '.tix', '.tod', '.tp', '.tp0', '.tpd', '.tpr', '.trp', '.ts', '.tsp', '.ttxt',
'.tvs', '.usf', '.usm', '.vc1', '.vcpf', '.vcr', '.vcv', '.vdo', '.vdr', '.vdx', '.veg','.vem', '.vep', '.vf', '.vft',
'.vfw', '.vfz', '.vgz', '.vid', '.video', '.viewlet', '.viv', '.vivo', '.vlab', '.vob', '.vp3', '.vp6', '.vp7', '.vpj',
'.vro', '.vs4', '.vse', '.vsp', '.w32', '.wcp', '.webm', '.wlmp', '.wm', '.wmd', '.wmmp', '.wmv', '.wmx', '.wot', '.wp3',
'.wpl', '.wtv', '.wve', '.wvx', '.xej', '.xel', '.xesc', '.xfl', '.xlmv', '.xmv', '.xvid', '.y4m', '.yog', '.yuv', '.zeg',
'.zm1', '.zm2', '.zm3', '.zmv'  )

if filename.endswith((video_file_extensions)):
    return True

def get_drives():
    import string
    from ctypes import windll
    import ctypes
    from ctypes.wintypes import MAX_PATH

    drives = []
    bitmask = windll.kernel32.GetLogicalDrives()
    for letter in string.uppercase:
        if bitmask & 1:
            letter = letter + ':\\'
            drives.append(letter)
        bitmask >>= 1
    return drives

def process(filepath):
    try:
        video_file = os.open(filepath, os.O_RDWR)
        # Do processing



def process_all_videos():
    for dirve in drives:
        for root, dirs, files in os.walk(dirve):
            for filename in files:
                if is_video_file(filename):
                    try:
                        filepath = os.path.join(root, filename)
                        process(filepath)


def main():
    process_all_videos()

if __name__ == '__main__':
    main()

【问题讨论】:

  • 你为什么使用os.open()
  • 我想对每个涉及写入数据的文件进行一些处理
  • open(filename, 'r+') 没有给你这个功能? (注意,这是内置的open(),而不是os.open())。
  • 如果你要处理文件,你可能会使用同一个库来检查文件是否可以处理。
  • @MartijnPieters 我明白你的意思,我想我会修改我的程序,并使用 open(filename, 'r+')

标签: python file video file-io


【解决方案1】:

尝试使用python-magic,这是通过读取文件内容(通常是前 1024 个字节)更好地检测文件类型的方法。

【讨论】:

    【解决方案2】:

    此时,有一种更简单的方法可以检查任何给定文件是否包含有效的视频流:使用 MediaInfo wrapper for Python 加载文件并检查是否存在视频流。

    fileInfo = MediaInfo.parse('some/file/name.ext')
    for track in fileInfo.tracks:
        if track.track_type == "Video":
            # success!
    

    我不知道这样做的效率,但它至少应该和使用 ffmpeg 一样快。至少,它有一个不错的 API,并且您可以使用它轻松提取许多其他有用的信息。

    【讨论】:

      【解决方案3】:

      这是解决您问题的有效方法

      import mimetypes
      
      if mimetypes.guess_type('file_path')[0].startswith('video'):
         print('It is a video')```
      

      【讨论】:

        【解决方案4】:

        我可能会使用 ffmpeg / libavcodec 打印出文件信息,并解析输出以检查文件是否包含视频流。

        这样您就可以避免拥有大量文件扩展名列表,并且还可以解决 DAT 文件的问题。

        【讨论】:

        • +1 好的、有针对性的解决方案。 pyffmpeg 绑定使这更容易。
        • 看起来不错:stream = pyffmpeg.VideoStream() stream.open('filname'),如果失败,则该文件不是视频。我会检查它是否有效?
        • 有谁知道我在哪里可以找到在 Windows 上安装 pyffmpeg 的可执行文件?
        • 项目首页-code.google.com/p/pyffmpeg/downloads/list-好像有win32下载链接
        【解决方案5】:

        我在同样的问题上苦苦挣扎,这是我的解决方案:

        import magic
        mime = magic.Magic(mime=True)
        filename = mime.from_file(path_to_video)
        if filename.find('video') != -1:
           print('it is video') 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-11
          • 2012-05-21
          • 1970-01-01
          • 1970-01-01
          • 2016-12-22
          • 2022-06-20
          • 1970-01-01
          相关资源
          最近更新 更多