Soru C # dosyasındaki bir .wav dosyasının uzunluğunu nasıl belirleyebilirim?


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

Belki de daha basit bir yol var - ücretsiz bir kütüphane veya .net framework'ünde bir şey var mı?

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


25
2017-09-17 11:58


Menşei


Uzunluk olarak, sesin veya dosya boyutunun zamanını kastediyor musunuz? - Thomas Owens
bu uzun: | ----------------- | - nickf


Cevaplar:


MciSendString (...) işlevini kullanmayı düşünebilirsiniz (açıklık sağlamak için hata denetimi atlanı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;
        }
    }
}

17
2017-09-17 12:11



Bunu test ettim ve sıkıştırılmış bir wav ile çalıştı - teşekkürler +1 - John Sibly
Aslında bunun en sağlam çözüm olduğunu düşünüyorum. Bir MediaPlayer nesnesini yüklemeyi denediğim diğer önerilerden biri de bir saniye sürüyor ve .NET 3.5'e bağımlılık katıyor. - John Sibly
Bunu açmak için Windows 10'da kullanırken D:\Long\Path\To\WavFileWithLongName.wav 304'ten hata alıyorum mciSendString: The filename is invalid. Make sure the filename is not longer than 8 characters, followed by a period and an extension. - damian
Windows 10'daki bir hata gibi görünüyor, ancak GetShortPathName kullanarak 8 karakterlik (eski uyumlu) dosya adını edinmeyi deneyebilirsiniz. msdn.microsoft.com/en-us/library/windows/desktop/... - John Sibly
Ayrıca uzun dosya isimleriyle Windows 7'de hata 304 vardı. P / invoke GetShortPathName kullanarak kısa yol versiyonunu geçerek çözdüm. - kimphamg


İndir NAudio.dll bağlantıdan 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üreyi alacaksın


28
2017-11-18 11:49



NAudio'nun TotalTime tarafından bildirilen örneklerin aslında örneklemden daha uzun olduğunu buldum. Biçim sıkıştırılmamış olsa bile (ör. WAV) - MutantNinjaCodeMonkey
Ayrıca yükleyebilirsiniz NAudio nuget paketini indirmek yerine DLL. - Vadim Ovchinnikov


Cevabın kabulünden uzak bir şey almamak için, ancak bir ses dosyasının süresini (AC3 de dahil olmak üzere birçok farklı formatta kullanabildim) Microsoft.DirectX.AudioVideoPlayBack ad. Bu bir parçası Yönetilen Kod için DirectX 9.0. Buna bir referans eklemek benim kodumu bu kadar basit yaptı ...

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 bir referans Ses sınıf.


4
2018-01-05 22:55





.Net çerçevesinde bir mediaplayer sınıfı vardır:

http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer_members.aspx

İşte bir örnek:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2667714&SiteID=1&pageid=0#2685871


3
2017-09-17 12:10





Yukarıdaki MediaPlayer sınıfı örneğinde zorluklar yaşadım. Oyuncu dosyayı açmadan önce biraz zaman alabilir. "Gerçek dünyada" MediaOpened olayı için kayıt olmanız gerekiyor, bundan sonra NaturalDuration geçerli. Bir konsol uygulamasında, açıldıktan sonra birkaç saniye beklemeniz gerekir.

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
2017-12-28 11:54





Aşağıdaki kodu deneyin C # 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
2018-02-01 16:05





Evet, Ses dosyasının zaman süresini almak için kullanılabilecek ücretsiz bir kütüphane var. Bu kütüphane ayrıca çok daha fazla işlevsellik sağlar.

TagLib

TagLib, GNU Daha Az Genel Kamu Lisansı (LGPL) ve Mozilla Public License (MPL) altında dağıtılmaktadır.

Saniyeler içinde zaman süresini döndüren kodun altında uyguladım.

using TagLib.Mpeg;

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

2
2017-12-02 13:21





Bunu bulabilirsin XNA kitaplığı Eğer bu rotaya gitmeye istekliyseniz, WAV'larla çalışmak için biraz destek var. Oyun programlama için C # ile çalışmak üzere tasarlanmıştır, bu yüzden ihtiyacınız olan şeyleri halledebilirsiniz.


1
2017-09-17 12:02





Biraz öğretici var (muhtemelen - çalışma kodunuzu kullanabilirsiniz) CodeProject.

Dikkat etmeniz gereken tek şey, bir WAV dosyasının birden fazla parçadan oluşması için "normal" olmasının mükemmel olması. Bu nedenle, tüm parçaların hesaba katılması için tüm dosya üzerinde gezinmeniz gerekiyor.


1
2017-09-17 12:06





Uygulamanız sıkıştırılmış WAV'larla tam olarak ne yapıyor? Sıkıştırılmış WAV dosyaları her zaman zor - Ben her zaman bu durumda OGG veya WMA dosyaları gibi alternatif bir kap biçimi kullanmayı deneyin. 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ün olsa da. Olası bir alternatif SDL C # portuna bakmaktır, ancak sadece sıkıştırılmamış WAV'ları çalmak için kullandım - açıldıktan sonra uzunluğu belirlemek için numune sayısını sorgulayabilirsiniz.


1
2017-09-17 12:07





Söylemek zorundayım Medya bilgisi, Üzerinde çalışıyorum bir ses / video kodlama uygulaması ile bir yıl boyunca kullanıyordum. Hemen hemen tüm diğer formatlarla birlikte wav dosyaları için tüm bilgileri verir.

MediaInfoDll Çalışması için örnek C # kodu ile birlikte gelir.


1
2017-09-17 12:14