python-3.x 检查文件类型是否为媒体文件?

wqlqzqxt  于 2023-02-06  发布在  Python
关注(0)|答案(4)|浏览(234)

我正在尝试遍历一个文件列表,并返回那些媒体文件(图像、视频、gif、音频等)。
鉴于有很多媒体类型,是否有一个库或更好的方法来检查这一点,而不是列出所有类型,然后检查一个文件对该列表?
以下是我目前正在做的事情:

import os
types = [".mp3", ".mpeg", ".gif", ".jpg", ".jpeg"]
files = ["test.mp3", "test.tmp", "filename.mpg", ".AutoConfig"]

media_files = []
for file in files:
    root, extention = os.path.splitext(file)
    print(extention)
    if extention in types:
        media_files.append(file)

print("Found media files are:")
print(media_files)

但是请注意,它不包括filename.mpg,因为我忘记将.mpg放入我的types列表中(或者,更有可能的是,我不期望该列表包括.mpg文件,所以没有想到将其列出)。

eimct9ow

eimct9ow1#

为此,您需要获取文件的互联网媒体类型,按/字符拆分,并检查它是否以音频,视频,图像开头。
下面是一个示例代码:

import mimetypes
mimetypes.init()

mimestart = mimetypes.guess_type("test.mp3")[0]

if mimestart != None:
    mimestart = mimestart.split('/')[0]

    if mimestart in ['audio', 'video', 'image']:
        print("media types")
    • 注意:**此方法通过扩展名假定文件类型,并且不打开实际文件,它仅基于文件扩展名。

创建模块

如果你想创建一个模块来检查文件是否是一个媒体文件,你需要在模块的开头调用init函数。
以下是如何创建模块的示例:
ismediafile.py

import mimetypes
mimetypes.init()

def isMediaFile(fileName):
    mimestart = mimetypes.guess_type(fileName)[0]

    if mimestart != None:
        mimestart = mimestart.split('/')[0]

        if mimestart in ['audio', 'video', 'image']:
            return True
    
    return False

以及如何使用它:
main.py

from ismediafile import isMediaFile

if __name__ == "__main__":
    if isMediaFile("test.mp3"):
        print("Media file")
    else:
        print("not media file")
wn9m85ua

wn9m85ua2#

还有另一种方法,它不是基于文件扩展名,而是基于使用介质类型库pypi.org/project/python-libmagic的文件内容:
下面是该库的示例代码:

import magic

magic = magic.Magic()
mimestart = magic.from_file("test.mp3").split('/')[0]

if mimestart in ['audio', 'video', 'image']:
    print("media types")

**注意:**要使用此代码示例,您需要使用pip安装python-libmagic。

wrrgggsh

wrrgggsh3#

另一种选择是利用FFmpeg,它支持现有的大多数媒体格式,当想了解每个文件的媒体类型时,这一点特别有用。
使用ffprobe-python软件包(pip install ffprobe-python):

from ffprobe import FFProbe

# try probing the file with ffmpeg
# if no streams are found, it's not in a format that ffmpeg can read
# -> not considered media file
media_files = [file for file in files if len(FFProbe(file).streams)]

这种方法可能比只阅读文件扩展名或MIME类型慢得多,因为它可能会摄取整个文件。另一方面,有可能获得更多关于所载媒体类型和元数据的信息。
仅选择包含音频的文件:

has_audio = [file for file in files if len(FFProbe(file).audio)]

图像和视频类似:

has_img_or_vid = [file for file in files if len(FFProbe(file).video)]

或收集编解码器名称:

codecs = {file: [s.codec_name for s in FFProbe(f).streams] for f in files}
zqry0prt

zqry0prt4#

您可以按如下方式列出媒体文件:

import os

def lsmedia(mypath):
    img_fm = (".tif", ".tiff", ".jpg", ".jpeg", ".gif", ".png", ".eps", 
          ".raw", ".cr2", ".nef", ".orf", ".sr2", ".bmp", ".ppm", ".heif")
    vid_fm = (".flv", ".avi", ".mp4", ".3gp", ".mov", ".webm", ".ogg", ".qt", ".avchd")
    aud_fm = (".flac", ".mp3", ".wav", ".wma", ".aac")
    media_fms = {"image": img_fm, "video": vid_fm, "audio": aud_fm}

    fns = lambda path, media : [fn for fn in os.listdir(path) if any(fn.lower().endswith(media_fms[media]) for ext in media_fms[media])]
    img_fns, vid_fns, aud_fns = fns(mypath, "image"), fns(mypath, "video"), fns(mypath, "audio")

    print(f"State of media in '{mypath}'")
    print("Images: ", len(img_fns), " | Videos: ", len(vid_fns), "| Audios: ", len(aud_fns))
    
    return (img_fns, vid_fns, aud_fns)

mypath = "/home/DATA_Lia/data_02/sample" # define dir
(imgs, vids, auds) = lsmedia(mypath)

输出:

State of media in '/home/DATA_Lia/data_02/sample'
Images:  24  | Videos:  3 | Audios:  5

相关问题