如何使用python验证mp4文件或音频文件?
我有一个用Django rest框架构建的rest API,它的一个序列化程序是接受Base64file,这是我们的音频文件,现在我想要的只是检查并验证解码的文件,这样我就可以知道这是否是有效的mp4或任何音频类型 问题是,有时上传和保存后的音频文件已损坏,无法播放,因此执行此验证对于确保文件正确发送或发送时已损坏至关重要 我一直在谷歌和互联网上搜索任何可以完成这项简单任务的东西,但我发现的只是如何播放音频或操纵音频,我甚至没有发现在试图打开文件时如果文件无效会引发异常的东西 更多信息。我用Base64FileField来实现我的音频文件字段,他们提供了一个例子,比如PDF,我试着用类似的方法来实现音频,但阻碍我的是检查音频 PDF的示例:如何使用python验证mp4文件或音频文件?,python,django,audio,django-rest-framework,Python,Django,Audio,Django Rest Framework,我有一个用Django rest框架构建的rest API,它的一个序列化程序是接受Base64file,这是我们的音频文件,现在我想要的只是检查并验证解码的文件,这样我就可以知道这是否是有效的mp4或任何音频类型 问题是,有时上传和保存后的音频文件已损坏,无法播放,因此执行此验证对于确保文件正确发送或发送时已损坏至关重要 我一直在谷歌和互联网上搜索任何可以完成这项简单任务的东西,但我发现的只是如何播放音频或操纵音频,我甚至没有发现在试图打开文件时如果文件无效会引发异常的东西 更多信息。我用Ba
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代码示例的方式来做,那就太好了。我找不到任何东西可以验证这样的视频。或者至少没有什么是独立的。如果有,它可能会重新解码/编码。因此,在寻找更优化的方法的同时,坚持简单的方法可能是一个好主意。祝你好运。谢谢你的帮助,我很感激