如何使用python验证mp4文件或音频文件?

如何使用python验证mp4文件或音频文件?,python,django,audio,django-rest-framework,Python,Django,Audio,Django Rest Framework,我有一个用Django rest框架构建的rest API,它的一个序列化程序是接受Base64file,这是我们的音频文件,现在我想要的只是检查并验证解码的文件,这样我就可以知道这是否是有效的mp4或任何音频类型 问题是,有时上传和保存后的音频文件已损坏,无法播放,因此执行此验证对于确保文件正确发送或发送时已损坏至关重要 我一直在谷歌和互联网上搜索任何可以完成这项简单任务的东西,但我发现的只是如何播放音频或操纵音频,我甚至没有发现在试图打开文件时如果文件无效会引发异常的东西 更多信息。我用Ba

我有一个用Django rest框架构建的rest API,它的一个序列化程序是接受Base64file,这是我们的音频文件,现在我想要的只是检查并验证解码的文件,这样我就可以知道这是否是有效的mp4或任何音频类型

问题是,有时上传和保存后的音频文件已损坏,无法播放,因此执行此验证对于确保文件正确发送或发送时已损坏至关重要

我一直在谷歌和互联网上搜索任何可以完成这项简单任务的东西,但我发现的只是如何播放音频或操纵音频,我甚至没有发现在试图打开文件时如果文件无效会引发异常的东西

更多信息。我用Base64FileField来实现我的音频文件字段,他们提供了一个例子,比如PDF,我试着用类似的方法来实现音频,但阻碍我的是检查音频

PDF的示例:

class PDFBase64File(Base64FileField):
    ALLOWED_TYPES = ['pdf']

    def get_file_extension(self, filename, decoded_file):
        try:
            PyPDF2.PdfFileReader(io.BytesIO(decoded_file))
        except PyPDF2.utils.PdfReadError as e:
            logger.warning(e)
        else:
            return 'pdf'
到目前为止所做的工作:

class AudioBase64File(Base64FileField):
    ALLOWED_TYPES = (
        'amr',
        'ogg',
        'm4a',
        '3gp',
        'aac',
        'mp4',
        'mp3',
        'flac'
    )
    INVALID_FILE_MESSAGE = ("Please upload a valid audio.")
    INVALID_TYPE_MESSAGE = ("The type of the audio couldn't be determined.")

    def get_file_extension(self, filename, decoded_file):
        # missing validation
        return 'mp4'

您可以使用
ffmpeg

您可以读取该文件并查看是否存在任何错误
ffmpeg
将在读取文件时报告任何错误

你也可以跳过视频的某些部分,只是为了加快速度,但是不做任何事情就读取文件是相当快的,应该足够好了

ffmpeg -v error -i file.mp4 -f null - 2>error.log


Linux有程序
文件
,它使用
文件名
可以检查该文件中的内容-结果即
文件名:ID3版本2.4.0的音频文件,包含:MPEG ADT,第三层,v1,64 kbps,44.1 kHz,立体声
ffmpeg
有程序
ffprobe
,使用
ffprobe文件名
可以获得很多信息,一行有ie。
流#0:0:音频:mp3,44100Hz,立体声,s16p,128kb/s
。还有
ffmpeg-python
模块,所以它也可以做同样的事情。使用谷歌的“python测试文件类型”,它显示了许多链接。其中一个,甚至还有@furas的链接,谢谢你的回复和你与我分享的这些有用信息,但我担心它没有回答问题的内容,没有要检查的物理文件,我不想得到文件类型,我想知道这个解码文件是否有效,意味着如果在客户端对文件进行编码并决定使用服务器后,该文件没有损坏,那么我可以接受它,也可以错误地拒绝提交,请再次查看PDFY的代码示例,您可以将数据保存在磁盘上的文件中并进行检查-因此,您可以在检查之前保存数据,然后保存好的文件或删除错误的文件,而不是在检查之后保存到磁盘上。您还可以检查某些函数是否可以使用类似文件的对象,然后您可以使用
io.BytesIO
在内存中创建文件,如PDF示例中所示。如果确实存在物理文件,这将非常有用,但我希望对解码的文件执行此操作,如果我能用类似于问题中的PDF代码示例的方式来做,那就太好了。我找不到任何东西可以验证这样的视频。或者至少没有什么是独立的。如果有,它可能会重新解码/编码。因此,在寻找更优化的方法的同时,坚持简单的方法可能是一个好主意。祝你好运。谢谢你的帮助,我很感激