Как я могу определить длину (то есть продолжительность) WAV-файла в C #? - PullRequest
27 голосов
/ 17 сентября 2008

В несжатой ситуации я знаю, что мне нужно прочитать wav-заголовок, извлечь количество каналов, бит и частоту дискретизации и отработать это оттуда: (каналы) * (биты) * (сэмплы / с) * (секунды) = (размер файла)

Есть ли более простой способ - бесплатная библиотека или что-то в фреймворке .net?

Как мне это сделать, если WAV-файл сжат (например, с помощью кодека mpeg)?

Ответы [ 16 ]

29 голосов
/ 18 ноября 2011

Скачать NAudio.dll по ссылке http://naudio.codeplex.com/

и затем используйте эту функцию

public static TimeSpan GetWavFileDuration(string fileName)       
{     
    WaveFileReader wf = new WaveFileReader(fileName);
    return wf.TotalTime; 
}

Вы получите Продолжительность

19 голосов
/ 17 сентября 2008

Вы можете рассмотреть возможность использования функции 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;
        }
    }
}
5 голосов
/ 06 января 2010

Не нужно ничего отнимать от уже принятого ответа, но я смог получить длительность аудиофайла (несколько разных форматов, включая AC3, который мне был нужен в то время), используя пространство имен Microsoft.DirectX.AudioVideoPlayBack. Это часть DirectX 9.0 для управляемого кода . Добавление ссылки сделало мой код таким же простым, как этот ...

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 .

3 голосов
/ 17 сентября 2008
2 голосов
/ 02 декабря 2016

Да, есть бесплатная библиотека, которую можно использовать для определения продолжительности аудио файла. Эта библиотека также предоставляет множество других функций.

TagLib

TagLib распространяется под лицензией GNU Lesser General Public License (LGPL) и Mozilla Public License (MPL).

Я реализовал приведенный ниже код, который возвращает продолжительность времени в секундах.

using TagLib.Mpeg;

public static double GetSoundLength(string FilePath)
{
    AudioFile ObjAF = new AudioFile(FilePath);
    return ObjAF.Properties.Duration.TotalSeconds;
}
2 голосов
/ 01 февраля 2014

Попробуйте приведенный ниже код из Как определить длину WAV-файла в C #

    string path = @"c:\test.wav";
    WaveReader wr = new WaveReader(File.OpenRead(path));
    int durationInMS = wr.GetDurationInMS();
    wr.Close();
2 голосов
/ 28 декабря 2008

У меня были трудности с примером MediaPlayer-класса выше. Это может занять некоторое время, прежде чем игрок открыл файл. В «реальном мире» вы должны зарегистрироваться на событие MediaOpened, после того, как это произойдет, NaturalDuration действует. В консольном приложении вам просто нужно подождать несколько секунд после открытия.

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();
    }
  }
}
1 голос
/ 17 сентября 2008

Я должен сказать, MediaInfo , я использую его более года с приложением для кодирования аудио / видео, над которым я работаю. Он предоставляет всю информацию для файлов WAV, а также почти во всех других форматах.

MediaInfoDll Поставляется с примером кода C # о том, как заставить его работать.

1 голос
/ 17 сентября 2008

Что именно ваше приложение делает со сжатыми WAV? Сжатые файлы WAV всегда сложны - я всегда пытаюсь использовать альтернативный формат контейнера в этом случае, например файлы OGG или WMA. Библиотеки XNA, как правило, предназначены для работы с конкретными форматами - хотя возможно, что в XACT вы найдете более общий метод воспроизведения wav. Возможная альтернатива - заглянуть в порт SDL C #, хотя я когда-либо использовал его только для воспроизведения несжатых WAV - после открытия вы можете запросить количество выборок, чтобы определить длину.

1 голос
/ 17 сентября 2008

Есть немного учебника (с - предположительно - рабочим кодом, который вы можете использовать) в CodeProject .

Единственное, с чем вам следует быть осторожным, это то, что файл WAV, состоящий из нескольких фрагментов, является совершенно «нормальным», поэтому вам нужно пролистать весь файл, чтобы обеспечить учет всех фрагментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...