2010-08-17 71 views
4

在Framework中或通過使用P/Invoke來確定保存在MemoryStream中的wav文件的持續時間,有沒有辦法?從MemoryStream中打開音頻(wav)文件以確定持續時間

我已經看過Managed DirectX和另一個similar question,但似乎一切都適用於路徑,而不是提供任何方式來傳遞流。我所引用的問題(A simple C# Wave editor ....)中的一個鏈接很清楚我可以用解析MemoryStream來確定wav文件的持續時間。理想情況下,我想不重新發明輪子。

回答

6

我同意亞歷克斯。 我花了很長時間把一個小程序放在一起,上面有三行代碼,用來顯示wav文件的持續時間。

 var stream=new MemoryStream(File.ReadAllBytes("test.wav")); 
     var wave = new WaveFileReader(stream); 
     Console.WriteLine(wave.TotalTime); // wave.TotalTime -> TimeSpan 

下載NAudio庫:您會在包中找到NAudio.dll。

只需在您的項目中引用NAudio.dll。

在撰寫本文時,它的版本爲1.3。

就像作者在他的博客上所說的,WaveFileReader接受Stream;不只是一個文件路徑。

請記住,版本1.3是爲x86構建的。如果你想讓它在x64上工作,你需要強制你的項目到x86。 如果你想爲x64使用NAudio.dll(像我一樣),你需要用'any cpu'重新編譯。 對我來說,這兩種解決方案都像魅力一樣工作。

0

嘗試以下計算

streamsize可== headerSizeIfAny + playTime內容*採樣* singleSampleSize - >

playTime內容=(streamsize可[字節] - headerSizeIfAny)/(採樣* singleSampleSize [字節[每秒採樣] ])

+0

除非我解析文件,否則計算對我來說完全沒用。儘管我已經說得很清楚,但我寧願不重新發明輪子。「實際上,就我的目的而言,編寫解析wav文件的代碼是不起步的。 – Rob 2010-09-01 15:10:39

+0

@Rob:這個計算應該沒有任何解析,文件的比特率必須可以訪問,而無需閱讀wav本身我非常確定,因爲Windows資源管理器可以告訴我比特率。我認爲你可能能夠調用/調用文件屬性來挖掘它,也許沒有p/invoke甚至500k文件,沒有標題,具有100k比特率,這是每秒的速率= 5秒。 – 2010-09-01 15:18:17

+0

@Jimmy,對不起,我真的不是。無論多麼簡單,我都不想做任何*計算。我之後我可以給一個記憶流,它會告訴我裏面的wav的持續時間。計算音頻文件的持續時間並不是我的代碼,所以我不會開始=)現在,Explorer(Win7反正)告訴我持續時間,以及比特率,使得比特率對我更無用;-) – Rob 2010-09-01 17:40:31

0

檢查了這一點:

http://www.sonicspot.com/guide/wavefiles.html

typedef struct { 
    WORD wFormatTag; 
    WORD nChannels; 
    DWORD nSamplesPerSec; 
    DWORD nAvgBytesPerSec; 
    WORD nBlockAlign; 
    WORD wBitsPerSample; 
    WORD cbSize;} WAVEFORMATEX; 

所以,你有你的MemoryStream ...尋求爲0x10(跳過裏夫頭)+ 0×08(用於格式頭)= 24

,你在結構上面。

使用stream.ReadInt16()stream.ReadInt32()來讀取想要的結構成員。

然後,找到54,讀一個DWORD,並且很多字節是您的示例數據。

然後根據這些變量計算出你的持續時間。

注意:這隻適用於存儲在您的存儲流中的SIMPLEST PCM波形文件。對於其他人,您必須尊重標題並正確解析它們,找到數據塊並根據其大小計算持續時間。

相關問題