如何在.NET中檢索MP3的持續時間?



c# naudio (4)

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

任何圖書館我應該使用? 或者是僅僅使用.NET框架?


[我自己的解決方案]

我已經添加了第二個mediaelement控件,用於打開列錶框中的每個mp3文件並獲取NaturalDuration。 打開並關閉列表中的每個文件,並將所有值相加。

正如其他人所說,mp3標題不准確。 媒體提供正確的持續時間。

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



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

讓我首先重申為什麼上面的標準方法不起作用:

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

通過閱讀一個幀估計*文件大小:不會為VBR文件工作。

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

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

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

馬克建議我刪除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;
    }

我包裝了mp3解碼器庫,並將它提供給.net開發者。 你可以在這裡找到它:

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

包括將mp3文件轉換為PCM的示例,以及讀取ID3標籤。

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





mp3