C#如何确定.wav文件的长度(即持续时间)?在未压缩的情况下,我知道我需要读取wav标头,提取通道数、位数和采样率并从那里开始工作:(channels)*(bits)*(samples/s)*(seconds)=(文件大小)有没有更简单的方法-免费库或.net框架中的东西?如果.wav文件被压缩(例如使用mpeg编解码器),我该怎么办?您可能会考虑使用mciSendString(...)函数(为清楚起见省略了错误检查):usingSystem;使用系统文本;使用System.Runtime.InteropServices;namespaceSound{publicstaticclassSoundInfo{[DllImport("winmm.dll")]privatestaticexternuintmciSendString(stringcommand,StringBuilderreturnValue,intreturnLength,IntPtrwinHandle);publicstaticintGetSoundLength(stringfileName){StringBuilderlengthBuf=newStringBuilder(32);mciSendString(string.Format("open"{0}"typewaveaudioaliaswave",fileName),null,0,IntPtr.Zero);mciSendString("状态波长",lengthBuf,lengthBuf.Capacity,IntPtr.Zero);mciSendString("closewave",null,0,IntPtr.Zero);整数长度=0;int.TryParse(lengthBuf.ToString(),输出长度);返回长度;}}从http://naudio.codeplex.com/链接下载NAudio.dll然后使用这个函数publicstaticTimeSpanGetWavFileDuration(stringfileName){WaveFileReaderwf=newWaveFileReader(fileName);返回wf.TotalTime;你会得到持续时间不接受已经接受的答案,但我能够使用Microsoft.DirectX.AudioVideoPlayBack命名空间获得音频文件的持续时间(几种不同的格式,包括我当时需要的AC3)这是用于托管代码的DirectX9.0的一部分。添加对它的引用使我的代码像这样简单......FileNotFoundException("AudioFileNotFound:"&Path)EndIfEndFunction速度也很快!这是音频类的参考。在.net框架中有一个媒体播放器类:http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer_members.aspx这是一个例子:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2667714&SiteID=1&pageid=0#2685871我在上面的MediaPlayer类示例中遇到困难。播放器打开文件可能需要一些时间。在“现实世界”中,您必须注册MediaOpened事件,之后NaturalDuration才有效。在控制台应用程序中,您只需在打开后等待几秒钟。使用系统;使用系统文本;使用System.Windows.Media;使用System.Windows;namespaceConsoleApplication2{classProgram{staticvoidMain(string[]args){if(args.Length==0)return;Console.Write(args[0]+":");MediaPlayer播放器=newMediaPlayer();Uri路径=newUri(args[0]);player.Open(路径);TimeSpanmaxWaitTime=TimeSpan.FromSeconds(10);日期时间结束=DateTime.Now+maxWaitTime;while(DateTime.Now尝试下面的代码如何确定C#中.wav文件的长度stringpath=@"c:test.wav";WaveReaderwr=newWaveReader(File.OpenRead(path));intdurationInMS=wr.GetDurationInMS();wr.Close();是的,有一个免费的库可以用来获取音频文件的持续时间。这个库还提供了更多的功能。标签库TagLib基于GNUWideUniversal根据公共许可证(LGPL)和Mozilla公共许可证(MPL)分发。我在下面的代码中实现了使用TagLib.Mpeg以秒为单位返回持续时间;公共静态双GetSoundLength(字符串文件路径){AudioFileObjAF=newAudioFile(FilePath);returnObjAF.Properties.Duration.TotalSeconds;}如果您愿意走那条路,您可能会发现XNA库支持使用WAV等。它旨在与C#一起用于游戏编程,因此可能只处理您需要的内容。CodeProject上有一些教程(可能是您可以利用的工作代码)。您唯一需要注意的是,WAV文件由多个块组成是完全“正常”的——因此您必须扫描整个文件以确保所有块都被考虑在内。您的应用程序究竟用压缩的WAV做什么?压缩的WAV文件总是很棘手-在这种情况下,我总是尝试使用替代容器格式,例如OGG或WMA文件。XNA库往往被设计为与特定格式一起工作——尽管在XACT中您可能会发现一种更通用的wav播放方法。一个可能的替代方法是查看SDLC#端口,尽管我只用它来播放未压缩的WAV——打开后,您可以查询样本计数以确定长度。我不得不说MediaInfo,我已经将它用于音频/视频编码应用程序一年多了,而且我正在研究它。它提供有关wav文件和几乎所有其他格式的所有信息。MediaInfoDll附带有关如何使其工作的示例C#代码。我假设您对.WAV文件的结构比较熟悉:它由一个WAVEFORMATEX标头结构和后面许多包含各种信息的其他结构(或“块”)组成。有关文件格式的更多信息,请参见维基百科。首先,迭代.wav文件并添加“数据”块的未填充长度(“数据”块包含文件的音频数据;通常只有一个,但也可能不止一个)。您现在拥有音频数据的总大小(以字节为单位)。接下来,获取文件WAVEFORMATEX标头结构的“每秒平均字节数”成员。最后,将音频数据的总大小除以每秒的平均字节数-这将为您提供文件的持续时间(以秒为单位)。这对未压缩和压缩文件都非常有效。time=FileLength/(采集率*通道*每个采集位数/8)'TypeByteOffsetDescription'Dword0AlwaysASCII"RIFF"'Dword4该值之后文件中的字节数(=FileSize-8)'Dword8AlwaysASCII"WAVE"'FormatChunk'TypeByteOffsetDescription'Dword12AlwaysASCII"fmt"'Dword16此值之后此块中的字节数'Word20数据格式PCM=1(即线性量化)'Word22通道单声道=1,立体声=2'Dword24每秒采样率例如8000,44100'Dword每秒28字节速率(=采样率*通道数*(每个样本位数/8))'字32块对齐(=通道数*(每个样本位数/8))'字每个样本34位,例如8,16'DataChunk'TypeByteOffsetDescription'Dword36AlwaysASCII"data"'Dword40声音da的字节数ta(Samples*Channels*(BitsPerSample/8))'Buffer44声音数据DimHeaderData(43)AsBytePrivateAudioFileReferenceAsStringPublicSubNew(ByValAudioFileReferenceAsString)TryMe.HeaderData=Read(AudioFileReference,0,Me.HeaderData.Length)CatchExceptionAsExceptionThrowEndTry'ValidatefileformatDimEncoderAsNewUTF8Encoding()If"RIFF"Encoder.GetString(BlockCopy(Me.HeaderData,0,4))或_"WAVE"编码器.GetString(BlockCopy(Me.HeaderData,8,4))或_"fmt"Encoder.GetString(BlockCopy(Me.HeaderData,12,4))或_"data"Encoder.GetString(BlockCopy(Me.HeaderData,36,4))或_16ToUInt32(BlockCopy(Me.HeaderData,16,4),0)或_1ToUInt16(BlockCopy(Me.HeaderData,20,2),0)_ThenThrowNewInvalidDataException("InvalidPCMWAVfile")EndIfMe.AudioFileReference=AudioFileReferenceEndSubReadOnlyPropertyChannels()AsIntegerGetReturnToUInt16(BlockCopy(Me.HeaderData,22,2),0)'mono=1,stereo=2EndGetEndPropertyReadOnlyPropertySampleRate()AsIntegerGetReturnToUInt32(BlockCopy(Me.HeaderData,24,4),0)'每秒EndGetEndPropertyReadOnlyPropertyByteRate()AsIntegerGetReturnToUInt32(BlockCopy(Me.HeaderData),28,4),0)'采样率*通道*(每通道位数/8)EndGetEndPropertyReadOnlyPropertyBlockAlign()AsIntegerGetReturnToUInt16(BlockCopy(Me.HeaderData,32,2),0)'通道*(每个样本的位数/8)EndGetEndPropertyReadOnlyPropertyBitsPerSample()AsIntegerGetReturnToUInt16(BlockCopy(Me.HeaderData,34,2),0)EndGetEndPropertyReadOnlyPropertyDuration()AsIntegerGetDimSizeAsDouble=ToUInt32(BlockCopy(Me.HeaderData,40,4),0)DimByteRateAsDouble=ToUInt32(BlockCopy(Me.HeaderData,28,4),0)ReturnCeiling(Size/ByteRate)EndGetEnd属性PublicSubPlay()TryMy.Computer.Audio.Play(Me.AudioFileReference,AudioPlayMode.Background)CatchExceptionAsExceptionThrowEnd尝试EndSubPublicSubPlay(playModeAsAudioPlayMode)TryMy.Computer.Audio.Play(Me.AudioFileReference,playMode)CatchExceptionAsExceptionThrowEndTryEndSub私有函数读取(AudioFileReferenceAsString,ByValOffsetAsLong,ByValBytesAsLong)AsByte()DiminputFileAsSystem.IO.FileStream尝试inputFile=IO.File.Open(AudioFileReference,IO.FileMode.Open)CatchExceptionAsFileNotFoundExceptionThrowNewFileNotFoundException("PCMWAVfilenotfound")CatchExceptionAs异常抛出结束尝试DimBytesReadAsLongDimBuffer(Bytes-1)AsByteTryBytesRead=inputFile.Read(Buffer,Offset,Bytes)CatchExceptionAsExceptionThrow最后尝试inputFile.Close()CatchExceptionAsException'Eatthesecondexception以免屏蔽之前的exceptionEndTryEndTryIfBytesRead从以下位置下载“PresentationCore.dll”和“WindowsBase.dll”:http://www.search-dll.com/dll-files/download/windowsbase.dll.html将文件粘贴到应用程序bin文件夹中以提供参考它现在应该工作。以上就是C#学习教程:C#中如何确定.wav文件的长度(即时长)?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
