2013-05-19 85 views
4

我有使用Python進行音頻數據分析的功課。我不知道是否有任何好的模塊可以用來從mp3文件中提取原始數據。我的意思是原始數據,而不是元數據,id3標籤。
如何使用python從mp3文件中提取原始數據?

我知道如何使用wave模塊來處理.wav文件。我可以readframes獲取原始數據。但我不知道如何處理MP3。我在谷歌和計算器上搜索了很多,並找到eyeD3。但不幸的是,文檔相當令人沮喪,現在的版本是0.7.1,與我在互聯網上找到的大多數例子不同。

有沒有什麼好的模塊可以從mp3中提取原始數據?如果eyeD3有任何良好的文檔,這也是很好的。

+0

選中此:http://stackoverflow.com/questions/3049572/how-to-convert-mp3-to-wav-in-python。顯然,最簡單的方法是使用外部程序將mp3轉換爲wav –

+2

短語「原始數據」非常混亂。如果你說原始數據,我認爲你想獲得文件的字節。 (你用'open('your.mp3','rb')''得到的)但我認爲你不想要這種原始數據。 – Kritzefitz

+0

我想要那種原始數據 - 文件的字節。但是沒有文件的所有字節都是音樂的內容。還有一些標籤,也許還有其他一些標籤。所以我想知道是否有任何模塊可以提取它。@ IchUndNichtDu – zhangyangyu

回答

10

如果我理解你的問題,你可以嘗試使用pydub(我寫了一個庫),以獲得像這樣的音頻數據:

from pydub import AudioSegment 

sound = AudioSegment.from_mp3("test.mp3") 

# sound._data is a bytestring 
raw_data = sound._data 
+1

謝謝,優秀的模塊。 – zhangyangyu

3

您是否試過在讀取二進制模式下打開文件?

f = open("test.mp3", "rb") 
first16bytes = f.read(16) 
etc... 
+1

我很確定OP想要在MP3中編碼的音頻數據。在這種情況下,mp3在讀取之前需要被解碼。 – Jiaaro

+0

@Jiaaro你應該發表一個答案解釋 – Stephan

2

有漂浮計算器幾個類似的問題。有不同的用例。

  1. 用戶想將.mp3文件轉換爲PCM文件,如.wav文件。

  2. 用戶想要訪問.mp3文件中的原始數據(即,不將其視爲壓縮的PCM)。這裏的用例是瞭解MP3和AAC等壓縮方案的工作原理之一。

這個答案是針對第二個,雖然我沒有工作代碼分享或指向。

諸如MP3之類的壓縮方案通常在頻域中工作。作爲一個簡化示例,您可以一次採集一個.wav文件1024個樣本,使用FFT對1024個樣本中的每個塊進行變換,然後將其存儲起來。粗略地說,有損壓縮然後丟棄來自頻域的信息以允許較小的編碼。

純粹的python實現是非常不切實際的,如果你所要做的只是從.mp3轉換爲.wav。但是如果你想探索.mp3和相關方案是如何工作的,即使代碼運行速度比ffmpeg慢1000倍,你可以輕鬆地修改一些東西,這實際上可能是有用的,特別是如果以允許閱讀源代碼以瞭解.mp3壓縮如何工作。例如,請參閱http://bugra.github.io/work/notes/2014-07-12/discre-fourier-cosine-transform-dft-dct-image-compression/以獲取IPython工作簿,瞭解如何在JPEG等圖像壓縮方案中使用頻域轉換。類似MP3壓縮和類似的東西對於學習壓縮的人來說是有用的。

.mp3文件基本上是一系列MP3幀,每個幀都有一個標題和數據組件。接下來的第一項任務是編寫一個Python類(或多個類)來表示這些類,並從.mp3文件中讀取它們。首先在現代機器上以二進制模式(即f = open(filename,「rb」)和data = f.read())讀取文件,因爲.mp3中典型的5min歌曲大約爲5MB,你可能只是一口氣讀完整件事情)。

沿着這些方向寫一個更簡單(效率更低)的編碼方案也是值得的,以探索它的工作原理,逐漸添加像MP3和AAC這樣的技巧方案。例如,將一個PCM輸入文件分成1024個樣本塊,使用FFT或DCT或其他東西,然後再返回,看看你如何得到原始數據。然後探索如何從頻率轉換版本中丟棄數據,並查看轉換回PCM數據後的效果。然後,最終的結果會很糟糕,首先,通過查看問題並查看例如MP3和AAC做的,你可以學到爲什麼這些壓縮方案按照他們的方式做事。

簡而言之,如果您的用例是「完成任務」,那麼您可能不想使用Python。另一方面,如果你的用例是「學習如何完成」的話,那就不一樣了。 (作爲一個粗略的經驗法則,在90年代的Pentium 100上進行優化組裝時可以做些什麼,在現代酷睿i5上使用Python的性能大致相同 - 類似的 - 有一個因素原始性能爲100左右,而使用Python的速度也有類似的下降)。

相關問題