我想存儲多個mp3文件並通過提供歌曲的某些部分來搜索它們,以檢測它是哪首歌曲。如何通過內容存儲和搜索mp3
我想到的是存儲在MySQL中的所有二進制內容的,當我想通過內容來搜索特定的歌曲我會歌的中間部分,實際上與MySQL中的二進制數據相匹配。
我的問題是:
- 這是一個合理的方式找到他們的內容的歌曲?
- 將歌曲的內容存儲在數據庫中還是應該使用文件系統?
我想存儲多個mp3文件並通過提供歌曲的某些部分來搜索它們,以檢測它是哪首歌曲。如何通過內容存儲和搜索mp3
我想到的是存儲在MySQL中的所有二進制內容的,當我想通過內容來搜索特定的歌曲我會歌的中間部分,實際上與MySQL中的二進制數據相匹配。
我的問題是:
這是行不通的。 MP3是一種「有損」的格式。這意味着它在編碼時會不斷改變音樂的微妙細微差別,因此在同一首歌曲的幾乎每個編碼上產生完全不同的逐字節數據。
此外,即使在如WAV未壓縮格式,在不同體積的兩個相同的記錄會產生不同的字節數據。因此,通過比較文件內容的字節值來比較音樂是不可能的。
二進制比較將工作只有兩個確切相同的複製品同MP3文件。當您使用相同的設置對相同的MP3文件進行重新編碼時,它甚至不再工作。
比較音樂不是一件小事,有幾種方法,而是可以在PHP中使用我所知沒有。
如果幸運的話,那就是存在允許某種匹配的網絡服務。儘管如此,我認爲它在某種程度上是商業性的 - 我懷疑我們處於可以免費使用這種東西的階段。
它是由歌曲的內容,查找歌曲正確的方式。
只有當你能確定你得到的作爲搜索標準的部分實際上是該特定MP3文件的摘錄......並且這是非常非常不可能的。如果該部分可能來自不同的來源(例如,同一首歌曲的不同錄音,或只是壓縮比不同的MP3),則必須使用更爲複雜的audio fingerprinting。
將歌曲內容存儲在數據庫或文件存儲中是否正常工作是否正確?
如果你做簡單的二進制匹配,使用數據庫沒有意義。如果你有一個更復雜的索引技術(比如音頻指紋),那麼使用數據庫是有道理的。
我不完全理解你想要做什麼,但是如果你要索引一個MP3集合,那麼存儲一個哈希(長度足夠)而不是實際文件可能是一個更好的主意。
的問題是,這些字節不給你任何的洞察力對文件的內容,即在它的音樂。即使您從要比較的字節中刪除元數據(以消除拼寫/元數據大寫變化等噪聲),您只會瞭解獨特文件本身的一些內容。因此,您可以比較兩個相同的文件(即精確重複)是否相等,但無法比較任何兩個隨機文件的相似性。
正如其他人所指出的 - 通過查看文件的二進制內容是行不通的比較的MP3。
我寫了這樣的事情在Java中,而在大學我最後一年的項目。我很樂意向您發送源代碼。它處理的是相對相似點 - 「歌曲X比歌曲Y更像歌曲Z」,而不是匹配,但它可能是朝着正確方向邁出的一步。
並請,不管你做什麼,不要試圖在PHP中做到這一點。我使用的算法需要我計算(如果我沒有記錯的話 - 我在3年前就已經完成了這項工作)爲其分析的每個MP3編制了30個30x30矩陣。每首歌都需要大約30秒的時間才能在我笨重的舊機器上處理一組矩陣(我相信我的新PC可以更快地完成這項工作)。一旦我有了n首歌曲的矩陣,第二步就計算了每首歌曲之間的差異,第三步將這些差異降低到m維空間。這3個步驟中的每一步都需要相當大的馬力,而PHP絕對不適合這份工作。
PHP可能工作的是前端 - 我最終用Ruby on Rails編寫了一個可查詢的Web應用程序,在這裏我有一個簡單的後端,它將每首歌的座標存儲在m維空間中(I碰巧選擇m = 6) - 給定一首特定的歌曲或片段X,然後可以在X的某個「距離」內計算歌曲。
注意:我應該指出,我寫的所有代碼基本上只是其他人編寫的圖書館的封裝(這些封裝是由奧地利的一所大學的一些聰明人組成的) - 這些圖書館帶了兩首歌並生成了矩陣 - 我所做的只是計算距離並將很多歌曲的距離映射到m維空間。希望我足夠聰明,也能做到第一點!
要搜索歌曲,您可能需要編制索引tags,並專注於一個不錯的,易於使用的用戶界面,以便用戶可以靈活地查找它們。
正如上面所說的,相同的歌曲將顯示根據編碼不同的內容字節。
但是,有一個想法指向你的方向,我不確定它的可行性如何,可能是對一些可能唯一識別它的歌曲模式進行索引。例如。 Johnny Cash的所有歌曲有什麼共同之處?音量,音調,它們的組合?當你獲得一部分內容時,你可以從中提取相同的模式並進行匹配。這將是一個有趣的概念。
同意除「沒有可用於PHP」部分。你總是可以讓自己:) :) – 2010-02-08 12:40:34
我說*存在* @Petr :) – 2010-02-08 12:44:14
方法存在並不意味着它已經實施。 好吧,從不知道:) – 2010-02-08 13:10:58