在未压缩的情况下,我知道我需要读取wav标头,拉出通道数,位数和采样率并从那里开始工作:(通道)*(位)*(样本/ s)*(秒) =(filesize)
有没有更简单的方法 - 一个免费的库,或者.net框架中的某些东西?
如果压缩.wav文件(例如使用mpeg编解码器),我该怎么做?
从http://naudio.codeplex.com/链接下载NAudio.dll
然后使用此功能
public static TimeSpan GetWavFileDuration(string fileName) { WaveFileReader wf = new WaveFileReader(fileName); return wf.TotalTime; }
你会得到持续时间
您可以考虑使用mciSendString(...)函数(为清晰起见,省略了错误检查):
using System; using System.Text; using System.Runtime.InteropServices; namespace Sound { public static class SoundInfo { [DllImport("winmm.dll")] private static extern uint mciSendString( string command, StringBuilder returnValue, int returnLength, IntPtr winHandle); public static int GetSoundLength(string fileName) { StringBuilder lengthBuf = new StringBuilder(32); mciSendString(string.Format("open \"{0}\" type waveaudio alias wave", fileName), null, 0, IntPtr.Zero); mciSendString("status wave length", lengthBuf, lengthBuf.Capacity, IntPtr.Zero); mciSendString("close wave", null, 0, IntPtr.Zero); int length = 0; int.TryParse(lengthBuf.ToString(), out length); return length; } } }
不要接受已经接受的答案,但我能够使用Microsoft.DirectX.AudioVideoPlayBack
命名空间获得音频文件的持续时间(几种不同的格式,包括AC3,这是我当时需要的) .这是DirectX 9.0 for Managed Code的一部分.添加对它的引用使我的代码像这样简单......
Public Shared Function GetDuration(ByVal Path As String) As Integer If File.Exists(Path) Then Return CInt(New Audio(Path, False).Duration) Else Throw New FileNotFoundException("Audio File Not Found: " & Path) End If End Function
而且它也很快!这是Audio类的参考.