2

如果我从网上下载了一个音频文件并且下载过程中发生了一些不好的事情,那么如何使用 python 有效地检测到音频文件不完整?

有一些想法,比如在linux中使用file命令:

file audio.mp4

但它承认它是 mp4:

audio.mp4: ISO Media, MPEG v4 system, version 2

甚至 mplayer 也检测到 mp4 音频类型,但在尝试播放时失败。我不认为从 python 启动 mplayer 并检查它是否失败是一个可扩展的解决方案。

这是损坏文件的示例: https ://www.dropbox.com/s/5rpscb9r1xrrx4t/They

上面的示例使用诱变剂和 mp4file 失败,导致它们无限期挂起。它与 fileObject.tell() 有关。

4

1 回答 1

2

有许多不同的音频文件格式,以及可能是也可能不是音频文件的内容的容器格式。

幸运的是,有些库可以存储各种不同类型的文件。并且有 Python 包装器用于:

  • 便携式命令行工具,如 ffmpeg 和 mplayer。
  • libavcodec 之类的可移植库(ffmpeg 使用什么)。
  • 特定于平台的库,例如 Core Audio 或 QuickTime 或 Windows Media。

如果您愿意为单独的文件类型使用单独的包装器,那么还有更多选择(例如,libmp4v2 非常适合 MP4 文件,但对于其他任何文件都无用)。

当然,存在巨大的权衡——更强大的库通常会更复杂,或者有更多的先决条件。在http://pypi.python.org/上进行一些搜索以查看结果;你应该能够找到做你想做的一切的东西。

举一个非常简单的例子,mp4file将尝试解析任何 MPEG4 容器。如果它不完整,或者有任何无效的原子,你会得到一个异常。所以,检查只是一行,mp4file.Mp4File(path). 如果成功,则完成;如果它抛出异常,它是不完整或无效的。但当然,这将接受完整的 MPEG4 视频文件,或其中没有音频或视频的 MPEG4,它会拒绝完整的 MP3,甚至是带有损坏的元数据标签的完整 M4A。

于 2012-12-07T22:36:35.967 回答