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



c# naudio (4)

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

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

https://code.i-harness.com


幾年前,我終於為此寫了自己的東西。 你可以用Flash寫一個有效的客戶端。 我記得的關鍵點是:

  1. 你不能依靠MP3頭是準確的,所以不要只是讀取,以獲得持續時間
  2. 在閃存中,尋找MP3的結尾,然後讀取當前位置。 這會給你的持續時間。

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


[我自己的解決方案]

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

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

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


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

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

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

我想這可以用來正確計算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