我已經構建了一個WPF應用程序,用戶可以將MP3文件拖放到列表框中。我需要一種方法來計算播放列表的總持續時間。如何在.NET中檢索MP3的持續時間?
我應該使用的任何庫?或者是否有可能只使用.NET框架?
我已經構建了一個WPF應用程序,用戶可以將MP3文件拖放到列表框中。我需要一種方法來計算播放列表的總持續時間。如何在.NET中檢索MP3的持續時間?
我應該使用的任何庫?或者是否有可能只使用.NET框架?
經過大量的理論研究,我找到了一種正確無誤地計算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;
}
順便說一下,它在不到一分鐘的時間內計算了9天18小時的文件確切持續時間(事實上,它會像磁盤讀取文件一樣快,因爲它使用非常小的CPU)。 – 2012-11-07 12:43:40
幾年前我最終爲此寫了自己的作品。你可以使用flash寫一個有效的客戶端。我記住的關鍵點是:
編輯:我意識到你想用.Net做到這一點,但在將文件上傳到服務器之前知道客戶端實際上可能更有用,就好像你希望對文件長度施加限制一樣,你可以在這個過程中儘早做到這一點。
閃光燈的提示將在未來派上用場,因爲我過去不得不處理它,而且確實遇到了錯誤的持續時間讀數,這會弄亂洗滌器。謝謝! – 2008-12-20 13:30:19
[我自己的解決方案]
我已經添加了第二MediaElement控件,我用在列表框中打開每個MP3文件的,並得到它的NaturalDuration。打開並關閉列表中的每個文件並將所有值相加。
正如別人所說,mp3標題不準確。 mediaelement提供正確的持續時間。
這可能不是最快的方法,但在我的情況下最簡單的(它不依賴於其他庫)。
我包裝了mp3解碼器庫,並使其可用於.net開發人員。你可以在這裏找到它:
http://sourceforge.net/projects/mpg123net/
包括對MP3文件轉換爲PCM,並讀取ID3標籤的樣本。
我想它可以用來正確計算MP3文件的持續時間。
答案顯示在2015年的最簡單的方法:http://stackoverflow.com/a/34518350/1860652 – AlexFoxGill 2016-11-08 11:21:36