как я могу определить длину (то есть продолжительность) wav-файла в c #?

<p>в несжатой ситуации я знаю, что мне нужно прочитать wav-заголовок, извлечь количество каналов, бит и частоту дискретизации и обработать их оттуда: (каналы) * (биты) * (сэмплы/с) * (секунд) = (размер файла)</p><p>есть ли более простой способ - бесплатная библиотека или что-то в фреймворке .net?</p><p>как мне это сделать, если файл .wav сжимается (например, с помощью кодека mpeg)?</p>

<p>вы можете рассмотреть возможность использования функции mcisendstring (...) (проверка ошибок для ясности опущена):</p><pre><code>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; } } } </code></pre>

<p>загрузите файл naudio.dll по ссылке <a href="http://naudio.codeplex.com/">http://naudio.codeplex.com/</a> </p><p>а затем использовать эту функцию</p><pre><code>public static timespan getwavfileduration(string filename) { wavefilereader wf = new wavefilereader(filename); return wf.totaltime; } </code></pre><p>вы получите продолжительность</p>

<p>не отнимать ничего от уже принятого ответа, но я смог получить длительность аудиофайла (несколько разных форматов, включая ac3, что мне было нужно в то время), используя пространство имен <code>microsoft.directx.audiovideoplayback</code>. это часть <a href="http://msdn.microsoft.com/en-us/library/bb318658(vs.85).aspx">directx 9.0 для управляемого кода</a> . добавление ссылки сделало мой код таким простым ...</p><pre><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 </code></pre><p>и это тоже довольно быстро! вот ссылка на класс <a href="http://msdn.microsoft.com/en-us/library/bb324224(vs.85).aspx">audio</a> .</p>

<p>в .net framework есть класс медиаплеера:</p><p> <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer\_members.aspx">http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer\_members.aspx</a> </p><p>вот пример:</p><p> <a href="http://forums.microsoft.com/msdn/showpost.aspx?postid=2667714&siteid=1&pageid=0#2685871">http://forums.microsoft.com/msdn/showpost.aspx?postid=2667714&siteid=1&pageid=0#2685871</a> </p>

<p>да, есть бесплатная библиотека, которую можно использовать для определения продолжительности аудио файла. эта библиотека также предоставляет гораздо больше функциональных возможностей.</p><p> <a href="http://taglib.org/"><strong>taglib</strong></a> </p><p>taglib распространяется на условиях gnu малой общедоступной лицензии (lgpl) и общественной лицензии mozilla (mpl).</p><p>я реализовал ниже код, который возвращает продолжительность времени в секундах.</p><pre><code>using taglib.mpeg; public static double getsoundlength(string filepath) { audiofile objaf = new audiofile(filepath); return objaf.properties.duration.totalseconds; } </code></pre>

<p>у меня были трудности с примером mediaplayer-класса выше. это может занять некоторое время, прежде чем игрок открыл файл. в «реальном мире» вы должны зарегистрироваться для mediaopened-события, после того, как оно запущено, naturalduration действует ........ в консольном приложении вам просто нужно подождать несколько секунд после открытия.</p><pre><code>using system; using system.text; using system.windows.media; using system.windows; namespace consoleapplication2 { class program { static void main(string[] args) { if (args.length == 0) return; console.write(args[0] + ": "); mediaplayer player = new mediaplayer(); uri path = new uri(args[0]); player.open(path); timespan maxwaittime = timespan.fromseconds(10); datetime end = datetime.now + maxwaittime; while (datetime.now < end) { system.threading.thread.sleep(100); duration duration = player.naturalduration; if (duration.hastimespan) { console.writeline(duration.timespan.tostring()); break; } } player.close(); } } } </code></pre>

<p>попробуйте код ниже из <a href="http://alvas.net/alvas.audio,tips.aspx#tip25">как определить длину wav-файла в c #</a> </p><pre><code> string path = @"c:\test.wav"; wavereader wr = new wavereader(file.openread(path)); int durationinms = wr.getdurationinms(); wr.close(); </code></pre>

<p>я должен сказать, что <a href="http://mediainfo.sourceforge.net/en">mediainfo</a> , я использую его более года с приложением для кодирования аудио/видео, над которым я работаю. он дает всю информацию для файлов wav, а также почти любой другой формат.</p><p> <a href="http://sourceforge.net/project/showfiles.php?group\_id=86862&package\_id=90614">mediainfodll</a> поставляется с примером кода c # о том, как заставить его работать.</p>

<p>вы можете обнаружить, что библиотека <a href="http://msdn.microsoft.com/en-us/xna/default.aspx">xna</a> имеет некоторую поддержку для работы с wav и т.д., если вы хотите пойти по этому пути. он предназначен для работы с c # для программирования игр, поэтому может позаботиться о том, что вам нужно.</p>

<p>есть немного учебника (с - по-видимому - рабочим кодом, который вы можете использовать) над <a href="http://www.codeproject.com/kb/audio-video/waveedit.aspx">codeproject</a> .</p><p>единственное, с чем вам следует быть осторожным, это то, что файл wav, состоящий из нескольких фрагментов, совершенно «нормален», поэтому вам нужно прокрутить весь файл, чтобы убедиться, что все фрагменты учтены.</p>

<p>что именно ваше приложение делает со сжатыми wav? сжатые wav-файлы всегда сложны - в этом случае я всегда стараюсь использовать альтернативный формат контейнера, например, файлы ogg или wma. библиотеки xna, как правило, предназначены для работы с конкретными форматами - хотя возможно, что в xact вы найдете более общий метод воспроизведения wav. возможная альтернатива - заглянуть в порт sdl c #, хотя я когда-либо использовал его только для воспроизведения несжатых wav - после открытия вы можете запросить количество выборок, чтобы определить длину.</p>

<p>я проверил блю код не получится, форматы файлов такие как \\ ip\dir\*. wav</p><pre><code> 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; } } </code></pre><p>пока наудио работает</p><pre><code> public static int getsoundlength(string filename) { using (wavefilereader wf = new wavefilereader(filename)) { return (int)wf.totaltime.totalmilliseconds; } }` </code></pre>

<p>я предполагаю, что вы немного знакомы со структурой файла .wav: он содержит структуру заголовка waveformatex, за которой следует ряд других структур (или «блоков»), содержащих различную информацию. смотрите <a href="http://en.wikipedia.org/wiki/wav">википедия</a> для получения дополнительной информации о формате файла.</p><p>во-первых, переберите файл .wav и добавьте незаполненные фрагменты «data» (блок «data» содержит аудиоданные для файла; обычно есть только один из них, но возможно, что больше одного). теперь у вас есть общий размер аудиоданных в байтах.</p><p>затем получите элемент «среднее число байт в секунду» структуры заголовка файла waveformatex.</p><p>наконец, разделите общий размер аудиоданных на среднее число байтов в секунду - это даст вам продолжительность файла в секундах.</p><p>это работает достаточно хорошо для несжатых и сжатых файлов.</p>

<p>время = filelength/(частота дискретизации * каналы * биты на выборку/8)</p>