it-swarm-tr.com

Bir .wav dosyasının uzunluğunu (örneğin süresini) C # ile nasıl belirleyebilirim?

Sıkıştırılmamış durumda, wav başlığını okumam, kanal sayısını, bitleri ve örnekleme oranını çıkarmam ve oradan çalışmam gerektiğini biliyorum: (kanallar) * (bitler) * (örnekler/s) * (saniye) = (dosya boyutu)

Daha basit bir yolu var mı - özgür bir kütüphane veya .net çerçevesinde belki bir şey?

.Wav dosyası sıkıştırılmışsa (örneğin mpeg kodekiyle) bunu nasıl yapardım?

26
John Sibly

MciSendString (...) işlevini kullanmayı düşünebilirsiniz (netlik için hata denetimi yapılmamıştır):

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

NAudio.dll Bağlantısını http://naudio.codeplex.com/

ve sonra bu işlevi kullanın

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

süre alacak

29
Monti Pal

Önceden kabul edilen yanıttan hiçbir şey alamadım, ancak bir ses dosyasının süresini (AC3 de dahil olmak üzere birkaç farklı biçim, o zaman ihtiyacım olan şey) Microsoft.DirectX.AudioVideoPlayBack ad alanını kullanarak alabildim. Bu, Yönetilen Kod için DirectX 9.0'ın bir parçasıdır. Buna bir referans eklemek kodumu bu kadar basitleştirdi ...

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

Ve bu da oldukça hızlı! İşte Ses sınıfı için bir referans.

5
Josh Stodola
3
Cetra

Evet, Audio dosyasının zamanını almak için kullanılabilecek ücretsiz bir kütüphane var. Bu kütüphane ayrıca daha birçok işlevsellik sunar.

TagLib

TagLib, GNU Küçük Genel Kamu Lisansı (LGPL) ve Mozilla Genel Lisansı (MPL) altında dağıtılmaktadır.

Süreyi saniye cinsinden döndüren kodu aşağıda uyguladım.

using TagLib.Mpeg;

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

Yukarıdaki MediaPlayer sınıfı örneğinde zorluklar yaşadım. Müzikçalar dosyayı açmadan önce biraz zaman alabilir. “Gerçek dünyada”, MediaOpened etkinliğine kaydolmanız gerekir, bundan sonra ateşlendiğinde NaturalDuration geçerlidir.

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

Aşağıdaki kodu deneyin: C # 'da bir .wav dosyasının uzunluğu nasıl belirlenir

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

MediaInfo diyeceğim, üzerinde çalışmakta olduğum bir ses/video kodlama uygulamasıyla bir yıldan beri kullanıyorum. Neredeyse her formatta wav dosyaları için tüm bilgileri verir.

MediaInfoDll Nasıl çalışacağına dair örnek C # kodu ile birlikte gelir.

1
sieben

XNA kütüphanesi 'nin, bu rotadan inmeye istekli iseniz, WAV vb. Oyun programlaması için C # ile çalışmak üzere tasarlanmıştır, bu yüzden sadece ihtiyacınız olanlarla ilgilenebilir.

1
xan

CodeProject adresinde biraz öğretici (muhtemelen - çalışma kodunu kullanabileceğiniz) bulabilirsiniz.

Biraz dikkatli olmanız gereken tek şey, bir WAV dosyasının birden fazla parçadan oluşmasının tamamen "normal" olması - bu yüzden tüm parçaların hesaplandığından emin olmak için dosyanın tamamını incelemelisiniz.

1
moobaa

Uygulamanızın sıkıştırılmış WAV'larla tam olarak ne işi var? Sıkıştırılmış WAV dosyaları her zaman zordur - Ben her zaman OGG veya WMA dosyaları gibi alternatif bir kap formatı kullanmaya çalışırım. XNA kütüphaneleri belirli formatlarla çalışacak şekilde tasarlanma eğilimindedir - XACT içinde daha genel bir wav oynatma yöntemi bulmanız mümkündür. Olası bir alternatif SDL C # portuna bakmaktır, ancak daha önce sıkıştırılmamış WAV'ları oynatmak için kullandım, ancak açıldığında uzunluğu belirlemek için örnek sayısını sorgulayabilirsiniz.

1
Bubba

ben patladı kod başarısız olacağını test ettim, dosya formatları "\\ ip\dir\*. wav '

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

naudio çalışırken

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

Bir .WAV dosyasının yapısına aşina olduğunuzu farz edeceğim: bir WAVEFORMATEX başlık yapısı, ardından çeşitli türlerde bilgi içeren birkaç başka yapı (veya "parça") içerir. Dosya formatı hakkında daha fazla bilgi için, bkz. Wikipedia .

İlk olarak, .wav dosyasını yineleyin ve "veri" öğelerinin ("veri" öbeği) dosyanın ses verilerini içerir; genellikle bunlardan yalnızca bir tane olur, ancak bu olabilir birden fazla). Artık, ses verilerinin bayt cinsinden toplam boyutuna sahipsiniz.

Ardından, dosyanın WAVEFORMATEX başlık yapısının "saniye başına ortalama bayt" üyesini alın.

Son olarak, ses verilerinin toplam boyutunu saniye başına ortalama bayt olarak bölün. Bu, dosyanın süresini saniye cinsinden verir.

Bu, sıkıştırılmamış ve sıkıştırılmış dosyalar için oldukça iyi çalışır.

0
GogglesPisano

time = FileLength/(Örnek Hızı * Kanallar * Örnek başına bit/8)

0
Martin Abilev