it-swarm-eu.dev

Jak mohu zjistit délku (tj. Trvání) souboru WAV v C #?

V nekomplikované situaci vím, že potřebuji číst záhlaví wav, vytáhnout počet kanálů, bitů a vzorkovací frekvenci a pracovat odtud: (kanály) * (bity) * (vzorky/s) * (sekundy) = (velikost souboru)

Existuje snadnější způsob - bezplatná knihovna, nebo něco v rámci .net?

Jak bych to udělal, kdyby byl soubor WAV komprimován (například s kodekem mpeg)?

26
John Sibly

Můžete zvážit použití funkce mciSendString (...) (z důvodu jasnosti je vynechána kontrola chyb):

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;
        }
    }
}
18
Jan Zich

Ke stažení NAudio.dll Z odkazu http://naudio.codeplex.com/

a potom použijte tuto funkci

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

dostanete Trvání

29
Monti Pal

Nebereme-li nic od odpovědi, kterou jsme již přijali, ale byl jsem schopen získat délku zvukového souboru (několik různých formátů, včetně AC3, což je to, co jsem v té době potřeboval) pomocí oboru názvů Microsoft.DirectX.AudioVideoPlayBack. Toto je součástí DirectX 9.0 pro Managed Code . Přidáním odkazu na tento kód byl můj kód tak jednoduchý jako tento ...

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

A je to taky rychlé! Zde je odkaz na Audio class.

5
Josh Stodola
3
Cetra

Ano, existuje bezplatná knihovna, kterou lze použít k získání doby trvání zvukového souboru. Tato knihovna také poskytuje mnoho dalších funkcí.

TagLib

TagLib je distribuován pod GNU Lesser General Public License (LGPL) a Mozilla Public License (MPL).

Implementoval jsem pod kód, který vrací dobu trvání v sekundách.

using TagLib.Mpeg;

public static double GetSoundLength(string FilePath)
{
    AudioFile ObjAF = new AudioFile(FilePath);
    return ObjAF.Properties.Duration.TotalSeconds;
}
2
Manish Nayak

Měl jsem potíže s příkladem výše uvedené třídy MediaPlayer. Může to chvíli trvat, než hráč soubor otevře. V "reálném světě" se musíte zaregistrovat na akci MediaOpened, poté, co to vystřelilo, je NaturalDuration platný. V aplikaci konzole musíte počkat několik sekund po otevření.

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();
    }
  }
}
2
Lars

Zkuste kód níže z Jak určit délku souboru WAV v C #

    string path = @"c:\test.wav";
    WaveReader wr = new WaveReader(File.OpenRead(path));
    int durationInMS = wr.GetDurationInMS();
    wr.Close();
2
Aleks

Budu muset říct MediaInfo , používám ji více než rok s aplikací pro kódování zvuku a videa, na které pracuji. To dává všechny informace pro soubory wav spolu s téměř každý jiný formát.

MediaInfoDll Dodává se s ukázkovým kódem C # o tom, jak pracovat.

1
sieben

Možná zjistíte, že XNA knihovna má nějakou podporu pro práci s WAV atd., Pokud jste ochotni jít touto cestou. Je navržen pro práci s C # pro programování her, takže se může postarat o to, co potřebujete.

1
xan

Tam je trochu tutoriálu (s - pravděpodobně - pracovní kód můžete využít) přes na CodeProject .

Jediné, co musíte být trochu opatrní, je to, že je naprosto „normální“, aby se soubor WAV skládal z více kusů - takže musíte celý soubor prohledat, abyste se ujistili, že všechny kusy jsou účtovány.

1
moobaa

Co přesně dělá vaše aplikace s komprimovanými WAVs? Komprimované soubory WAV jsou vždy složité - v tomto případě se vždy snažím použít alternativní formát kontejneru, například soubory OGG nebo WMA. Knihovny XNA mají tendenci být navrženy tak, aby fungovaly se specifickými formáty - i když je možné, že v rámci XACT najdete obecnější způsob přehrávání wav. Možnou alternativou je podívat se na port SDL C #, i když jsem ho použil pouze pro přehrávání nekomprimovaných souborů WAV - po otevření můžete dotazovat počet vzorků, abyste určili délku.

1
Bubba

jsem testoval blew kód by selhal, formáty souborů jsou jako "ip rir".

 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;
    }
}

zatímco naudio pracuje

    public static int GetSoundLength(string fileName)
     {
        using (WaveFileReader wf = new WaveFileReader(fileName))
        {
            return (int)wf.TotalTime.TotalMilliseconds;
        }
     }`
0
item.wu

Předpokládám, že jste se seznámili se strukturou souboru .WAV: obsahuje strukturu hlavičky WAVEFORMATEX následovanou řadou dalších struktur (nebo "kousků"), které obsahují různé druhy informací. Viz Wikipedia pro více informací o formátu souboru.

Nejdříve proveďte iteraci pomocí souboru .wav a sčítejte nezaškrtnuté délky "datových" kusů ("datový" kus obsahuje zvuková data pro soubor, obvykle je pouze jeden z nich, ale je možné, že by mohlo být víc než jeden). Nyní máte celkovou velikost zvukových dat v bajtech.

Dále získat člen "průměrné bajty za sekundu" WAVEFORMATEX záhlaví struktury souboru.

Nakonec rozdělte celkovou velikost zvukových dat průměrnými bajty za sekundu - to vám poskytne dobu trvání souboru v sekundách.

To funguje poměrně dobře pro nekomprimované a komprimované soubory.

0
GogglesPisano

time = Délka souboru/(Vzorkovací frekvence * Kanály * Bity na vzorek/8)

0
Martin Abilev