2012-12-07 46 views
2

如果我從網絡上下載音頻文件,並且下載過程出現問題,那麼如何有效地檢測到音頻文件與python不完整?使用python檢測音頻文件的完整性

有一些想法,比如using the file command in linux

file audio.mp4

但它承認它是MP4:

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

即使mplayer的檢測MP4音頻類型,但沒有嘗試時玩。我不認爲啓動mplayerfrom python並檢查它是否失敗是一個可擴展的解決方案。

這裏是破碎文件的樣本: https://www.dropbox.com/s/5rpscb9r1xrrx4t/They

上面的樣品失敗,誘變劑和mp4file,使它們無限期掛起。它與fileObject.tell()有關。

+2

您是否專門嘗試查找不完整的MPEG4文件(無論它們是否是音頻文件)還是不完整的音頻文件(無論它們的格式如何)或其他不同? – abarnert

+0

此刻只有mpeg4文件。 – user1812844

回答

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。

+0

謝謝,我試過了,它有點作品。問題是,對不良文件執行'mp4file.Mp4File(path)'會導致該行掛起。輸出中不會引發異常。在有效的文件上,它立即返回。 – user1812844

+0

問題在於file.tell()。在while循環中,它停留在32點。當我使用誘變庫時,同樣的問題仍然存在。 – user1812844

+0

誘變劑懸掛?真的嗎?你可以上傳一個測試文件到某個地方,並將測試代碼發佈到pastebin或任何地方? – abarnert