2008-12-20 75 views
6

我已經構建了一個WPF應用程序,用戶可以將MP3文件拖放到列表框中。我需要一種方法來計算播放列表的總持續時間。如何在.NET中檢索MP3的持續時間?

我應該使用的任何庫?或者是否有可能只使用.NET框架?

+0

答案顯示在2015年的最簡單的方法:http://stackoverflow.com/a/34518350/1860652 – AlexFoxGill 2016-11-08 11:21:36

回答

15

經過大量的理論研究,我找到了一種正確無誤地計算mp3文件持續時間的方法。

首先,讓我再次重申,爲什麼標準以上方法都不行:

ID3方法:不是所有的文件都具有ID3標籤,如果他們有,他們可能沒有時間字段設置它。

通過讀取一個幀估計*文件大小:不適用於VBR文件。

興頭:不是所有的文件都有。

解碼和確定它通過PCM大小:我有3 + GB文件,我不會等到它解碼。

我到處讀書,所有事情都導致NAudio。馬克,謝謝你的努力和乾淨的來源!但是,大多數NAudio建議的方法是使用Mp3FileReader讀取文件並獲取所有幀。問題:Mp3FileReader在開始時創建一個TOC,這需要永遠的,即使對於只有一天的小文件:)

Mark建議我刪除TOC創建,因爲源可用,並且在做這件事時,我發現更簡單方法。這裏是;是不言自明的:從後重復

double GetMediaDuration(string MediaFilename) 
    { 
     double duration = 0.0; 
     using (FileStream fs = File.OpenRead(MediaFilename)) 
     { 
      Mp3Frame frame = Mp3Frame.LoadFromStream(fs); 
      if (frame != null) 
      { 
       _sampleFrequency = (uint)frame.SampleRate; 
      } 
      while (frame != null) 
      { 
       if (frame.ChannelMode == ChannelMode.Mono) 
       { 
        duration += (double)frame.SampleCount * 2.0/(double)frame.SampleRate; 
       } 
       else 
       { 
        duration += (double)frame.SampleCount * 4.0/(double)frame.SampleRate; 
       } 
       frame = Mp3Frame.LoadFromStream(fs); 
      } 
     } 
     return duration; 
    } 
+0

順便說一下,它在不到一分鐘的時間內計算了9天18小時的文件確切持續時間(事實上,它會像磁盤讀取文件一樣快,因爲它使用非常小的CPU)。 – 2012-11-07 12:43:40

3

看一看

我已經取得了一些成功使用這兩種。

+0

嗯看起來很有趣,會給它一個嘗試,看看它是否回答我的要求。謝謝! – 2008-12-20 10:35:16

1

幾年前我最終爲此寫了自己的作品。你可以使用flash寫一個有效的客戶端。我記住的關鍵點是:

  1. ,你不能依靠MP3頭是準確的,所以不要只是讀,要得到持續時間閃光燈
  2. ,尋求結束MP3,然後讀取當前位置。這會給你的持續時間。

編輯:我意識到你想用.Net做到這一點,但在將文件上傳到服務器之前知道客戶端實際上可能更有用,就好像你希望對文件長度施加限制一樣,你可以在這個過程中儘早做到這一點。

+0

閃光燈的提示將在未來派上用場,因爲我過去不得不處理它,而且確實遇到了錯誤的持續時間讀數,這會弄亂洗滌器。謝謝! – 2008-12-20 13:30:19

1

[我自己的解決方案]

我已經添加了第二MediaElement控件,我用在列表框中打開每個MP3文件的,並得到它的NaturalDuration。打開並關閉列表中的每個文件並將所有值相加。

正如別人所說,mp3標題不準確。 mediaelement提供正確的持續時間。

這可能不是最快的方法,但在我的情況下最簡單的(它不依賴於其他庫)。

2

我包裝了mp3解碼器庫,並使其可用於.net開發人員。你可以在這裏找到它:

http://sourceforge.net/projects/mpg123net/

包括對MP3文件轉換爲PCM,並讀取ID3標籤的樣本。

我想它可以用來正確計算MP3文件的持續時間。

相關問題