7
votes

Ce fichier est-il une vidéo (Python)?

J'essaie de créer un programme dans Python 2.7, qui a les exigences suivantes:

  1. énumère tous les fichiers vidéo sous Windows. LI>
  2. ouvre chaque fichier vidéo à l'aide de: OS.OPEN (FilePath, OS.O_RDWR) CODE> LI>
  3. traite le fichier. LI> ol>

    Mon algorithme actuel est: p>

    1. Avoir une liste de toutes les extensions de fichier vidéo. Je les ai eu de ici li>
    2. boucle via tous les fichiers li>
    3. Si le fichier a une extension vidéo, procédez-le, processus li> ol>

      Cette méthode a suivi des inconvénients: P>

      1. Certaines extensions de fichier tels que ".dat" ou ".am" sont utilisés pour des fichiers non multimédias. li>
      2. Certains fichiers avec des extensions telles que ".dat" sont utilisés par d'autres programmes (c'est-à-dire antivirus) li> ol>

        Que dois-je faire pour faire un programme qui satisfait aux exigences pointées ci-dessus? P>

        Voici mon code actuel: p>

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


14 commentaires

Pourquoi utilisez-vous os.open () ?


Je voudrais faire du traitement sur chaque fichier qui implique la rédaction de données


Et ouvert (nom de fichier, 'r +') ne vous donne pas cette fonctionnalité? (Remarque, c'est l'intégré ouvert () , pas OS.OPEN () ).


Si vous allez traiter le fichier, vous pouvez probablement utiliser la même bibliothèque pour vérifier si le fichier peut être traité.


@JPA je n'ai pas de bibliothèque. Je ferai le traitement par moi-même. Je veux dire que je vais écrire des données directement dans le fichier lui-même sans utiliser une bibliothèque.


@farm - Lorsque vous dites "un peu de traitement", impliquez-vous que vous avez du code pour analyser et internaliser chaque format de fichier vidéo connu?


Windows ne compare-t-elle rien à la commande fichier ?


@ Martijnpieters OK, il y a des différences entre les deux, mais comment cela fait la différence dans notre cas?


@selbie Je veux seulement vérifier si le fichier est une vidéo ou non


@Hyperboreus Pouvez-vous expliquer plus loin la commande de fichier?


@farm: Si tout ce que vous faites, c'est tourner le résultat de Os.open () dans un objet de fichier Python avec FDOPEN () à nouveau, il y a nul note < / i> à l'aide de Os.open () . ouvert (nom de fichier, 'r +') ouvre un fichier en mode lecture-écriture également, et vous n'avez ajouté que des frais généraux (à la fois en termes de traitement et de cognition; tout device de python expérimenté devra arrêter et résonner et Travailler Pourquoi Vous êtes allé ce chemin à chaque fois qu'ils ont lu le code).


@Hyperboreus: Non, mais la bibliothèque Python-Magic proposée ci-dessous fait exactement ce que la commande fichier utilise la bibliothèque libmagic pour détecter les fichiers de fichiers du contenu.


@ Martijnpieters Je vois votre point, je suppose que je vais réviser mon programme et utilisera Open (nom de fichier, 'r +')


Ok j'ai fini par utiliser le module Devinessit. Il essaie de deviner le type de fichier de son nom. Merci pour tout le monde


5 Réponses :


3
votes

Je voudrais probablement utiliser FFMPEG / LIBAVCODEC pour imprimer les informations de fichier et analyser la sortie pour vérifier si le fichier contient un flux vidéo.

Ensuite, vous pouvez éviter d'avoir une énorme liste d'extensions de fichier et cela résoudra également un problème avec des fichiers DAT.


4 commentaires

+1 belle solution ciblée. Le Les liaisons PYFFMPEG facilitent cela.


Il semble bien: flux = ffmpeg.videostream () flux.open ("nom de fichier"), et s'il échoue, le fichier n'est pas une vidéo. Je vais vérifier si cela fonctionne?


Quelqu'un peut-il savoir où je peux trouver un exécutable pour installer PyffMpeg sur Windows?


Il semble que la page d'accueil du projet - code.google.com/p/pyffmpmpeg/downloads/list - Le lien de téléchargement Win32



9
votes

essayer d'utiliser python-magie , qui est un meilleur détecteur du type du fichier en lisant son contenu (généralement les 1024 premiers octets).


0 commentaires

7
votes

À ce stade, il existe un moyen encore plus facile de vérifier si un fichier donné contient un flux vidéo valide: chargez le fichier à l'aide du Wrapper Mediainfo pour Python et vérifiez l'existence d'un flux vidéo.

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


0 commentaires

3
votes

Je me luttais avec le même problème, c'était ma solution: xxx


0 commentaires

6
votes

Ceci est la solution efficace pour votre problème

import mimetypes

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


0 commentaires